diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000000..8013f263db --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "source/lib" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..f0627b937b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[*.py] +indent_size = 4 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..7ead58ec19 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +source/lib/* linguist-vendored +scripts/merge.js linguist-vendored diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..940ec5ad66 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,5 @@ +Before submitting an issue, please search for the issue [here](https://github.com/theme-next/hexo-theme-next/issues?utf8=%E2%9C%93&q=) to find if the issue is already reported. + +Also, you can search for answers on the [«NexT» Documentation Site](https://theme-next.org): + +- FAQs (Work in progress) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..0fc59ae96c --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,70 @@ + + +### I agree and want to create new issue + + +- [] Yes, I was on [Hexo Docs page](https://hexo.io/docs/), especially on [Templates](https://hexo.io/docs/templates.html), [Variables](https://hexo.io/docs/variables.html), [Helpers](https://hexo.io/docs/helpers.html) and [Troubleshooting](https://hexo.io/docs/troubleshooting.html). +- [] Yes, I was on [NexT Documentation Site](http://theme-next.org). +- [] And yes, I already searched for current [issues](https://github.com/theme-next/hexo-theme-next/issues?utf8=%E2%9C%93&q=is%3Aissue) and this is not help to me. + +*** + +### Expected behavior + + +### Actual behavior + + +### Steps to reproduce the behavior +1. N/A +2. N/A +3. N/A + +* Link to demo site with this issue: N/A +* Link(s) to source code or any usefull link(s): N/A + +### Node.js and NPM Information + +``` + +``` + +### Hexo Information + +``` + +``` + +### Package dependencies Information + +``` + +``` + +### NexT Information + +**NexT Version:** + +``` +[] Latest Master branch. +[] Latest Release version. +[] Old version - +``` + +**NexT Scheme:** + +``` +[] All schemes +[] Muse +[] Mist +[] Pisces +[] Gemini +``` + +### Other Information diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..0dc55ece79 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,87 @@ + + + + +## PR Checklist +**Please check if your PR fulfills the following requirements:** + +- [ ] The commit message follows [our guidelines](https://github.com/theme-next/hexo-theme-next/blob/master/.github/CONTRIBUTING.md). +- [ ] Tests for the changes have been added (for bug fixes / features). + - [ ] Muse | Mist have been tested. + - [ ] Pisces | Gemini have been tested. +- [ ] Docs have been added / updated (for bug fixes / features). + +## PR Type +**What kind of change does this PR introduce?** + +- [ ] Bugfix. +- [ ] Feature. +- [ ] Code style update (formatting, local variables). +- [ ] Refactoring (no functional changes, no api changes). +- [ ] Build related changes. +- [ ] CI related changes. +- [ ] Documentation content changes. +- [ ] Other... Please describe: + +## What is the current behavior? + + +Issue Number(s): N/A + +## What is the new behavior? +Description about this pull, in several words... + +* Screens with this changes: N/A +* Link to demo site with this changes: N/A + +### How to use? +In NexT `_config.yml`: +```yml +... +``` + +## Does this PR introduce a breaking change? +- [ ] Yes. +- [ ] No. + + + + + + diff --git a/.github/browserstack_logo.png b/.github/browserstack_logo.png new file mode 100644 index 0000000000..0be37e77e8 Binary files /dev/null and b/.github/browserstack_logo.png differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..26b5eab0b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.idea/ +*.log +*.iml +yarn.lock +package-lock.json +node_modules/ + +# Ignore optional external libraries +source/lib/* + +# Track internal libraries & Ignore unused verdors files +source/lib/font-awesome/less/ +source/lib/font-awesome/scss/ +!source/lib/font-awesome/* + +!source/lib/jquery/ + +source/lib/ua-parser-js/* +!source/lib/ua-parser-js/dist/ + +!source/lib/velocity/ diff --git a/.hound.yml b/.hound.yml new file mode 100644 index 0000000000..534bae82f9 --- /dev/null +++ b/.hound.yml @@ -0,0 +1,4 @@ +javascript: + enabled: true + config_file: .jshintrc + ignore_file: .javascript_ignore diff --git a/.javascript_ignore b/.javascript_ignore new file mode 100644 index 0000000000..ad0d1eaee7 --- /dev/null +++ b/.javascript_ignore @@ -0,0 +1,5 @@ +source/vendors/* +source/lib/* +source/js/src/affix.js +source/js/src/scrollspy.js +source/js/src/js.cookie.js diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000000..a2d0ed3c5f --- /dev/null +++ b/.jshintrc @@ -0,0 +1,27 @@ +{ + "asi": false, + "bitwise": true, + "browser": true, + "camelcase": true, + "curly": true, + "forin": true, + "immed": true, + "latedef": "nofunc", + "maxlen": 120, + "newcap": true, + "noarg": true, + "noempty": true, + "nonew": true, + "predef": [ + "$", + "jQuery", + "NexT", + "CONFIG" + ], + "quotmark": true, + "trailing": true, + "undef": true, + "unused": true, + + "expr": true +} diff --git a/.stylintrc b/.stylintrc new file mode 100644 index 0000000000..38e6ac14e2 --- /dev/null +++ b/.stylintrc @@ -0,0 +1,45 @@ +{ + "blocks": false, + "brackets": "always", + "colons": "always", + "colors": "always", + "commaSpace": "always", + "commentSpace": "always", + "cssLiteral": "never", + "customProperties": [], + "depthLimit": false, + "duplicates": true, + "efficient": "always", + "exclude": [], + "extendPref": false, + "globalDupe": false, + "groupOutputByFile": true, + "indentPref": false, + "leadingZero": "never", + "maxErrors": false, + "maxWarnings": false, + "mixed": false, + "mixins": [], + "namingConvention": "lowercase-dash", + "namingConventionStrict": false, + "none": "never", + "noImportant": true, + "parenSpace": false, + "placeholders": "always", + "prefixVarsWithDollar": "always", + "quotePref": false, + "reporterOptions": { + "columns": ["lineData", "severity", "description", "rule"], + "columnSplitter": " ", + "showHeaders": false, + "truncate": true + }, + "semicolons": "always", + "sortOrder": "grouped", + "stackedProperties": false, + "trailingWhitespace": "never", + "universal": false, + "valid": true, + "zeroUnits": "never", + "zIndexNormalize": false +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..a607f87feb --- /dev/null +++ b/.travis.yml @@ -0,0 +1,17 @@ +language: node_js +node_js: node + +cache: + directories: + - node_modules + +install: npm install + +before_script: + - npm install -g gulp + +addons: + browserstack: + username: "ivannginx1" + access_key: + secure: "NutOhdgtUdBUXMPZhy8X1F1Jq+tan1LeNOV0FArBt15SNlxtNArqhiyTi4XnG9MPruX4306aGF2RBrKso+OiGNRdGtRGngH613Q0GWNtlC/boMqnI7fHqLIyCs6S12y2uA8PK4Ifxg9bZ0VtCTYYbMy+p1KvBM//L12vmtfdnby8z5Qvex3tB3dLoPOR50CKkINHJVDLm+iVRFrdz4/83oDsulZSRRGIaxu5taDWPIcp3fYZtre2Nc+RXcsyFDyjN7U0Hvr5tKBbloJxXEQEBv2xLkMOtp85nmCPD06s1Il8Wus1ux3raVsfUyaW5FpNX37Jeb5e00RQUM1wgU5m75H6qiGwDvQswbugJG0i/a2nNfsgVmbrSZdMnkHcx2Uxmrw4ejyEP5NSrJSBi05Ck1fQ4UsZ4Qkdf1fd04SI0LpLWt43eoNO/7rHKsQoP4LCX9gxKUuC075NEBLODyJ529RYfA6dKKwwH6o0ZbOgASmCoAWaM65g4+FHRnJcKL/Kj9ZWklQtRa7/ynlHaA65jefFS2lB8Ut6d3rXDDBih9mIrwV1uUaEH96xgAN42bgU/vY6FGzNkDOYZqj4YfsepDM0wbOsslFie7JZq7iFjsYvrXqLvYUMk37AZwQ2Sb6uH4tIT4Qw/4oZfDzA1En3/8HdZJ28nKW/lzjwMSqheIY=" diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000..2bff1aceb9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,63 @@ +#
Copyright © 2017 «NexT».
+ +Detail attribution information for «NexT»
+ is contained in the 'docs/AUTHORS.md' file.
This license also available in text format.
+ +[AUTHORS]: docs/AUTHORS.md +[AGPL3]: docs/AGPL3.md +[AGPL3-7]: docs/AGPL3.md/#7-additional-terms +[AGPL3-15]: docs/AGPL3.md/#15-disclaimer-of-warranty diff --git a/README.md b/README.md index 28262a3f8a..0873069ba0 100644 --- a/README.md +++ b/README.md @@ -1 +1,88 @@ -next-public + + +# + +«NexT» is a high quality elegant Hexo theme. It is crafted from scratch, with love.
+ +[![gitter-image]][gitter-url] +[![mnt-image]][commits-url] +[![travis-image]][travis-url] +[![rel-image]][releases-url] +[![hexo-image]][hexo-url] +[![lic-image]][lic-url] + +## Live Preview + +* :heart_decoration: Muse scheme: [XiaMo](https://notes.wanghao.work) | [OAwan](https://oawan.me) | [Hui Wang](http://hui-wang.info) +* :six_pointed_star: Mist scheme: [Jeff](https://blog.zzbd.org) | [uchuhimo](http://uchuhimo.me) | [xirong](http://www.ixirong.com) +* :pisces: Pisces scheme: [Vi](http://notes.iissnan.com) | [Acris](https://acris.me) | [Rainy](https://rainylog.com) +* :gemini: Gemini scheme: [Ivan.Nginx](https://almostover.ru) | [Alynx](http://sh.alynx.xyz) | [Raincal](https://raincal.top) + +More «NexT» examples [here](https://github.com/iissnan/hexo-theme-next/issues/119). + +## Installation + +Simplest way to install is by cloning whole repository: + + ```sh + $ cd hexo + $ git clone https://github.com/theme-next/hexo-theme-next themes/next + ``` + +Or you can see [detailed installation instructions][docs-installation-url] if you want any other variant. + +## Update + +You can update to latest master branch by the following command: + +```sh +$ cd themes/next +$ git pull +``` + +And if you see any error message during update (something like **«Commit your changes or stash them before you can merge»**), recommended to learn [Hexo data files][docs-data-files-url] feature.\ +Howbeit, you can bypass update errors by `Commit`, `Stash` or `Discard` local changes. See [here](https://stackoverflow.com/a/15745424/5861495) how to do it. + +## Known Bugs + +For those who also encounter **«[Error: Cannot find module 'hexo-util'](https://github.com/iissnan/hexo-theme-next/issues/1490)»**, please check your NPM version. + +* `> 3`: Still not work? Please remove `node_modules` directory and reinstall using `npm install`. +* `< 3`: Please add `hexo-util` explicitly via `npm install --save-dev hexo-util` to you site package deps. + +## Contributing + +Contribution is welcome, feel free to open an issue and fork. Waiting for your pull request. + +## License + +«NexT» is licensed under [AGPL][lic-url]. + +[browser-image]: https://img.shields.io/badge/browser-%20chrome%20%7C%20firefox%20%7C%20opera%20%7C%20safari%20%7C%20ie%20%3E%3D%209-lightgrey.svg +[browser-url]: https://www.browserstack.com + +[gitter-image]: https://badges.gitter.im/Join%20Chat.svg +[gitter-url]: https://gitter.im/theme-next + +[travis-image]: https://travis-ci.org/theme-next/hexo-theme-next.svg?branch=master +[travis-url]: https://travis-ci.org/theme-next/hexo-theme-next?branch=master "Travis CI" + +[hexo-image]: https://img.shields.io/badge/hexo-%3E%3D%203.0-blue.svg +[hexo-url]: http://hexo.io + +[lic-image]: https://img.shields.io/badge/license-%20AGPL-blue.svg +[lic-url]: https://github.com/theme-next/hexo-theme-next/blob/master/LICENSE.md + +[rel-image]: https://img.shields.io/github/release/theme-next/hexo-theme-next.svg +[mnt-image]: https://img.shields.io/maintenance/yes/2018.svg + +[download-latest-url]: https://github.com/theme-next/hexo-theme-next/archive/master.zip +[releases-latest-url]: https://github.com/theme-next/hexo-theme-next/releases/latest +[releases-url]: https://github.com/theme-next/hexo-theme-next/releases +[tags-url]: https://github.com/theme-next/hexo-theme-next/tags +[commits-url]: https://github.com/theme-next/hexo-theme-next/commits/master + +[docs-installation-url]: https://github.com/theme-next/hexo-theme-next/blob/master/docs/INSTALLATION.md +[docs-data-files-url]: https://github.com/theme-next/hexo-theme-next/blob/master/docs/DATA-FILES.md diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000000..bc79e92a1c --- /dev/null +++ b/_config.yml @@ -0,0 +1,823 @@ +# --------------------------------------------------------------- +# Theme Core Configuration Settings +# --------------------------------------------------------------- + +# Set to true, if you want to fully override the default configuration. +# Useful if you don't want to inherit the theme _config.yml configurations. +override: false + +# Allow to cache content generation. Introduced in NexT v6.0.0. +cache: + enable: true + +# --------------------------------------------------------------- +# Site Information Settings +# --------------------------------------------------------------- + +# To get or check favicons visit: https://realfavicongenerator.net +# Put your favicons into `hexo-site/source/` (recommend) or `hexo-site/themes/next/source/images/` directory. + +# Default NexT favicons placed in `hexo-site/themes/next/source/images/` directory. +# And if you want to place your icons in `hexo-site/source/` root directory, you must remove `/images` prefix from pathes. + +# For example, you put your favicons into `hexo-site/source/images` directory. +# Then need to rename & redefine they on any other names, otherwise icons from Next will rewrite your custom icons in Hexo. +favicon: + small: /images/favicon-16x16-next.png + medium: /images/favicon-32x32-next.png + apple_touch_icon: /images/apple-touch-icon-next.png + safari_pinned_tab: /images/logo.svg + #android_manifest: /images/manifest.json + #ms_browserconfig: /images/browserconfig.xml + +# Set default keywords (Use a comma to separate) +keywords: "Hexo, NexT" + +# Set rss to false to disable feed link. +# Leave rss as empty to use site's feed link. +# Set rss to specific value if you have burned your feed already. +rss: + +footer: + # Specify the date when the site was setup. + # If not defined, current year will be used. + #since: 2015 + + # Icon between year and copyright info. + icon: user + + # If not defined, will be used `author` from Hexo main config. + copyright: + # ------------------------------------------------------------- + # Hexo link (Powered by Hexo). + powered: true + + theme: + # Theme & scheme info link (Theme - NexT.scheme). + enable: true + # Version info of NexT after scheme info (vX.X.X). + version: true + # ------------------------------------------------------------- + # Any custom text can be defined here. + #custom_text: Hosted by GitHub Pages + +# --------------------------------------------------------------- +# SEO Settings +# --------------------------------------------------------------- + +# Canonical, set a canonical link tag in your hexo, you could use it for your SEO of blog. +# See: https://support.google.com/webmasters/answer/139066 +# Tips: Before you open this tag, remember set up your URL in hexo _config.yml ( ex. url: http://yourdomain.com ) +canonical: true + +# Change headers hierarchy on site-subtitle (will be main site description) and on all post/pages titles for better SEO-optimization. +seo: false + +# If true, will add site-subtitle to index page, added in main hexo config. +# subtitle: Subtitle +index_with_subtitle: false + + +# --------------------------------------------------------------- +# Menu Settings +# --------------------------------------------------------------- + +# When running the site in a subdirectory (e.g. domain.tld/blog), remove the leading slash from link value (/archives -> archives). +# Usage: `Key: /link/ || icon` +# Key is the name of menu item. If translate for this menu will find in languages - this translate will be loaded; if not - Key name will be used. Key is case-senstive. +# Value before `||` delimeter is the target link. +# Value after `||` delimeter is the name of FontAwesome icon. If icon (with or without delimeter) is not specified, question icon will be loaded. +menu: + home: / || home + #about: /about/ || user + #tags: /tags/ || tags + #categories: /categories/ || th + archives: /archives/ || archive + #schedule: /schedule/ || calendar + #sitemap: /sitemap.xml || sitemap + #commonweal: /404/ || heartbeat + +# Enable/Disable menu icons. +menu_icons: + enable: true + + +# --------------------------------------------------------------- +# Scheme Settings +# --------------------------------------------------------------- + +# Schemes +scheme: Muse +#scheme: Mist +#scheme: Pisces +#scheme: Gemini + + +# --------------------------------------------------------------- +# Sidebar Settings +# --------------------------------------------------------------- + +# Social Links. +# Usage: `Key: permalink || icon` +# Key is the link label showing to end users. +# Value before `||` delimeter is the target permalink. +# Value after `||` delimeter is the name of FontAwesome icon. If icon (with or without delimeter) is not specified, globe icon will be loaded. +#social: + #GitHub: https://github.com/yourname || github + #E-Mail: mailto:yourname@gmail.com || envelope + #Google: https://plus.google.com/yourname || google + #Twitter: https://twitter.com/yourname || twitter + #FB Page: https://www.facebook.com/yourname || facebook + #VK Group: https://vk.com/yourname || vk + #StackOverflow: https://stackoverflow.com/yourname || stack-overflow + #YouTube: https://youtube.com/yourname || youtube + #Instagram: https://instagram.com/yourname || instagram + #Skype: skype:yourname?call|chat || skype + +social_icons: + enable: true + icons_only: false + transition: false + +# Blog rolls +links_icon: link +links_title: Links +links_layout: block +#links_layout: inline +#links: + #Title: http://example.com/ + +# Sidebar Avatar +# in theme directory(source/images): /images/avatar.gif +# in site directory(source/uploads): /uploads/avatar.gif +#avatar: /images/avatar.gif + +# Table Of Contents in the Sidebar +toc: + enable: true + + # Automatically add list number to toc. + number: true + + # If true, all words will placed on next lines if header width longer then sidebar width. + wrap: false + +# Creative Commons 4.0 International License. +# http://creativecommons.org/ +# Available: by | by-nc | by-nc-nd | by-nc-sa | by-nd | by-sa | zero +#creative_commons: by-nc-sa +#creative_commons: + +sidebar: + # Sidebar Position, available value: left | right (only for Pisces | Gemini). + position: left + #position: right + + # Sidebar Display, available value (only for Muse | Mist): + # - post expand on posts automatically. Default. + # - always expand for all pages automatically + # - hide expand only when click on the sidebar toggle icon. + # - remove Totally remove sidebar including sidebar toggle. + display: post + #display: always + #display: hide + #display: remove + + # Sidebar offset from top menubar in pixels (only for Pisces | Gemini). + offset: 12 + + # Back to top in sidebar (only for Pisces | Gemini). + b2t: false + + # Scroll percent label in b2t button. + scrollpercent: false + + # Enable sidebar on narrow view (only for Muse | Mist). + onmobile: false + + +# --------------------------------------------------------------- +# Post Settings +# --------------------------------------------------------------- + +# Automatically scroll page to section which is under mark. +scroll_to_more: true + +# Automatically saving scroll position on each post/page in cookies. +save_scroll: false + +# Automatically excerpt description in homepage as preamble text. +excerpt_description: true + +# Automatically Excerpt. Not recommend. +# Please use in the post to control excerpt accurately. +auto_excerpt: + enable: false + length: 150 + +# Post meta display settings +post_meta: + item_text: true + created_at: true + updated_at: false + categories: true + +# Post wordcount display settings +# Dependencies: https://github.com/theme-next/hexo-symbols-count-time +symbols_count_time: + separated_meta: true + item_text_post: true + item_text_total: false + awl: 5 + wpm: 200 + +# Wechat Subscriber +#wechat_subscriber: + #enabled: true + #qcode: /path/to/your/wechatqcode ex. /uploads/wechat-qcode.jpg + #description: ex. subscribe to my blog by scanning my public wechat account + +# Reward +#reward_comment: Donate comment here +#wechatpay: /images/wechatpay.jpg +#alipay: /images/alipay.jpg +#bitcoin: /images/bitcoin.png + +# Declare license on posts +post_copyright: + enable: false + license: CC BY-NC-SA 3.0 + license_url: https://creativecommons.org/licenses/by-nc-sa/3.0/ + + +# --------------------------------------------------------------- +# Misc Theme Settings +# --------------------------------------------------------------- + +# Reduce padding / margin indents on devices with narrow width. +mobile_layout_economy: false + +# Android Chrome header panel color ($black-deep). +android_chrome_color: "#222" + +# Custom Logo. +# !!Only available for Default Scheme currently. +# Options: +# enabled: [true/false] - Replace with specific image +# image: url-of-image - Images's url +custom_logo: + enabled: false + image: + +# Code Highlight theme +# Available value: +# normal | night | night eighties | night blue | night bright +# https://github.com/chriskempson/tomorrow-theme +highlight_theme: normal + + +# --------------------------------------------------------------- +# Font Settings +# - Find fonts on Google Fonts (https://www.google.com/fonts) +# - All fonts set here will have the following styles: +# light, light italic, normal, normal italic, bold, bold italic +# - Be aware that setting too much fonts will cause site running slowly +# - Introduce in 5.0.1 +# --------------------------------------------------------------- +# CAUTION! Safari Version 10.1.2 bug: https://github.com/iissnan/hexo-theme-next/issues/1844 +# To avoid space between header and sidebar in Pisces / Gemini themes recommended to use Web Safe fonts for `global` (and `logo`): +# Arial | Tahoma | Helvetica | Times New Roman | Courier New | Verdana | Georgia | Palatino | Garamond | Comic Sans MS | Trebuchet MS +# --------------------------------------------------------------- +font: + enable: false + + # Uri of fonts host. E.g. //fonts.googleapis.com (Default). + host: + + # Font options: + # `external: true` will load this font family from `host` above. + # `family: Times New Roman`. Without any quotes. + # `size: xx`. Use `px` as unit. + + # Global font settings used on element. + global: + external: true + family: Lato + size: + + # Font settings for Headlines (h1, h2, h3, h4, h5, h6). + # Fallback to `global` font settings. + headings: + external: true + family: + size: + + # Font settings for posts. + # Fallback to `global` font settings. + posts: + external: true + family: + + # Font settings for Logo. + # Fallback to `global` font settings. + logo: + external: true + family: + size: + + # Font settings for and code blocks.
+ codes:
+ external: true
+ family:
+ size:
+
+
+# ---------------------------------------------------------------
+# Third Party Services Settings
+# ---------------------------------------------------------------
+
+# MathJax Support
+mathjax:
+ enable: false
+ per_page: false
+ cdn: //cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML
+
+# Han Support
+# Dependencies: https://github.com/theme-next/theme-next-han
+han: false
+
+# Swiftype Search API Key
+#swiftype_key:
+
+# Baidu Analytics ID
+#baidu_analytics:
+
+# Duoshuo ShortName
+#duoshuo_shortname:
+
+# Disqus
+disqus:
+ enable: false
+ shortname:
+ count: true
+
+# Hypercomments
+#hypercomments_id:
+
+# changyan
+changyan:
+ enable: false
+ appid:
+ appkey:
+
+
+# Valine.
+# You can get your appid and appkey from https://leancloud.cn
+# more info please open https://valine.js.org
+valine:
+ enable: false
+ appid: # your leancloud application appid
+ appkey: # your leancloud application appkey
+ notify: false # mail notifier , https://github.com/xCss/Valine/wiki
+ verify: false # Verification code
+ placeholder: Just go go # comment box placeholder
+ avatar: mm # gravatar style
+ guest_info: nick,mail,link # custom comment header
+ pageSize: 10 # pagination size
+
+
+# Support for youyan comments system.
+# You can get your uid from http://www.uyan.cc
+#youyan_uid: your uid
+
+# Support for LiveRe comments system.
+# You can get your uid from https://livere.com/insight/myCode (General web site)
+#livere_uid: your uid
+
+# Gitment
+# Introduction: https://imsun.net/posts/gitment-introduction/
+# You can get your Github ID from https://api.github.com/users/
+gitment:
+ enable: false
+ mint: true # RECOMMEND, A mint on Gitment, to support count, language and proxy_gateway
+ count: true # Show comments count in post meta area
+ lazy: false # Comments lazy loading with a button
+ cleanly: false # Hide 'Powered by ...' on footer, and more
+ language: # Force language, or auto switch by theme
+ github_user: # MUST HAVE, Your Github ID
+ github_repo: # MUST HAVE, The repo you use to store Gitment comments
+ client_id: # MUST HAVE, Github client id for the Gitment
+ client_secret: # EITHER this or proxy_gateway, Github access secret token for the Gitment
+ proxy_gateway: # Address of api proxy, See: https://github.com/aimingoo/intersect
+ redirect_protocol: # Protocol of redirect_uri with force_redirect_protocol when mint enabled
+
+# Baidu Share
+# Available value:
+# button | slide
+# Warning: Baidu Share does not support https.
+#baidushare:
+## type: button
+
+# Share
+# This plugin is more useful in China, make sure you known how to use it.
+# And you can find the use guide at official webiste: http://www.jiathis.com/.
+# Warning: JiaThis does not support https.
+#jiathis:
+ ##uid: Get this uid from http://www.jiathis.com/
+#add_this_id:
+
+# Share
+#duoshuo_share: true
+
+# NeedMoreShare2
+# Dependencies: https://github.com/theme-next/theme-next-needmoreshare2
+# See: https://github.com/revir/need-more-share2
+# Also see: https://github.com/DzmVasileusky/needShareButton
+# iconStyle: default | box
+# boxForm: horizontal | vertical
+# position: top / middle / bottom + Left / Center / Right
+# networks: Weibo,Wechat,Douban,QQZone,Twitter,Linkedin,Mailto,Reddit,
+# Delicious,StumbleUpon,Pinterest,Facebook,GooglePlus,Slashdot,
+# Technorati,Posterous,Tumblr,GoogleBookmarks,Newsvine,
+# Evernote,Friendfeed,Vkontakte,Odnoklassniki,Mailru
+needmoreshare2:
+ enable: false
+ postbottom:
+ enable: false
+ options:
+ iconStyle: box
+ boxForm: horizontal
+ position: bottomCenter
+ networks: Weibo,Wechat,Douban,QQZone,Twitter,Facebook
+ float:
+ enable: false
+ options:
+ iconStyle: box
+ boxForm: horizontal
+ position: middleRight
+ networks: Weibo,Wechat,Douban,QQZone,Twitter,Facebook
+
+# Google Webmaster tools verification setting
+# See: https://www.google.com/webmasters/
+#google_site_verification:
+
+# Google Analytics
+#google_analytics:
+
+# Bing Webmaster tools verification setting
+# See: https://www.bing.com/webmaster/
+#bing_site_verification:
+
+# Yandex Webmaster tools verification setting
+# See: https://webmaster.yandex.ru/
+#yandex_site_verification:
+
+# CNZZ count
+#cnzz_siteid:
+
+# Application Insights
+# See https://azure.microsoft.com/en-us/services/application-insights/
+# application_insights:
+
+# Make duoshuo show UA
+# user_id must NOT be null when admin_enable is true!
+# you can visit http://dev.duoshuo.com get duoshuo user id.
+duoshuo_info:
+ ua_enable: true
+ admin_enable: false
+ user_id: 0
+ #admin_nickname: Author
+
+# Post widgets & FB/VK comments settings.
+# ---------------------------------------------------------------
+# Facebook SDK Support.
+# https://github.com/iissnan/hexo-theme-next/pull/410
+facebook_sdk:
+ enable: false
+ app_id: #
+ fb_admin: #
+ like_button: #true
+ webmaster: #true
+
+# Facebook comments plugin
+# This plugin depends on Facebook SDK.
+# If facebook_sdk.enable is false, Facebook comments plugin is unavailable.
+facebook_comments_plugin:
+ enable: false
+ num_of_posts: 10 # min posts num is 1
+ width: 100% # default width is 550px
+ scheme: light # default scheme is light (light or dark)
+
+# VKontakte API Support.
+# To get your AppID visit https://vk.com/editapp?act=create
+vkontakte_api:
+ enable: false
+ app_id: #
+ like: true
+ comments: true
+ num_of_posts: 10
+
+# Star rating support to each article.
+# To get your ID visit https://widgetpack.com
+rating:
+ enable: false
+ id: #
+ color: fc6423
+# ---------------------------------------------------------------
+
+# Show number of visitors to each article.
+# You can visit https://leancloud.cn get AppID and AppKey.
+leancloud_visitors:
+ enable: false
+ app_id: #
+ app_key: #
+
+# Another tool to show number of visitors to each article.
+# visit https://console.firebase.google.com/u/0/ to get apiKey and projectId
+# visit https://firebase.google.com/docs/firestore/ to get more information about firestore
+firestore:
+ enable: false
+ collection: articles #required, a string collection name to access firestore database
+ apiKey: #required
+ projectId: #required
+ bluebird: false #enable this if you want to include bluebird 3.5.1(core version) Promise polyfill
+
+# Show PV/UV of the website/page with busuanzi.
+# Get more information on http://ibruce.info/2015/04/04/busuanzi/
+busuanzi_count:
+ # count values only if the other configs are false
+ enable: false
+ # custom uv span for the whole site
+ site_uv: true
+ site_uv_header:
+ site_uv_footer:
+ # custom pv span for the whole site
+ site_pv: true
+ site_pv_header:
+ site_pv_footer:
+ # custom pv span for one page only
+ page_pv: true
+ page_pv_header:
+ page_pv_footer:
+
+
+# Tencent analytics ID
+# tencent_analytics:
+
+# Tencent MTA ID
+# tencent_mta:
+
+
+# Enable baidu push so that the blog will push the url to baidu automatically which is very helpful for SEO
+baidu_push: false
+
+# Google Calendar
+# Share your recent schedule to others via calendar page
+#
+# API Documentation:
+# https://developers.google.com/google-apps/calendar/v3/reference/events/list
+calendar:
+ enable: false
+ calendar_id:
+ api_key:
+ orderBy: startTime
+ offsetMax: 24
+ offsetMin: 4
+ timeZone:
+ showDeleted: false
+ singleEvents: true
+ maxResults: 250
+
+# Algolia Search
+# Dependencies: https://github.com/theme-next/theme-next-algolia-instant-search
+algolia_search:
+ enable: false
+ hits:
+ per_page: 10
+ labels:
+ input_placeholder: Search for Posts
+ hits_empty: "We didn't find any results for the search: ${query}"
+ hits_stats: "${hits} results found in ${time} ms"
+
+# Local search
+# Dependencies: https://github.com/flashlab/hexo-generator-search
+local_search:
+ enable: false
+ # if auto, trigger search by changing input
+ # if manual, trigger search by pressing enter key or search button
+ trigger: auto
+ # show top n results per article, show all results by setting to -1
+ top_n_per_article: 1
+
+
+# ---------------------------------------------------------------
+# Tags Settings
+# ---------------------------------------------------------------
+
+# External URL with BASE64 encrypt & decrypt.
+# Usage: {% exturl text url "title" %}
+# Alias: {% extlink text url "title" %}
+exturl: false
+
+# Note tag (bs-callout).
+note:
+ # Note tag style values:
+ # - simple bs-callout old alert style. Default.
+ # - modern bs-callout new (v2-v3) alert style.
+ # - flat flat callout style with background, like on Mozilla or StackOverflow.
+ # - disabled disable all CSS styles import of note tag.
+ style: simple
+ icons: false
+ border_radius: 3
+ # Offset lighter of background in % for modern and flat styles (modern: -12 | 12; flat: -18 | 6).
+ # Offset also applied to label tag variables. This option can work with disabled note tag.
+ light_bg_offset: 0
+
+# Label tag.
+label: true
+
+# Tabs tag.
+tabs:
+ enable: true
+ transition:
+ tabs: false
+ labels: true
+ border_radius: 0
+
+
+#! ---------------------------------------------------------------
+#! DO NOT EDIT THE FOLLOWING SETTINGS
+#! UNLESS YOU KNOW WHAT YOU ARE DOING
+#! ---------------------------------------------------------------
+
+# Use velocity to animate everything.
+motion:
+ enable: true
+ async: false
+ transition:
+ # Transition variants:
+ # fadeIn | fadeOut | flipXIn | flipXOut | flipYIn | flipYOut | flipBounceXIn | flipBounceXOut | flipBounceYIn | flipBounceYOut
+ # swoopIn | swoopOut | whirlIn | whirlOut | shrinkIn | shrinkOut | expandIn | expandOut
+ # bounceIn | bounceOut | bounceUpIn | bounceUpOut | bounceDownIn | bounceDownOut | bounceLeftIn | bounceLeftOut | bounceRightIn | bounceRightOut
+ # slideUpIn | slideUpOut | slideDownIn | slideDownOut | slideLeftIn | slideLeftOut | slideRightIn | slideRightOut
+ # slideUpBigIn | slideUpBigOut | slideDownBigIn | slideDownBigOut | slideLeftBigIn | slideLeftBigOut | slideRightBigIn | slideRightBigOut
+ # perspectiveUpIn | perspectiveUpOut | perspectiveDownIn | perspectiveDownOut | perspectiveLeftIn | perspectiveLeftOut | perspectiveRightIn | perspectiveRightOut
+ post_block: fadeIn
+ post_header: slideDownIn
+ post_body: slideDownIn
+ coll_header: slideLeftIn
+ # Only for Pisces | Gemini.
+ sidebar: slideUpIn
+
+# Fancybox
+# Dependencies: https://github.com/theme-next/theme-next-fancybox
+fancybox: false
+
+# Added switch option for separated repo in 6.0.0.
+# Dependencies: https://github.com/theme-next/theme-next-fastclick
+fastclick: false
+
+# Added switch option for separated repo in 6.0.0.
+# Dependencies: https://github.com/theme-next/theme-next-jquery-lazyload
+lazyload: false
+
+# Progress bar in the top during page loading.
+# Dependencies: https://github.com/theme-next/theme-next-pace
+pace: false
+# Themes list:
+#pace-theme-big-counter
+#pace-theme-bounce
+#pace-theme-barber-shop
+#pace-theme-center-atom
+#pace-theme-center-circle
+#pace-theme-center-radar
+#pace-theme-center-simple
+#pace-theme-corner-indicator
+#pace-theme-fill-left
+#pace-theme-flash
+#pace-theme-loading-bar
+#pace-theme-mac-osx
+#pace-theme-minimal
+# For example
+# pace_theme: pace-theme-center-simple
+pace_theme: pace-theme-minimal
+
+# Canvas-nest
+# Dependencies: https://github.com/theme-next/theme-next-canvas-nest
+canvas_nest: false
+
+# JavaScript 3D library.
+# Dependencies: https://github.com/theme-next/theme-next-three
+# three_waves
+three_waves: false
+# canvas_lines
+canvas_lines: false
+# canvas_sphere
+canvas_sphere: false
+
+# Only fit scheme Pisces
+# Dependencies: https://github.com/theme-next/theme-next-canvas-ribbon
+# Canvas-ribbon
+# size: The width of the ribbon.
+# alpha: The transparency of the ribbon.
+# zIndex: The display level of the ribbon.
+canvas_ribbon:
+ enable: false
+ size: 300
+ alpha: 0.6
+ zIndex: -1
+
+# Script Vendors.
+# Set a CDN address for the vendor you want to customize.
+# For example
+# jquery: https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js
+# Be aware that you should use the same version as internal ones to avoid potential problems.
+# Please use the https protocol of CDN files when you enable https on your site.
+vendors:
+ # Internal path prefix. Please do not edit it.
+ _internal: lib
+
+ # Internal version: 2.1.3
+ jquery:
+
+ # Internal version: 2.1.5
+ # See: http://fancyapps.com/fancybox/
+ fancybox:
+ fancybox_css:
+
+ # Internal version: 1.0.6
+ # See: https://github.com/ftlabs/fastclick
+ fastclick:
+
+ # Internal version: 1.9.7
+ # See: https://github.com/tuupola/jquery_lazyload
+ lazyload:
+
+ # Internal version: 1.2.1
+ # See: http://VelocityJS.org
+ velocity:
+
+ # Internal version: 1.2.1
+ # See: http://VelocityJS.org
+ velocity_ui:
+
+ # Internal version: 0.7.9
+ # See: https://faisalman.github.io/ua-parser-js/
+ ua_parser:
+
+ # Internal version: 4.6.2
+ # See: http://fontawesome.io/
+ fontawesome:
+
+ # Internal version: 1
+ # https://www.algolia.com
+ algolia_instant_js:
+ algolia_instant_css:
+
+ # Internal version: 1.0.2
+ # See: https://github.com/HubSpot/pace
+ # Or use direct links below:
+ # pace: //cdn.bootcss.com/pace/1.0.2/pace.min.js
+ # pace_css: //cdn.bootcss.com/pace/1.0.2/themes/blue/pace-theme-flash.min.css
+ pace:
+ pace_css:
+
+ # Internal version: 1.0.0
+ # https://github.com/hustcc/canvas-nest.js
+ canvas_nest:
+
+ # three
+ three:
+
+ # three_waves
+ # https://github.com/jjandxa/three_waves
+ three_waves:
+
+ # three_waves
+ # https://github.com/jjandxa/canvas_lines
+ canvas_lines:
+
+ # three_waves
+ # https://github.com/jjandxa/canvas_sphere
+ canvas_sphere:
+
+ # Internal version: 1.0.0
+ # https://github.com/zproo/canvas-ribbon
+ canvas_ribbon:
+
+ # Internal version: 3.3.0
+ # https://github.com/ethantw/Han
+ han:
+
+ # needMoreShare2
+ # https://github.com/revir/need-more-share2
+ needMoreShare2:
+
+
+# Assets
+css: css
+js: js
+images: images
+
+# Theme version
+version: 6.0.0
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000000..ee94b1a868
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,32 @@
+{
+ "name": "theme-next",
+ "version": "6.0.0",
+ "homepage": "https://theme-next.org",
+ "authors": [
+ "iissnan ",
+ "Ivan Nginx (https://almostover.ru)"
+ ],
+ "description": "Elegant theme for Hexo",
+ "repository": "https://github.com/theme-next/hexo-theme-next",
+ "keywords": [
+ "hexo",
+ "theme",
+ "NexT"
+ ],
+ "license": "AGPL",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "source/lib",
+ "test",
+ "tests",
+ "screenshots"
+ ],
+ "dependencies": {
+ "font-awesome": "fontawesome#*",
+ "jquery": "http://code.jquery.com/jquery-2.1.3.min.js",
+ "ua-parser-js": "~0.7.9",
+ "velocity": "~1.2.1"
+ }
+}
diff --git a/docs/AGPL3.md b/docs/AGPL3.md
new file mode 100644
index 0000000000..2dcf18c88a
--- /dev/null
+++ b/docs/AGPL3.md
@@ -0,0 +1,649 @@
+# GNU Affero General Public License
+
+Version 3, 19 November 2007 Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+## Preamble
+
+The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+Developers that use our General Public Licenses protect your rights
+with two steps: **(1)** assert copyright on the software, and **(2)** offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+## TERMS AND CONDITIONS
+
+### 0. Definitions
+
+“This License” refers to version 3 of the GNU Affero General Public License.
+
+“Copyright” also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+“The Program” refers to any copyrightable work licensed under this
+License. Each licensee is addressed as “you”. “Licensees” and
+“recipients” may be individuals or organizations.
+
+To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a “modified version” of the
+earlier work or a work “based on” the earlier work.
+
+A “covered work” means either the unmodified Program or a work based
+on the Program.
+
+To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays “Appropriate Legal Notices”
+to the extent that it includes a convenient and prominently visible
+feature that **(1)** displays an appropriate copyright notice, and **(2)**
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+### 1. Source Code
+
+The “source code” for a work means the preferred form of the work
+for making modifications to it. “Object code” means any non-source
+form of a work.
+
+A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The “System Libraries” of an executable work include anything, other
+than the work as a whole, that **(a)** is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and **(b)** serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+The Corresponding Source for a work in source code form is that
+same work.
+
+### 2. Basic Permissions
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+### 3. Protecting Users' Legal Rights From Anti-Circumvention Law
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+### 4. Conveying Verbatim Copies
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+### 5. Conveying Modified Source Versions
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+* **a)** The work must carry prominent notices stating that you modified
+it, and giving a relevant date.
+* **b)** The work must carry prominent notices stating that it is
+released under this License and any conditions added under section 7.
+This requirement modifies the requirement in section 4 to
+“keep intact all notices”.
+* **c)** You must license the entire work, as a whole, under this
+License to anyone who comes into possession of a copy. This
+License will therefore apply, along with any applicable section 7
+additional terms, to the whole of the work, and all its parts,
+regardless of how they are packaged. This License gives no
+permission to license the work in any other way, but it does not
+invalidate such permission if you have separately received it.
+* **d)** If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your
+work need not make them do so.
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+### 6. Conveying Non-Source Forms
+
+You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+* **a)** Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium
+customarily used for software interchange.
+* **b)** Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a
+written offer, valid for at least three years and valid for as
+long as you offer spare parts or customer support for that product
+model, to give anyone who possesses the object code either **(1)** a
+copy of the Corresponding Source for all the software in the
+product that is covered by this License, on a durable physical
+medium customarily used for software interchange, for a price no
+more than your reasonable cost of physically performing this
+conveying of source, or **(2)** access to copy the
+Corresponding Source from a network server at no charge.
+* **c)** Convey individual copies of the object code with a copy of the
+written offer to provide the Corresponding Source. This
+alternative is allowed only occasionally and noncommercially, and
+only if you received the object code with such an offer, in accord
+with subsection 6b.
+* **d)** Convey the object code by offering access from a designated
+place (gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge. You need not require recipients to copy the
+Corresponding Source along with the object code. If the place to
+copy the object code is a network server, the Corresponding Source
+may be on a different server (operated by you or a third party)
+that supports equivalent copying facilities, provided you maintain
+clear directions next to the object code saying where to find the
+Corresponding Source. Regardless of what server hosts the
+Corresponding Source, you remain obligated to ensure that it is
+available for as long as needed to satisfy these requirements.
+* **e)** Convey the object code using peer-to-peer transmission, provided
+you inform other peers where the object code and Corresponding
+Source of the work are being offered to the general public at no
+charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A “User Product” is either **(1)** a “consumer product”, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or **(2)** anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, “normally used” refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+### 7. Additional Terms
+
+“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+* **a)** Disclaiming warranty or limiting liability differently from the
+terms of sections 15 and 16 of this License; or
+* **b)** Requiring preservation of specified reasonable legal notices or
+author attributions in that material or in the Appropriate Legal
+Notices displayed by works containing it; or
+* **c)** Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+* **d)** Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+* **e)** Declining to grant rights under trademark law for use of some
+trade names, trademarks, or service marks; or
+* **f)** Requiring indemnification of licensors and authors of that
+material by anyone who conveys the material (or modified versions of
+it) with contractual assumptions of liability to the recipient, for
+any liability that these contractual assumptions directly impose on
+those licensors and authors.
+
+All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+### 8. Termination
+
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated **(a)**
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and **(b)** permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+### 9. Acceptance Not Required for Having Copies
+
+You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+### 10. Automatic Licensing of Downstream Recipients
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+### 11. Patents
+
+A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's “contributor version”.
+
+A contributor's “essential patent claims” are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either **(1)** cause the Corresponding Source to be so
+available, or **(2)** arrange to deprive yourself of the benefit of the
+patent license for this particular work, or **(3)** arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is “discriminatory” if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license **(a)** in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or **(b)** primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+### 12. No Surrender of Others' Freedom
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+### 13. Remote Network Interaction; Use with the GNU General Public License
+
+Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+### 14. Revised Versions of this License
+
+The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License “or any later version” applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+### 15. Disclaimer of Warranty
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+### 16. Limitation of Liability
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+### 17. Interpretation of Sections 15 and 16
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+## END OF TERMS AND CONDITIONS
+
+### How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a “Source” link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+< >.
\ No newline at end of file
diff --git a/docs/AUTHORS.md b/docs/AUTHORS.md
new file mode 100644
index 0000000000..282f6c8a82
--- /dev/null
+++ b/docs/AUTHORS.md
@@ -0,0 +1,85 @@
+# «NexT» Authors
+
+NexT theme was initially developed by:
+
+- **IIssNaN**: [NexT](https://github.com/iissnan/hexo-theme-next) (2014 - 2017)
+
+With collaborators from initially repository:
+
+- **Ivan.Nginx**: [DIFF highlight](https://github.com/iissnan/hexo-theme-next/pull/1079),
+ [HyperComments](https://github.com/iissnan/hexo-theme-next/pull/1155),
+ [`{% note %}` tag](https://github.com/iissnan/hexo-theme-next/pull/1160),
+ [`seo` option](https://github.com/iissnan/hexo-theme-next/pull/1311),
+ [`{% button %}` tag](https://github.com/iissnan/hexo-theme-next/pull/1328),
+ [VK API](https://github.com/iissnan/hexo-theme-next/pull/1381),
+ [WordCount plugin support](https://github.com/iissnan/hexo-theme-next/pull/1381),
+ [Yandex verification option](https://github.com/iissnan/hexo-theme-next/pull/1381),
+ [`{% exturl %}` tag](https://github.com/iissnan/hexo-theme-next/pull/1438),
+ [`b2t` option](https://github.com/iissnan/hexo-theme-next/pull/1438),
+ [`scrollpercent` option](https://github.com/iissnan/hexo-theme-next/pull/1438),
+ [`save_scroll` option](https://github.com/iissnan/hexo-theme-next/pull/1574),
+ [Star rating](https://github.com/iissnan/hexo-theme-next/pull/1649),
+ [`mobile_layout_economy` option](https://github.com/iissnan/hexo-theme-next/pull/1697),
+ [`{% tabs %}` tag](https://github.com/iissnan/hexo-theme-next/pull/1697),
+ [`{% label %}` tag](https://github.com/iissnan/hexo-theme-next/pull/1697),
+ [**`Gemini`** scheme](https://github.com/iissnan/hexo-theme-next/pull/1697),
+ [Menu & Sidebar icons in 1 line](https://github.com/iissnan/hexo-theme-next/pull/1830),
+ [Sidebar scrollable](https://github.com/iissnan/hexo-theme-next/pull/1898),
+ [Responsive favicons](https://github.com/iissnan/hexo-theme-next/pull/1898)
+ and many other [PR's with fixes and enhancements](https://github.com/iissnan/hexo-theme-next/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3Aivan-nginx)
+- **Acris**: [Many PR's with fixes and updates](https://github.com/iissnan/hexo-theme-next/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3AAcris)
+
+And best contributors from initially repository:
+
+- **Rainy**: [Gentie comments](https://github.com/iissnan/hexo-theme-next/pull/1301),
+ [Han](https://github.com/iissnan/hexo-theme-next/pull/1598)
+ and many [PR's with fixes and optimizations](https://github.com/iissnan/hexo-theme-next/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3Ageekrainy)
+- **Jeff**: [Local search](https://github.com/iissnan/hexo-theme-next/pull/694)
+ and many [PR's with fixes and improvements](https://github.com/iissnan/hexo-theme-next/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3Aflashlab)
+- **Haocen**: [Footer enhancements](https://github.com/iissnan/hexo-theme-next/pull/1886)
+ and some other [PR's with improvements](https://github.com/iissnan/hexo-theme-next/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3AHaocen)
+- **uchuhimo**: [Greatest enhancements for local search](https://github.com/iissnan/hexo-theme-next/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3Auchuhimo)
+- **Kei**: [Change static file setting to support subdirectory](https://github.com/iissnan/hexo-theme-next/pull/4)
+- **Jolyon**: [Swiftype](https://github.com/iissnan/hexo-theme-next/pull/84)
+- **xirong**: [404 page](https://github.com/iissnan/hexo-theme-next/pull/126)
+- **PinkyJie**: [Fix Swiftype](https://github.com/iissnan/hexo-theme-next/pull/132)
+- **Tim Kuijsten**: [Split javascript into separate files](https://github.com/iissnan/hexo-theme-next/pull/152)
+- **iamwent**: [Friendly links](https://github.com/iissnan/hexo-theme-next/pull/250)
+- **arao lin**: [Option to lazyload images](https://github.com/iissnan/hexo-theme-next/pull/269)
+- **Konstantin Pavlov**: [Microdata, opengraph and other semantic features](https://github.com/iissnan/hexo-theme-next/pull/276)
+- **Gary**: [FastClick](https://github.com/iissnan/hexo-theme-next/pull/324)
+- **Octavian**: [Baidu site vertification](https://github.com/iissnan/hexo-theme-next/pull/367)
+- **Henry Chang**: [Facebook SDK](https://github.com/iissnan/hexo-theme-next/pull/410)
+- **XiaMo**: [LeanCloud visitors](https://github.com/iissnan/hexo-theme-next/pull/439)
+- **iblogc**: [Fix UA in Duoshuo](https://github.com/iissnan/hexo-theme-next/pull/489)
+- **Vincent**: [Automatic headline ID's](https://github.com/iissnan/hexo-theme-next/pull/588)
+- **cissoid**: [Tencent analytics](https://github.com/iissnan/hexo-theme-next/pull/603)
+- **CosmoX**: [AddThis](https://github.com/iissnan/hexo-theme-next/pull/660)
+- **Jason Guo**: [Reward for post](https://github.com/iissnan/hexo-theme-next/pull/687)
+- **Jerry Bendy**: [CNZZ counter](https://github.com/iissnan/hexo-theme-next/pull/712)
+- **Hui Wang**: [Wechat subscriber](https://github.com/iissnan/hexo-theme-next/pull/788)
+- **PoonChiTim**: [Busuanzi counter](https://github.com/iissnan/hexo-theme-next/pull/809)
+- **hydai**: [Facebook comments](https://github.com/iissnan/hexo-theme-next/pull/925)
+- **OAwan**: [`canonical` option](https://github.com/iissnan/hexo-theme-next/pull/931)
+- **Jim Zenn**: [Google Calendar](https://github.com/iissnan/hexo-theme-next/pull/1167)
+- **Abner Chou**: [Disqus improvements](https://github.com/iissnan/hexo-theme-next/pull/1173)
+- **Igor Fesenko**: [Application Insights](https://github.com/iissnan/hexo-theme-next/pull/1257)
+- **jinfang**: [Youyan comments](https://github.com/iissnan/hexo-theme-next/pull/1324)
+- **AlynxZhou**: [`canvas_nest` option](https://github.com/iissnan/hexo-theme-next/pull/1327)
+- **aleon**: [Tencent MTA](https://github.com/iissnan/hexo-theme-next/pull/1408)
+- **asmoker**: [LiveRe comments](https://github.com/iissnan/hexo-theme-next/pull/1415)
+- **Jacksgong**: [Copyright on posts](https://github.com/iissnan/hexo-theme-next/pull/1497)
+- **zhaiqianfeng**: [Changyan comments](https://github.com/iissnan/hexo-theme-next/pull/1514)
+- **zproo**: [`canvas_ribbon` option](https://github.com/iissnan/hexo-theme-next/pull/1565)
+- **jjandxa**: [`three_waves`](https://github.com/iissnan/hexo-theme-next/pull/1534),
+ [`canvas_lines` and `canvas_sphere`](https://github.com/iissnan/hexo-theme-next/pull/1595) options
+- **shenzekun**: [Load bar at the top](https://github.com/iissnan/hexo-theme-next/pull/1689)
+- **elkan1788**: [Upgrade jiathis share](https://github.com/iissnan/hexo-theme-next/pull/1796)
+- **xCss**: [Valine comment system support](https://github.com/iissnan/hexo-theme-next/pull/1811)
+- **Julian Xhokaxhiu**: [`override` option](https://github.com/iissnan/hexo-theme-next/pull/1861)
+- **LEAFERx**: [NeedMoreShare2](https://github.com/iissnan/hexo-theme-next/pull/1913)
+- **aimingoo & LEAFERx**: [Gitment supported with Mint](https://github.com/iissnan/hexo-theme-next/pull/1919)
+- **leviding**: [Fix the bug of Gitment](https://github.com/iissnan/hexo-theme-next/pull/1944)
+- **maple3142**: [Firestore visitor counter](https://github.com/iissnan/hexo-theme-next/pull/1978)
+
+It lives on as an open source project with many contributors, a self updating list is [here](https://github.com/theme-next/hexo-theme-next/graphs/contributors).
diff --git a/docs/DATA-FILES.md b/docs/DATA-FILES.md
new file mode 100644
index 0000000000..ddff6b07d8
--- /dev/null
+++ b/docs/DATA-FILES.md
@@ -0,0 +1,23 @@
+# Theme configurations using Hexo data files ([#328](https://github.com/iissnan/hexo-theme-next/issues/328))
+
+Currently, it is not smooth to update NexT theme from pulling or downloading new releases. It is quite often running into conflict status when updating NexT theme via `git pull`, or need to merge configurations manually when upgrading to new releases.
+
+ At present, NexT encourages users to store some options in site's `_config.yml` and other options in theme's `_config.yml`. This approach is applicable, but has some drawbacks:
+1. Configurations are splited into two pieces
+2. Users maybe confuse which place should be for options
+
+In order to resolve this issue, NexT will take advantage of Hexo [Data files](https://hexo.io/docs/data-files.html). Because Data files is introduced in Hexo 3, so you need upgrade Hexo to 3.0 (or above) to use this feature.
+
+If you prefer Hexo 2.x, you can still use the old approach for configurations. NexT is still compatible with Hexo 2.x.
+
+## Benefits
+
+With this feature, now you can put all your configurations into one place (`source/_data/next.yml`), you don't need to touch `next/_config.yml`. If there are any new options in new releases, you just need to copy those options from `next/_config.yml`, paste into `_data/next.yml` and set their values to whatever you want.
+
+## How to use this feature
+
+1. Please ensure you are using Hexo 3 (or above)
+2. Create an file named `next.yml` in site's `source/_data` directory (create `_data` directory if it did not exist)
+3. Copy NexT theme options both in site's `_config.yml` and theme's `_config.yml` into `next.yml`.
+4. Use `--config source/_data/next.yml` parameter to start server, generate or deploy.\
+ For example: `hexo clean --config source/_data/next.yml && hexo g --config source/_data/next.yml`.
diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md
new file mode 100644
index 0000000000..b521260d0a
--- /dev/null
+++ b/docs/INSTALLATION.md
@@ -0,0 +1,120 @@
+Installation
+
+Step 1 → Go to Hexo dir
+
+Change dir to **hexo root** directory. There must be `node_modules`, `source`, `themes` and other directories:
+ ```sh
+ $ cd hexo
+ $ ls
+ _config.yml node_modules package.json public scaffolds source themes
+ ```
+
+Step 2 → Get NexT
+
+Download theme from GitHub.
+There are 3 options to do it, need to choose only one of them.
+
+### Option 1: Download [latest release version][releases-latest-url]
+
+ At most cases **stable**. Recommended for beginners.
+
+ * Install with [curl & tar & wget][curl-tar-wget-url]:
+
+ ```sh
+ $ mkdir themes/next
+ $ curl -s https://api.github.com/repos/theme-next/hexo-theme-next/releases/latest | grep tarball_url | cut -d '"' -f 4 | wget -i - -O- | tar -zx -C themes/next --strip-components=1
+ ```
+ This variant will give to you **only latest release version** (without `.git` directory inside).\
+ So, there is impossible to update this version with `git` later.\
+ Instead you always can use separate configuration (e.g. [data-files][docs-data-files-url]) and download new version inside old directory (or create new directory and redefine `theme` in Hexo config), without losing your old configuration.
+
+### Option 2: Download [tagged release version][releases-url]
+
+ In rare cases useful, but not recommended.\
+ You must define version. Replace `v6.0.0` with any version from [tags list][tags-url].
+
+ * Variant 1: Install with [curl & tar][curl-tar-url]:
+
+ ```sh
+ $ mkdir themes/next
+ $ curl -L https://api.github.com/repos/theme-next/hexo-theme-next/tarball/v6.0.0 | tar -zxv -C themes/next --strip-components=1
+ ```
+ Same as above under `curl & tar & wget` variant, but will download **only concrete version**.
+
+ * Variant 2: Install with [git][git-url]:
+
+ ```sh
+ $ git clone --branch v6.0.0 https://github.com/theme-next/hexo-theme-next themes/next
+ ```
+ This variant will give to you the **defined release version** (with `.git` directory inside).\
+ And in any time you can switch to any tagged release, but with limit to defined version.
+
+### Option 3: Download [latest master branch][download-latest-url]
+
+ May be **unstable**, but includes latest features. Recommended for advanced users and for developers.
+
+ * Variant 1: Install with [curl & tar][curl-tar-url]:
+
+ ```sh
+ $ mkdir themes/next
+ $ curl -L https://api.github.com/repos/theme-next/hexo-theme-next/tarball | tar -zxv -C themes/next --strip-components=1
+ ```
+ Same as above under `curl & tar & wget` variant, but will download **only latest master branch version**.\
+ At some cases useful for developers.
+
+ * Variant 2: Install with [git][git-url]:
+
+ ```sh
+ $ git clone https://github.com/theme-next/hexo-theme-next themes/next
+ ```
+
+ This variant will give to you the **whole repository** (with `.git` directory inside).\
+ And in any time you can [update current version with git][update-with-git-url] and switch to any tagged release or on latest master or any other branch.\
+ At most cases useful as for users and for developers.
+
+ Get tags list:
+
+ ```sh
+ $ cd themes/next
+ $ git tag -l
+ …
+ v6.0.0
+ v6.0.1
+ v6.0.2
+ ```
+
+ For example, you want to switch on `v6.0.1` [tagged release version][tags-url]. Input the following command:
+
+ ```sh
+ $ git checkout tags/v6.0.1
+ Note: checking out 'tags/v6.0.1'.
+ …
+ HEAD now on 1f72f68... CSS: Remove global list-style setting of ul
+ ```
+
+ And if you want to switch back on [master branch][commits-url], input this command:
+
+ ```sh
+ $ git checkout master
+ ```
+
+Step 3 → Set it up
+
+Set theme in main **hexo root config** `_config.yml` file:
+
+```yml
+theme: next
+```
+
+[download-latest-url]: https://github.com/theme-next/hexo-theme-next/archive/master.zip
+[releases-latest-url]: https://github.com/theme-next/hexo-theme-next/releases/latest
+[releases-url]: https://github.com/theme-next/hexo-theme-next/releases
+[tags-url]: https://github.com/theme-next/hexo-theme-next/tags
+[commits-url]: https://github.com/theme-next/hexo-theme-next/commits/master
+
+[git-url]: http://lmgtfy.com/?q=linux+git+install
+[curl-tar-url]: http://lmgtfy.com/?q=linux+curl+tar+install
+[curl-tar-wget-url]: http://lmgtfy.com/?q=linux+curl+tar+wget+install
+
+[update-with-git-url]: https://github.com/theme-next/hexo-theme-next/blob/master/README.md#update
+[docs-data-files-url]: https://github.com/theme-next/hexo-theme-next/blob/master/docs/DATA-FILES.md
diff --git a/docs/LICENSE b/docs/LICENSE
new file mode 100644
index 0000000000..11571dd27a
--- /dev/null
+++ b/docs/LICENSE
@@ -0,0 +1,56 @@
+ «NexT» — Elegant and powerful theme for Hexo.
+
+ Copyright © 2017 «NexT» (github.com/theme-next/hexo-theme-next).
+
+ Detail attribution information for «NexT»
+ is contained in the 'docs/AUTHORS.md' file.
+
+ This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License version 3
+as published by the Free Software Foundation with the addition of the
+following permission added to Section 15 as permitted in Section 7(a):
+FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY «NEXT»,
+«NEXT» DISCLAIMS THE WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
+
+ This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Affero General Public License for more details.
+You should have received a copy of the GNU Affero General Public License
+along with this program; if not, see: https://www.gnu.org/licenses/agpl.txt
+
+ In accordance with Section 7(b) of the GNU Affero General Public License:
+
+ a) It is not necessary to specify copyright in each source file of
+ this program because GitHub fully save commits of all modified files
+ with their authors and provides to see for this changes publicly.
+
+ b) For any part of the covered work in which the copyright not specified,
+ except of third party libraries ('source/lib/*') and '*custom.*' files,
+ will mean this part owned by «NexT» in accord with terms in this file.
+
+ c) A covered work must retain theme info link to the «NexT» repository
+ (https://github.com/theme-next/hexo-theme-next) in footer section
+ of every website created, modified or manipulated by using «NexT».
+ «NexT» theme configuration must be:
+ ```
+ footer:
+ theme:
+ enable: true
+ ```
+ Collaborators, best contributors and all authors specified in the
+ 'docs/AUTHORS.md' file of «NexT» repository under the
+ 'https://github.com/theme-next' organization can ignore theme info link
+ requirements.
+
+ Anyone can be released from the requirements of the license by purchasing
+a commercial license. Buying such a license is mandatory as soon as you
+develop commercial activities involving the «NexT» software without
+disclosing the source code of your own applications.
+These activities include:
+ 1. Access to private repository with various premium features.
+ 2. Priority support for resolve all possible issues with «NexT».
+ 3. Priority support for implement all possible features to «NexT».
+
+ For more information, please contact «NexT» Organization at this
+address: sales@theme-next.org
diff --git a/docs/cn/DATA-FILES.md b/docs/cn/DATA-FILES.md
new file mode 100644
index 0000000000..7443f04227
--- /dev/null
+++ b/docs/cn/DATA-FILES.md
@@ -0,0 +1,5 @@
+ATTENTION!
+Contributors on Chinese docs needed!
+Need to translate from English docs to Chinese in this file, below.
+Any help wanted!
+Thank's a lot!
diff --git a/docs/cn/INSTALLATION.md b/docs/cn/INSTALLATION.md
new file mode 100644
index 0000000000..2cc2737990
--- /dev/null
+++ b/docs/cn/INSTALLATION.md
@@ -0,0 +1,5 @@
+ATTENTION!
+Contributors on Chinese docs needed!
+Need to translate from English docs to Chinese in this file, below.
+Any help wanted!
+Thank's a lot!
diff --git a/docs/cn/README.md b/docs/cn/README.md
new file mode 100644
index 0000000000..6c93aed239
--- /dev/null
+++ b/docs/cn/README.md
@@ -0,0 +1,5 @@
+ATTENTION!
+Contributors on Chinese docs needed!
+Need to translate from English docs to Chinese in this file, below.
+Any help wanted!
+Thank's a lot!
diff --git a/docs/ru/README.md b/docs/ru/README.md
new file mode 100644
index 0000000000..5d2186adfb
--- /dev/null
+++ b/docs/ru/README.md
@@ -0,0 +1,88 @@
+
+
+#
+
+«NexT» — элегантная высококачественная тема под Hexo. Сделана с нуля, с любовью.
+
+[![gitter-image]][gitter-url]
+[![mnt-image]][commits-url]
+[![travis-image]][travis-url]
+[![rel-image]][releases-url]
+[![hexo-image]][hexo-url]
+[![lic-image]][lic-url]
+
+## Демо
+
+* :heart_decoration: Muse тема: [XiaMo](https://notes.wanghao.work) | [OAwan](https://oawan.me) | [Hui Wang](http://hui-wang.info)
+* :six_pointed_star: Mist тема: [Jeff](https://blog.zzbd.org) | [uchuhimo](http://uchuhimo.me) | [xirong](http://www.ixirong.com)
+* :pisces: Pisces тема: [Vi](http://notes.iissnan.com) | [Acris](https://acris.me) | [Rainy](https://rainylog.com)
+* :gemini: Gemini тема: [Ivan.Nginx](https://almostover.ru) | [Alynx](http://sh.alynx.xyz) | [Raincal](https://raincal.top)
+
+Больше примеров «NexT» [здесь](https://github.com/iissnan/hexo-theme-next/issues/119).
+
+## Установка
+
+Простейший вариант установки — склонировать весь репозиторий:
+
+ ```sh
+ $ cd hexo
+ $ git clone https://github.com/theme-next/hexo-theme-next themes/next
+ ```
+
+Или предлагаю почитать [детальные инструкции по установке][docs-installation-url], если вариант выше не устраивает.
+
+## Обновление
+
+Можно обновить до последней мастер-ветки следующей командой:
+
+```sh
+$ cd themes/next
+$ git pull
+```
+
+А если всплывают ошибки во время обновления (что-то наподобии **«Commit your changes or stash them before you can merge»**), рекомендуется ознакомиться с особенностью хранения [дата-файлов в Hexo][docs-data-files-url].\
+Как бы то ни было, можно обойти ошибки при обновлении если «Закомитить», «Стэшнуть» или «Откатить» локальные изменения. Смотрим [здесь](https://stackoverflow.com/a/15745424/5861495) как это сделать.
+
+## Известные баги
+
+Для тех, кто столкнулся с ошибкой **«[Error: Cannot find module 'hexo-util'](https://github.com/iissnan/hexo-theme-next/issues/1490)»**, следует проверить версию NPM.
+
+* `> 3`: Всё равно не работает? Удалите директорию `node_modules` и переустановите с помощью `npm install`.
+* `< 3`: Добавьте `hexo-util` принудительно командой `npm install --save-dev hexo-util` к основным пакетам с Hexo.
+
+## Содействие
+
+Приветсвуется любое содействие, не стесняйтесь сообщать «Баги», брать «Форки» и вливать «Пулы».
+
+## Лицензия
+
+«NexT» распространяется под лицензией [AGPL][lic-url].
+
+[browser-image]: https://img.shields.io/badge/browser-%20chrome%20%7C%20firefox%20%7C%20opera%20%7C%20safari%20%7C%20ie%20%3E%3D%209-lightgrey.svg
+[browser-url]: https://www.browserstack.com
+
+[gitter-image]: https://badges.gitter.im/Join%20Chat.svg
+[gitter-url]: https://gitter.im/theme-next
+
+[travis-image]: https://travis-ci.org/theme-next/hexo-theme-next.svg?branch=master
+[travis-url]: https://travis-ci.org/theme-next/hexo-theme-next?branch=master "Travis CI"
+
+[hexo-image]: https://img.shields.io/badge/hexo-%3E%3D%203.0-blue.svg
+[hexo-url]: http://hexo.io
+
+[lic-image]: https://img.shields.io/badge/license-%20AGPL-blue.svg
+[lic-url]: https://github.com/theme-next/hexo-theme-next/blob/master/LICENSE.md
+
+[rel-image]: https://img.shields.io/github/release/theme-next/hexo-theme-next.svg
+[mnt-image]: https://img.shields.io/maintenance/yes/2018.svg
+
+[download-latest-url]: https://github.com/theme-next/hexo-theme-next/archive/master.zip
+[releases-latest-url]: https://github.com/theme-next/hexo-theme-next/releases/latest
+[releases-url]: https://github.com/theme-next/hexo-theme-next/releases
+[tags-url]: https://github.com/theme-next/hexo-theme-next/tags
+[commits-url]: https://github.com/theme-next/hexo-theme-next/commits/master
+
+[docs-installation-url]: https://github.com/theme-next/hexo-theme-next/blob/master/docs/ru/INSTALLATION.md
+[docs-data-files-url]: https://github.com/theme-next/hexo-theme-next/blob/master/docs/ru/DATA-FILES.md
diff --git a/gulpfile.coffee b/gulpfile.coffee
new file mode 100644
index 0000000000..c7d706bde1
--- /dev/null
+++ b/gulpfile.coffee
@@ -0,0 +1,54 @@
+fs = require('fs')
+path = require('path')
+gulp = require('gulp')
+jshint = require('gulp-jshint')
+stylish = require('jshint-stylish')
+shell = require('gulp-shell')
+yaml = require('js-yaml')
+
+gulp.task 'lint', ->
+ return gulp.src([
+ './source/js/src/utils.js',
+ './source/js/src/motion.js',
+ './source/js/src/hook-duoshuo.js',
+ './source/js/src/algolia-search.js',
+ './source/js/src/bootstrap.js',
+ './source/js/src/post-details.js',
+ './source/js/src/schemes/pisces.js'
+ ]).pipe jshint()
+ .pipe jshint.reporter(stylish)
+
+gulp.task 'lint:stylus', shell.task [
+ '"./node_modules/.bin/stylint" ./source/css/'
+]
+
+gulp.task 'validate:config', (cb) ->
+ themeConfig = fs.readFileSync path.join(__dirname, '_config.yml')
+
+ try
+ yaml.safeLoad(themeConfig)
+ cb()
+ catch error
+ cb new Error(error)
+
+gulp.task 'validate:languages', (cb) ->
+ languagesPath = path.join __dirname, 'languages'
+ languages = fs.readdirSync languagesPath
+ errors = []
+
+ for lang in languages
+ languagePath = path.join languagesPath, lang
+ try
+ yaml.safeLoad fs.readFileSync(languagePath), {
+ filename: path.relative(__dirname, languagePath)
+ }
+ catch error
+ errors.push error
+
+ if errors.length == 0
+ cb()
+ else
+ cb(errors)
+
+
+gulp.task 'default', ['lint', 'validate:config', 'validate:languages']
diff --git a/languages/de.yml b/languages/de.yml
new file mode 100644
index 0000000000..b44baff58d
--- /dev/null
+++ b/languages/de.yml
@@ -0,0 +1,91 @@
+title:
+ archive: Archiv
+ category: Kategorie
+ tag: Tag
+
+author: Author
+
+menu:
+ home: Startseite
+ archives: Archiv
+ categories: Kategorien
+ tags: Tags
+ about: Über
+ feed: RSS
+ search: Suche
+
+sidebar:
+ overview: Übersicht
+ toc: Inhaltsverzeichnis
+
+post:
+ created: Post created
+ sticky: Sticky
+ posted: Veröffentlicht am
+ modified: Updated at
+ in: in
+ read_more: Weiterlesen
+ untitled: Unbenannt
+ toc_empty: Dieser Artikel hat kein Inhaltsverzeichnis
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Gesamt
+ tags: tags
+
+footer:
+ powered: "Erstellt mit %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: Keine Tags
+ one: Insgesamt ein Tag
+ other: "Insgesamt %d Tags"
+
+ categories:
+ zero: Keine Kategorien
+ one: Insgesamt eine Kategorie
+ other: "Insgesamt %d Kategorien"
+
+ archive_posts:
+ zero: Keine Artikel vorhanden.
+ one: Ein Artikel.
+ other: "Insgesamt %d Artikel."
+
+state:
+ posts: Artikel
+ pages: Seiten
+ tags: Tags
+ categories: Kategorien
+
+cheers:
+ um: Öhm..
+ ok: OK
+ nice: Schön
+ good: Gut
+ great: Wunderbar
+ excellent: Exzellent
+
+keep_on: Bleib dran.
+
+symbol:
+ comma: '. '
+ period: ', '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/default.yml b/languages/default.yml
new file mode 100644
index 0000000000..a41e09bbad
--- /dev/null
+++ b/languages/default.yml
@@ -0,0 +1,98 @@
+title:
+ archive: Archive
+ category: Category
+ tag: Tag
+ schedule: Schedule
+
+author: Author
+
+menu:
+ home: Home
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: About
+ search: Search
+ schedule: Schedule
+ sitemap: Sitemap
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Overview
+ toc: Table of Contents
+
+post:
+ created: Post created
+ modified: Post modified
+ sticky: Sticky
+ posted: Posted on
+ in: In
+ more: more
+ read_more: Read more
+ untitled: Untitled
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totally
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: No tags
+ one: 1 tag in total
+ other: "%d tags in total"
+
+ categories:
+ zero: No categories
+ one: 1 category in total
+ other: "%d categories in total"
+
+ archive_posts:
+ zero: No posts.
+ one: 1 post.
+ other: "%d posts in total."
+
+state:
+ posts: posts
+ pages: pages
+ tags: tags
+ categories: categories
+
+search:
+ placeholder: Searching...
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Nice
+ good: Good
+ great: Great
+ excellent: Excellent
+
+keep_on: Keep on posting.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/en.yml b/languages/en.yml
new file mode 100644
index 0000000000..4c179ada07
--- /dev/null
+++ b/languages/en.yml
@@ -0,0 +1,100 @@
+title:
+ archive: Archive
+ category: Category
+ tag: Tag
+ schedule: Schedule
+
+author: Author
+
+menu:
+ home: Home
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: About
+ search: Search
+ schedule: Schedule
+ sitemap: Sitemap
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Overview
+ toc: Table of Contents
+
+post:
+ created: Post created
+ modified: Post modified
+ sticky: Sticky
+ posted: Posted on
+ in: In
+ more: more
+ read_more: Read more
+ untitled: Untitled
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totally
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: No tags
+ one: 1 tag in total
+ other: "%d tags in total"
+
+ categories:
+ zero: No categories
+ one: 1 category in total
+ other: "%d categories in total"
+
+ archive_posts:
+ zero: No posts.
+ one: 1 post.
+ other: "%d posts in total."
+
+state:
+ posts: posts
+ pages: pages
+ tags: tags
+ categories: categories
+
+search:
+ placeholder: Searching...
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Nice
+ good: Good
+ great: Great
+ excellent: Excellent
+
+keep_on: Keep on posting.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
+
+gitmentbutton: Show comments from Gitment
diff --git a/languages/fr-FR.yml b/languages/fr-FR.yml
new file mode 100644
index 0000000000..a452b24e1d
--- /dev/null
+++ b/languages/fr-FR.yml
@@ -0,0 +1,89 @@
+title:
+ archive: Archive
+ category: Catégorie
+ tag: Tag
+
+author: Author
+
+menu:
+ home: Accueil
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: A propos
+ search: recherche
+
+sidebar:
+ overview: Ensemble
+ toc: Table Des Matières
+
+post:
+ sticky: Sticky
+ posted: Posté le
+ modified: Updated at
+ in: In
+ read_more: Lire la suite
+ untitled: Non titré
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Total
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Thème
+
+counter:
+ tag_cloud:
+ zero: Aucun tags
+ one: 1 tag au total
+ other: "%d tags au total"
+
+ categories:
+ zero: Aucun categories
+ one: 1 category au total
+ other: "%d categories au total"
+
+ archive_posts:
+ zero: Aucun article.
+ one: 1 article.
+ other: "%d articles au total."
+
+state:
+ posts: articles
+ pages: pages
+ tags: tags
+ categories: categories
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Jolie
+ good: Bien
+ great: Super
+ excellent: Excellent
+
+keep_on: Et ca ne fait que commencer.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/id.yml b/languages/id.yml
new file mode 100644
index 0000000000..0dc3f78e9d
--- /dev/null
+++ b/languages/id.yml
@@ -0,0 +1,89 @@
+title:
+ archive: Arsip
+ category: Kategori
+ tag: Tag
+
+author: Penulis
+
+menu:
+ home: Beranda
+ archives: Arsip
+ categories: Kategori
+ tags: Tags
+ about: Tentang
+ search: Pencarian
+
+sidebar:
+ overview: Ikhtisar
+ toc: Daftar Isi
+
+post:
+ sticky: Sticky
+ posted: Diposting di
+ modified: Updated at
+ in: Di
+ read_more: Baca lebih
+ untitled: Tidak ada title
+ toc_empty: Posting ini tidak memiliki Daftar Isi
+ visitors: Pengunjung
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Total
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Tidak ada tags
+ one: 1 total tag
+ other: "%d total tags"
+
+ categories:
+ zero: Tidak ada kategori
+ one: 1 total categori
+ other: "%d total kategori"
+
+ archive_posts:
+ zero: Tidak ada posting.
+ one: 1 posting.
+ other: "%d total posting."
+
+state:
+ posts: posting
+ pages: halaman
+ tags: tags
+ categories: kategori
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Bagus
+ good: Bagus
+ great: Besar
+ excellent: Baik
+
+keep_on: Terus Posting.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/it.yml b/languages/it.yml
new file mode 100644
index 0000000000..46f1d32504
--- /dev/null
+++ b/languages/it.yml
@@ -0,0 +1,98 @@
+title:
+ archive: Archivio
+ category: Categoria
+ tag: Tag
+ schedule: Programma
+
+author: Autore
+
+menu:
+ home: Home
+ archives: Archivi
+ categories: Categorie
+ tags: Tags
+ about: Informazioni su
+ search: Cerca
+ schedule: Programma
+ sitemap: Sitemap
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Panoramica
+ toc: Indice
+
+post:
+ created: Post creato
+ modified: Post modificato
+ sticky: Sticky
+ posted: Scritto il
+ in: In
+ more: espandi
+ read_more: Leggi di più
+ untitled: Senza titolo
+ toc_empty: Questo post non ha un indice
+ visitors: Visitatori
+ wordcount: Numero di parole nell'articolo
+ min2read: Tempo di lettura
+ totalcount: Numero totale di parole
+ totaltime: Site reading time
+ copyright:
+ author: Autore
+ link: Link
+ license_title: Copyright
+ license_content: 'Tutti gli articoli in questo sito sono sotto licenza
+ %s salvo disposizione contraria.'
+
+page:
+ totally: Totale
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Nessun tag
+ one: 1 tag in totale
+ other: "%d tags in totale."
+
+ categories:
+ zero: Nessuna categoria
+ one: 1 categoria in totale
+ other: "%d categorie in totale."
+
+ archive_posts:
+ zero: Nessun post.
+ one: 1 post.
+ other: "%d posts in totale."
+
+state:
+ posts: posts
+ pages: pagine
+ tags: tags
+ categories: categorie
+
+search:
+ placeholder: Cerca...
+
+cheers:
+ um: Mh..
+ ok: OK
+ nice: Bello
+ good: Buono
+ great: Ottimo
+ excellent: Eccellente
+
+keep_on: Continua così.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Dona
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/ja.yml b/languages/ja.yml
new file mode 100644
index 0000000000..3dc9e0d8fa
--- /dev/null
+++ b/languages/ja.yml
@@ -0,0 +1,89 @@
+title:
+ archive: アーカイブ
+ category: カテゴリ
+ tag: タグ
+
+author: Author
+
+menu:
+ home: ホーム
+ archives: アーカイブ
+ categories: カテゴリ
+ tags: タグ
+ about: About
+ search: 検索
+
+sidebar:
+ overview: 概要
+ toc: 見出し
+
+post:
+ sticky: 固定
+ posted: 投稿日
+ modified: Updated at
+ in: In
+ read_more: 続きを読む
+ untitled: 無題
+ toc_empty: 見出しがありません
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 全ページ
+ tags: タグ
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: タグなし
+ one: "全 1 タグ"
+ other: "全 %d タグ"
+
+ categories:
+ zero: カテゴリなし
+ one: "全 1 カテゴリ"
+ other: "全 %d カテゴリ"
+
+ archive_posts:
+ zero: ポストなし
+ one: "全 1 ポスト"
+ other: "全 %d ポスト"
+
+state:
+ posts: ポスト
+ pages: ページ
+ tags: タグ
+ categories: カテゴリ
+
+cheers:
+ um: うーん
+ ok: OK
+ nice: まあまあ
+ good: いいね
+ great: すごい
+ excellent: 最高
+
+keep_on: もっと書こう!
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/ko.yml b/languages/ko.yml
new file mode 100644
index 0000000000..59e0509f39
--- /dev/null
+++ b/languages/ko.yml
@@ -0,0 +1,89 @@
+title:
+ archive: 아카이브
+ category: 카테고리
+ tag: 태그
+
+author: 작성자
+
+menu:
+ home: 홈
+ archives: 아카이브
+ categories: 카테고리
+ tags: 태그
+ about: About
+ search: 검색
+
+sidebar:
+ overview: 흝어보기
+ toc: 목차
+
+post:
+ sticky: 고정
+ posted: 작성일
+ modified: Updated at
+ in: In
+ read_more: 더 읽어보기
+ untitled: 제목 없음
+ toc_empty: 목차 없음
+ visitors: 방문객
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 모두
+ tags: 태그
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: 태그 없음
+ one: 1개의 태그
+ other: "총 %d개의 태그"
+
+ categories:
+ zero: 카테고리 없음
+ one: 1개의 카테고리
+ other: "총 %d개의 카테고리"
+
+ archive_posts:
+ zero: 포스트 없음
+ one: 1개의 포스트
+ other: "총 %d개의 포스트"
+
+state:
+ posts: 포스트
+ pages: 페이지
+ tags: 태그
+ categories: 카테고리
+
+cheers:
+ um: 음..
+ ok: OK
+ nice: 잘했어요
+ good: 좋아요
+ great: 훌륭해요
+ excellent: 완벽해요
+
+keep_on: 포스트를 마저 작성하세요
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/nl-NL.yml b/languages/nl-NL.yml
new file mode 100644
index 0000000000..4acd836999
--- /dev/null
+++ b/languages/nl-NL.yml
@@ -0,0 +1,97 @@
+title:
+ archive: Archief
+ category: Categorie
+ tag: Label
+ schedule: Rooster
+
+author: Auteur
+
+menu:
+ home: Home
+ archives: Archieven
+ categories: Categorieën
+ tags: Labels
+ about: Over
+ search: Zoeken
+ schedule: Rooster
+ sitemap: Sitemap
+ commonweal: Gezond verstand 404
+
+sidebar:
+ overview: Overzicht
+ toc: Inhoudsopgave
+
+post:
+ created: Post aangemaakt
+ modified: Post aangepast
+ sticky: Sticky
+ posted: Geplaatst op
+ in: In
+ more: meer
+ read_more: Lees meer
+ untitled: Naamloos
+ toc_empty: Deze post heeft geen inhoudsopgave
+ visitors: Bezoekers
+ wordcount: Aantal woorden in artikel
+ min2read: Leestijd
+ totalcount: Aantal woorden in site
+ copyright:
+ author: Post auteur
+ link: Post link
+ license_title: Copyright melding
+ license_content: 'Alle artikelen op deze blog zijn gelicenseerd onder
+ %s, mits niet anders aangegeven.'
+
+page:
+ totally: Totaal
+ tags: labels
+
+footer:
+ powered: "Mede mogelijk gemaakt door %s"
+ theme: Thema
+
+counter:
+ tag_cloud:
+ zero: Geen labels
+ one: 1 label in totaal
+ other: "%d labels in totaal"
+
+ categories:
+ zero: Geen categorieën
+ one: 1 categorie in totaal
+ other: "%d categorieën in totaal"
+
+ archive_posts:
+ zero: Geen posts.
+ one: 1 post.
+ other: "%d posts in totaal."
+
+state:
+ posts: posts
+ pages: pagina's
+ tags: labels
+ categories: categorieën
+
+search:
+ placeholder: Zoeken...
+
+cheers:
+ um: Um..
+ ok: Oké
+ nice: Leuk
+ good: Goed
+ great: Geweldig
+ excellent: Uitstekend
+
+keep_on: Blijf posten.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Doneer
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/pt-BR.yml b/languages/pt-BR.yml
new file mode 100644
index 0000000000..a5175c90fe
--- /dev/null
+++ b/languages/pt-BR.yml
@@ -0,0 +1,89 @@
+title:
+ archive: Arquivo
+ category: Categoria
+ tag: Tag
+
+author: Autor
+
+menu:
+ home: Home
+ archives: Arquivos
+ categories: Categorias
+ tags: Tags
+ about: Sobre
+ search: Pesquisar
+
+sidebar:
+ overview: Visão geral
+ toc: Tabela de conteúdo
+
+post:
+ sticky: Sticky
+ posted: Postado em
+ modified: Updated at
+ in: Em
+ read_more: Leia mais
+ untitled: Sem título
+ toc_empty: Este post não possui tabela de conteúdo
+ visitors: Visitantes
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totalmente
+ tags: tags
+
+footer:
+ powered: "Feito com %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Sem tags
+ one: 1 tag no total de
+ other: "%d tags no total de"
+
+ categories:
+ zero: Sem categoria
+ one: 1 categoria no total de
+ other: "%d categoria no total de"
+
+ archive_posts:
+ zero: Sem posts.
+ one: 1 post.
+ other: "%d posts no total."
+
+state:
+ posts: Posts
+ pages: Páginas
+ tags: Tags
+ categories: Categorias
+
+cheers:
+ um: Uhmmmm...
+ ok: OK
+ nice: Bom
+ good: Muito Bom
+ great: Ótimo
+ excellent: Excelente
+
+keep_on: Continuar no post.
+
+symbol:
+ comma: '. '
+ period: ', '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/pt.yml b/languages/pt.yml
new file mode 100644
index 0000000000..106d10230f
--- /dev/null
+++ b/languages/pt.yml
@@ -0,0 +1,89 @@
+title:
+ archive: Arquivo
+ category: Categoria
+ tag: Tag
+
+author: Author
+
+menu:
+ home: Home
+ archives: Arquivos
+ categories: Categorias
+ tags: Tags
+ about: Sobre
+ search: Pesquisa
+
+sidebar:
+ overview: Visão Geral
+ toc: Tabela de Conteúdo
+
+post:
+ sticky: Sticky
+ posted: Postado em
+ modified: Updated at
+ in: Em
+ read_more: Ler mais
+ untitled: Sem título
+ toc_empty: Esta publicação não possui uma tabela de conteúdo
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totalmente
+ tags: tags
+
+footer:
+ powered: "Desenvolvido com amor com %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Sem tags
+ one: 1 tag no total
+ other: "%d tags no total"
+
+ categories:
+ zero: Sem categorias
+ one: 1 categoria no total
+ other: "%d categorias no total"
+
+ archive_posts:
+ zero: Sem publicações.
+ one: 1 post.
+ other: "%d publicações no total."
+
+state:
+ posts: publicações
+ pages: páginas
+ tags: tags
+ categories: categorias
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Legal
+ good: Bom
+ great: Grandioso
+ excellent: Excelente
+
+keep_on: Mantenha-se publicando!
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/ru.yml b/languages/ru.yml
new file mode 100644
index 0000000000..32eceb071d
--- /dev/null
+++ b/languages/ru.yml
@@ -0,0 +1,106 @@
+title:
+ archive: Архив
+ category: Категория
+ tag: Тэг
+ schedule: Календарь
+
+author: Автор
+
+menu:
+ home: Главная
+ archives: Архив
+ categories: Категории
+ tags: Тэги
+ about: О сайте
+ search: Поиск
+ schedule: Календарь
+ sitemap: Карта сайта
+
+sidebar:
+ overview: Обзор
+ toc: Содержание
+
+post:
+ created: Дата создания записи
+ modified: Дата обновления записи
+ sticky: Ссылка
+ posted: Размещено
+ in: в категории
+ more: далее
+ read_more: Читать полностью
+ untitled: Без имени
+ toc_empty: Эта запись без оглавления
+ visitors: Просмотров
+ wordcount: Кол-во слов в статье
+ min2read: Время чтения в минутах
+ totalcount: Общее кол-во слов в записях
+ totaltime: Время чтения всего сайта
+ copyright:
+ author: Автор записи
+ link: Ссылка на запись
+ license_title: Информация об авторских правах
+ license_content: 'Все записи на этом сайте защищены лицензией
+ %s если не указано дополнительно.'
+
+page:
+ totally: Всего
+ tags: тэги
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: Нет тэгов.
+ one: 1 тэг.
+ two: "%d тэга всего."
+ three: "%d тэга всего."
+ four: "%d тэга всего."
+ other: "%d тэгов всего."
+
+ categories:
+ zero: Нет категорий.
+ one: 1 категория.
+ two: "%d категории всего."
+ three: "%d категории всего."
+ four: "%d категории всего."
+ other: "%d категорий всего."
+
+ archive_posts:
+ zero: Нет записей.
+ one: 1 запись.
+ two: "%d записи всего."
+ three: "%d записи всего."
+ four: "%d записи всего."
+ other: "%d записей всего."
+
+state:
+ posts: Архив
+ pages: Страницы
+ tags: Тэги
+ categories: Категории
+
+search:
+ placeholder: Поиск...
+
+cheers:
+ um: Эм..
+ ok: OK
+ nice: Неплохо
+ good: Хорошо
+ great: Замечательно
+ excellent: Великолепно
+
+keep_on: Продолжаю писать.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Донат
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/languages/vi.yml b/languages/vi.yml
new file mode 100644
index 0000000000..1d46c26690
--- /dev/null
+++ b/languages/vi.yml
@@ -0,0 +1,99 @@
+title:
+ archive: Lưu Trữ
+ category: Phân Loại
+ tag: Thẻ
+ schedule: Danh Mục
+
+author: Tác giả
+
+menu:
+ home: Trang Chủ
+ archives: Lưu Trữ
+ categories: Đầu Mục
+ tags: Thẻ
+ about: Giới Thiệu
+ search: Tìm Kiếm
+ schedule: Danh Mục
+ sitemap: Bản đồ trang
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Tổng Quan
+ toc: Mục Lục
+
+post:
+ created: Được tạo
+ modified: Được thay đổi
+ sticky: Đính
+ posted: Tạo lúc
+ in: Trong
+ more: thêm
+ read_more: Đọc tiếp
+ untitled: Không có tiêu đề
+ toc_empty: Bài viết này không có mục lục
+ visitors: Người xem
+ wordcount: Số từ trong bài viết
+ min2read: Thời gian đọc
+ totalcount: Số từ trong trang
+ copyright:
+ author: Người viết
+ link: Liên kết bài viết
+ license_title: Chú ý bản quyền
+ license_content: 'Tất cả bài viết trong blog này được đăng ký bởi
+ %s trừ khi có thông báo bổ sung.'
+
+page:
+ totally: Toàn bộ
+ tags: thẻ
+
+footer:
+ powered: "Cung cấp bởi %s"
+ theme: Giao Diện
+
+counter:
+ tag_cloud:
+ zero: Không có thẻ nào
+ one: có 1 thẻ tất cả
+ other: "có %d thẻ tất cả"
+
+ categories:
+ zero: Không có trong mục nào
+ one: có 1 mục tất cả
+ other: "có %d mục tất cả"
+
+ archive_posts:
+ zero: Không có bài viết.
+ one: 1 bài viết.
+ other: "tổng số %d bài viết."
+
+state:
+ posts: bài viết
+ pages: trang
+ tags: thẻ
+ categories: mục
+
+search:
+ placeholder: Đang tìm...
+
+cheers:
+ um: Um..
+ ok: Đồng Ý
+ nice: Hay
+ good: Tốt
+ great: Tuyệt vời
+ excellent: Tuyệt cú mèo
+
+keep_on: Giữ tiến độ nha.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Tài trợ
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
+
+gitmentbutton: Hiển thị bình luận từ Gitment
diff --git a/languages/zh-Hans.yml b/languages/zh-Hans.yml
new file mode 100644
index 0000000000..b016ce9e0b
--- /dev/null
+++ b/languages/zh-Hans.yml
@@ -0,0 +1,99 @@
+title:
+ archive: 归档
+ category: 分类
+ tag: 标签
+ schedule: 日程表
+
+author: 博主
+
+menu:
+ home: 首页
+ archives: 归档
+ categories: 分类
+ tags: 标签
+ about: 关于
+ search: 搜索
+ schedule: 日程表
+ sitemap: 站点地图
+ commonweal: 公益404
+
+sidebar:
+ overview: 站点概览
+ toc: 文章目录
+
+post:
+ created: 创建于
+ modified: 更新于
+ sticky: 置顶
+ posted: 发表于
+ in: 分类于
+ read_more: 阅读全文
+ untitled: 未命名
+ toc_empty: 此文章未包含目录
+ visitors: 阅读次数
+ wordcount: 字数统计
+ min2read: 阅读时长
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: 本文作者
+ link: 本文链接
+ license_title: 版权声明
+ license_content: '本博客所有文章除特别声明外,均采用
+ %s 许可协议。转载请注明出处!'
+
+page:
+ totally: 共有
+ tags: 标签
+
+footer:
+ powered: "由 %s 强力驱动"
+ theme: 主题
+
+counter:
+ tag_cloud:
+ zero: 暂无标签
+ one: 目前共计 1 个标签
+ other: "目前共计 %d 个标签"
+
+ categories:
+ zero: 暂无分类
+ one: 目前共计 1 个分类
+ other: "目前共计 %d 个分类"
+
+ archive_posts:
+ zero: 暂无日志。
+ one: 目前共计 1 篇日志。
+ other: "目前共计 %d 篇日志。"
+
+state:
+ posts: 日志
+ pages: 页面
+ tags: 标签
+ categories: 分类
+
+search:
+ placeholder: 搜索...
+
+cheers:
+ um: 嗯..
+ ok: OK
+ nice: 好
+ good: 很好
+ great: 非常好
+ excellent: 太棒了
+
+keep_on: 继续努力。
+
+symbol:
+ comma: ', '
+ period: '。 '
+ colon: ':'
+
+reward:
+ donate: 打赏
+ wechatpay: 微信支付
+ alipay: 支付宝
+ bitcoin: 比特币
+
+gitmentbutton: 显示 Gitment 评论
diff --git a/languages/zh-hk.yml b/languages/zh-hk.yml
new file mode 100644
index 0000000000..53bba9520e
--- /dev/null
+++ b/languages/zh-hk.yml
@@ -0,0 +1,99 @@
+title:
+ archive: 歸檔
+ category: 分類
+ tag: 標籤
+ schedule: 日程表
+
+author: 博主
+
+menu:
+ home: 首頁
+ archives: 歸檔
+ categories: 分類
+ tags: 標籤
+ about: 關於
+ search: 檢索
+ schedule: 日程表
+ sitemap: 站點地圖
+ commonweal: 公益404
+
+sidebar:
+ overview: 本站概覽
+ toc: 文章目錄
+
+post:
+ created: 創建於
+ modified: 更新於
+ sticky: 置頂
+ posted: 發表於
+ in: 分類於
+ read_more: 閱讀全文
+ untitled: 未命名
+ toc_empty: 此文章未包含目錄
+ visitors: 閱讀次數
+ wordcount: 字數統計
+ min2read: 閱讀時長
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 共有
+ tags: 標籤
+
+footer:
+ powered: "由 %s 強力驅動"
+ theme: 主題
+
+counter:
+ tag_cloud:
+ zero: 暫無標籤
+ one: 目前共有 1 個標籤
+ other: "目前共有 %d 個標籤"
+
+ categories:
+ zero: 暫無分類
+ one: 目前共有 1 個分類
+ other: "目前共有 %d 個分類"
+
+ archive_posts:
+ zero: 暫無文章。
+ one: 目前共有 1 篇文章。
+ other: "目前共有 %d 篇文章。"
+
+state:
+ posts: 文章
+ pages: 頁面
+ tags: 標籤
+ categories: 分類
+
+search:
+ placeholder: 搜索...
+
+cheers:
+ um: 嗯..
+ ok: OK
+ nice: 好
+ good: 很好
+ great: 非常好
+ excellent: 激爆好
+
+keep_on: 繼續努力。
+
+symbol:
+ comma: ', '
+ period: '。 '
+ colon: ':'
+
+reward:
+ donate: 打賞
+ wechatpay: 微信支付
+ alipay: 支付寶
+ bitcoin: 比特幣
+
+gitmentbutton: 顯示 Gitment 評論
diff --git a/languages/zh-tw.yml b/languages/zh-tw.yml
new file mode 100644
index 0000000000..3993c1587d
--- /dev/null
+++ b/languages/zh-tw.yml
@@ -0,0 +1,99 @@
+title:
+ archive: 歸檔
+ category: 分類
+ tag: 標籤
+ schedule: 日程表
+
+author: 博主
+
+menu:
+ home: 首頁
+ archives: 歸檔
+ categories: 分類
+ tags: 標籤
+ about: 關於
+ search: 檢索
+ schedule: 日程表
+ sitemap: 站點地圖
+ commonweal: 公益404
+
+sidebar:
+ overview: 本站概覽
+ toc: 文章目錄
+
+post:
+ created: 創建於
+ modified: 更新於
+ sticky: 置頂
+ posted: 發表於
+ in: 分類於
+ read_more: 閱讀全文
+ untitled: 未命名
+ toc_empty: 此文章未包含目錄
+ visitors: 閱讀次數
+ wordcount: 字數統計
+ min2read: 閱讀時長
+ totalcount: Site words total count
+ totaltime: Site reading time
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 共有
+ tags: 標籤
+
+footer:
+ powered: "由 %s 強力驅動"
+ theme: 主題
+
+counter:
+ tag_cloud:
+ zero: 暫無標籤
+ one: 目前共計 1 個標籤
+ other: "目前共計 %d 個標籤"
+
+ categories:
+ zero: 暫無分類
+ one: 目前共計 1 個分類
+ other: "目前共計 %d 個分類"
+
+ archive_posts:
+ zero: 暫無文章。
+ one: 目前共計 1 篇文章。
+ other: "目前共計 %d 篇文章。"
+
+state:
+ posts: 文章
+ pages: 頁面
+ tags: 標籤
+ categories: 分類
+
+search:
+ placeholder: 搜索...
+
+cheers:
+ um: 嗯..
+ ok: OK
+ nice: 好
+ good: 很好
+ great: 非常好
+ excellent: 非常屌
+
+keep_on: 繼續努力。
+
+symbol:
+ comma: ', '
+ period: '。 '
+ colon: ':'
+
+reward:
+ donate: 打賞
+ wechatpay: 微信支付
+ alipay: 支付寶
+ bitcoin: 比特幣
+
+gitmentbutton: 顯示 Gitment 評論
diff --git a/layout/_custom/header.swig b/layout/_custom/header.swig
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/layout/_custom/header.swig
@@ -0,0 +1 @@
+
diff --git a/layout/_custom/sidebar.swig b/layout/_custom/sidebar.swig
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/layout/_custom/sidebar.swig
@@ -0,0 +1 @@
+
diff --git a/layout/_layout.swig b/layout/_layout.swig
new file mode 100644
index 0000000000..6155424735
--- /dev/null
+++ b/layout/_layout.swig
@@ -0,0 +1,92 @@
+
+
+{% set html_class = 'theme-next ' + theme.scheme %}
+{% if theme.motion.enable %}
+ {% set html_class = html_class + ' use-motion' %}
+{% endif %}
+
+
+
+ {{ partial('_partials/head.swig', {}, {cache: theme.cache.enable}) }}
+ {% block title %}{% endblock %}
+ {% include '_third-party/analytics/index.swig' %}
+
+
+
+
+ {% set container_class = "container " %}
+ {% if theme.sidebar.position %}
+ {% set container_class = container_class + 'sidebar-position-' + theme.sidebar.position %}
+ {% endif %}
+
+
+
+
+
+ {{ partial('_partials/header.swig', {}, {cache: theme.cache.enable}) }}
+
+
+
+
+
+
+ {% block content %}{% endblock %}
+
+ {% include '_third-party/duoshuo-hot-articles.swig' %}
+ {% include '_partials/comments.swig' %}
+
+ {% if theme.sidebar.display !== 'remove' %}
+ {% block sidebar %}{% endblock %}
+ {% endif %}
+
+
+
+
+
+ {% if not theme.sidebar.b2t %}
+
+
+ {% if theme.sidebar.scrollpercent %}
+ 0%
+ {% endif %}
+
+ {% endif %}
+
+ {% if theme.needmoreshare2.enable and theme.needmoreshare2.float.enable %}
+
+ {% endif %}
+
+
+
+ {% include '_scripts/vendors.swig' %}
+ {% include '_scripts/commons.swig' %}
+
+ {% set scheme_script = '_scripts/schemes/' + theme.scheme | lower + '.swig' %}
+ {% include scheme_script %}
+
+ {% block script_extra %}{% endblock %}
+
+ {% include '_scripts/boostrap.swig' %}
+
+ {% include '_third-party/comments/index.swig' %}
+ {% include '_third-party/search/index.swig' %}
+ {% include '_third-party/analytics/lean-analytics.swig' %}
+ {% include '_third-party/analytics/firestore.swig' %}
+ {% include '_third-party/seo/baidu-push.swig' %}
+ {% include '_third-party/needsharebutton.swig' %}
+ {% include '_third-party/rating.swig' %}
+ {% include '_third-party/mathjax.swig' %}
+ {% include '_third-party/scroll-cookie.swig' %}
+ {% include '_third-party/exturl.swig' %}
+
+
diff --git a/layout/_macro/post-collapse.swig b/layout/_macro/post-collapse.swig
new file mode 100644
index 0000000000..1894d2466d
--- /dev/null
+++ b/layout/_macro/post-collapse.swig
@@ -0,0 +1,34 @@
+{% macro render(post) %}
+
+
+
+
+ <{% if theme.seo %}h3{% else %}h2{% endif %} class="post-title">
+ {% if post.link %}{# Link posts #}
+
+ {{ post.title or post.link }}
+
+
+ {% else %}
+
+ {% if post.type === 'picture' %}
+ {{ post.content }}
+ {% else %}
+ {{ post.title | default(__('post.untitled')) }}
+ {% endif %}
+
+ {% endif %}
+ {% if theme.seo %}h3{% else %}h2{% endif %}>
+
+
+
+
+
+
+{% endmacro %}
diff --git a/layout/_macro/post-copyright.swig b/layout/_macro/post-copyright.swig
new file mode 100644
index 0000000000..4ad0490c80
--- /dev/null
+++ b/layout/_macro/post-copyright.swig
@@ -0,0 +1,14 @@
+
+ -
+ {{ __('post.copyright.link') + __('symbol.colon') }}
+ {{ post.url | default(post.permalink) }}
+
+ -
+ {{ __('post.copyright.license_title') + __('symbol.colon') }}
+ {{ __('post.copyright.license_content', theme.post_copyright.license_url, theme.post_copyright.license) }}
+
+
diff --git a/layout/_macro/post.swig b/layout/_macro/post.swig
new file mode 100644
index 0000000000..3d5efdd9b3
--- /dev/null
+++ b/layout/_macro/post.swig
@@ -0,0 +1,437 @@
+{% macro render(post, is_index, post_extra_class) %}
+
+ {% set headlessPost = Array.prototype.indexOf.call(['quote', 'picture'], post.type) > -1 %}
+
+ {% set post_class = 'post post-type-' + post.type | default('normal') %}
+ {% if post_extra_class > 0 %}
+ {% set post_class = post_class + ' ' + post_extra_class | default('') %}
+ {% endif %}
+ {% if post.sticky > 0 %}
+ {% set post_class = post_class + ' ' + 'post-sticky' %}
+ {% endif %}
+
+
+
+ {##################}
+ {### POST BLOCK ###}
+ {##################}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if not headlessPost %}
+
+
+ {# Not to show title for quote posts that do not have a title #}
+ {% if not (is_index and post.type === 'quote' and not post.title) %}
+ <{% if theme.seo %}h2{% else %}h1{% endif %} class="post-title{% if post.direction && post.direction.toLowerCase() === 'rtl' %} rtl{% endif %}" itemprop="name headline">{#
+ #}{# Link posts #}{#
+ #}{% if post.link %}
+ {% if post.sticky > 0 %}
+ {{ post.sticky }}
+
+
+
+ {% endif %}
+
+ {{ post.title or post.link }}
+
+
+ {% else %}{#
+ #}{% if is_index %}
+ {% if post.sticky > 0 %}
+
+
+
+ {% endif %}
+ {#
+ #}{{ post.title | default(__('post.untitled'))}}{#
+ #}{#
+ #}{% else %}{{ post.title }}{% endif %}{#
+ #}{% endif %}{#
+ #}{% if theme.seo %}h2{% else %}h1{% endif %}>
+ {% endif %}
+
+
+
+ {% endif %}
+
+ {#################}
+ {### POST BODY ###}
+ {#################}
+
+
+ {# Gallery support #}
+ {% if post.photos and post.photos.length %}
+
+ {% set COLUMN_NUMBER = 3 %}
+ {% for photo in post.photos %}
+ {% if loop.index0 % COLUMN_NUMBER === 0 %}{% endif %}
+
+
+
+ {% if loop.index0 % COLUMN_NUMBER === 2 %}{% endif %}
+ {% endfor %}
+
+ {# Append end tag for `post-gallery-row` when (photos size mod COLUMN_NUMBER) is less than COLUMN_NUMBER #}
+ {% if post.photos.length % COLUMN_NUMBER > 0 %}{% endif %}
+
+ {% endif %}
+
+ {% if is_index %}
+ {% if post.description and theme.excerpt_description %}
+ {{ post.description }}
+
+
+
+ {% elif post.excerpt %}
+ {{ post.excerpt }}
+
+
+
+ {% elif theme.auto_excerpt.enable %}
+ {% set content = post.content | striptags %}
+ {{ content.substring(0, theme.auto_excerpt.length) }}
+ {% if content.length > theme.auto_excerpt.length %}...{% endif %}
+
+
+
+ {% else %}
+ {% if post.type === 'picture' %}
+ {{ post.content }}
+ {% else %}
+ {{ post.content }}
+ {% endif %}
+ {% endif %}
+ {% else %}
+ {{ post.content }}
+ {% endif %}
+
+ {#####################}
+ {### END POST BODY ###}
+ {#####################}
+
+ {% if theme.wechat_subscriber.enabled and not is_index %}
+
+ {% include 'wechat-subscriber.swig' %}
+
+ {% endif %}
+
+ {% if (theme.alipay or theme.wechatpay or theme.bitcoin) and not is_index %}
+
+ {% include 'reward.swig' %}
+
+ {% endif %}
+
+ {% if theme.post_copyright.enable and not is_index %}
+
+ {% include 'post-copyright.swig' with { post: post } %}
+
+ {% endif %}
+
+
+
+ {######################}
+ {### END POST BLOCK ###}
+ {######################}
+
+
+{% endmacro %}
diff --git a/layout/_macro/reward.swig b/layout/_macro/reward.swig
new file mode 100644
index 0000000000..268436e489
--- /dev/null
+++ b/layout/_macro/reward.swig
@@ -0,0 +1,30 @@
+
+ {{ theme.reward_comment }}
+
+
+
diff --git a/layout/_macro/sidebar.swig b/layout/_macro/sidebar.swig
new file mode 100644
index 0000000000..8f1229a565
--- /dev/null
+++ b/layout/_macro/sidebar.swig
@@ -0,0 +1,175 @@
+{% macro render(is_post) %}
+
+
+
+{% endmacro %}
diff --git a/layout/_macro/wechat-subscriber.swig b/layout/_macro/wechat-subscriber.swig
new file mode 100644
index 0000000000..b1d4364419
--- /dev/null
+++ b/layout/_macro/wechat-subscriber.swig
@@ -0,0 +1,4 @@
+
+
+ {{ theme.wechat_subscriber.description }}
+
diff --git a/layout/_partials/comments.swig b/layout/_partials/comments.swig
new file mode 100644
index 0000000000..cee31144c9
--- /dev/null
+++ b/layout/_partials/comments.swig
@@ -0,0 +1,70 @@
+{% if page.comments %}
+
+ {% if (theme.duoshuo and theme.duoshuo.shortname) or theme.duoshuo_shortname %}
+
+
+
+
+
+ {% elseif theme.facebook_sdk.enable and theme.facebook_comments_plugin.enable %}
+
+
+
+
+
+ {% elseif theme.vkontakte_api.enable and theme.vkontakte_api.comments %}
+
+
+
+
+ {% elseif theme.disqus.enable %}
+
+
+
+
+
+
+ {% elseif theme.hypercomments_id %}
+
+
+
+
+ {% elseif theme.youyan_uid %}
+
+
+
+
+ {% elseif theme.livere_uid %}
+
+
+
+
+ {% elseif theme.changyan.appid and theme.changyan.appkey %}
+
+
+
+
+ {% elseif theme.gitment.enable %}
+
+ {% if theme.gitment.lazy %}
+
+
+ {% elseif theme.valine.appid and theme.valine.appkey %}
+
+
+ {% else %}
+
+ {% endif %}
+
+
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_partials/footer.swig b/layout/_partials/footer.swig
new file mode 100644
index 0000000000..5ae1441924
--- /dev/null
+++ b/layout/_partials/footer.swig
@@ -0,0 +1,60 @@
+{#
+#}{% set current = date(Date.now(), "YYYY") %}{#
+#}© {% if theme.footer.since and theme.footer.since != current %}{{ theme.footer.since }} — {% endif %}{#
+#}{{ current }}
+
+
+
+
+
+ {% if config.symbols_count_time.total_symbols %}
+
+
+ {% if theme.symbols_count_time.item_text_total %}
+
+ {% endif %}
+ {#
+ #}{{ symbolsCountTotal(site) }}{#
+ #}
+ {% endif %}
+
+ {% if config.symbols_count_time.total_time %}
+
+
+ {% if theme.symbols_count_time.item_text_total %}
+
+ {% endif %}
+ {#
+ #}{{ symbolsTimeTotal(site, theme.symbols_count_time.awl, theme.symbols_count_time.wpm) }}{#
+ #}
+ {% endif %}
+
+
+{% if theme.footer.powered %}
+ {#
+ #}{{ __('footer.powered', 'Hexo') }}{#
+#}
+{% endif %}
+
+{% if theme.footer.powered and theme.footer.theme.enable %}
+
+{% endif %}
+
+{% if theme.footer.theme.enable %}
+ {#
+ #}{{ __('footer.theme') }} — {#
+ #}{#
+ #}NexT.{{ theme.scheme }}{#
+ #}{% if theme.footer.theme.version %} v{{ theme.version }}{% endif %}{#
+#}
+{% endif %}
+
+{% if theme.footer.custom_text %}
+
+{% endif %}
diff --git a/layout/_partials/head.swig b/layout/_partials/head.swig
new file mode 100644
index 0000000000..9d952d7751
--- /dev/null
+++ b/layout/_partials/head.swig
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+{% if theme.pace %}
+ {% set pace_css_uri = url_for(theme.vendors._internal + '/pace/'+ theme.pace_theme +'.min.css?v=1.0.2') %}
+ {% set pace_js_uri = url_for(theme.vendors._internal + '/pace/pace.min.js?v=1.0.2') %}
+ {% if theme.vendors.pace %}
+ {% set pace_js_uri = theme.vendors.pace %}
+ {% endif %}
+ {% if theme.vendors.pace_css %}
+ {% set pace_css_uri = theme.vendors.pace_css %}
+ {% endif %}
+
+
+{% endif %}
+
+
+{% if theme.han %}
+ {% set Han_uri = url_for(theme.vendors._internal + '/Han/dist/han.min.css?v=3.3') %}
+ {% if theme.vendors.Han %}
+ {% set Han_uri = theme.vendors.Han %}
+ {% endif %}
+
+{% endif %}
+
+
+{# #238, Disable Baidu tranformation #}
+
+
+
+
+{% if theme.google_site_verification %}
+
+{% endif %}
+
+{% if theme.bing_site_verification %}
+
+{% endif %}
+
+{% if theme.yandex_site_verification %}
+
+{% endif %}
+
+
+{% if theme.baidu_site_verification %}
+
+{% endif %}
+
+
+{% if theme.qihu_site_verification %}
+
+{% endif %}
+
+
+{% if theme.fancybox %}
+ {% set fancybox_css_uri = url_for(theme.vendors._internal + '/fancybox/source/jquery.fancybox.css?v=2.1.5') %}
+ {% if theme.vendors.fancybox_css %}
+ {% set fancybox_css_uri = theme.vendors.fancybox_css %}
+ {% endif %}
+
+{% endif %}
+
+{% include "./head/external-fonts.swig" %}
+
+{% set font_awesome_uri = url_for(theme.vendors._internal + '/font-awesome/css/font-awesome.min.css?v=4.6.2') %}
+{% if theme.vendors.fontawesome %}
+ {% set font_awesome_uri = theme.vendors.fontawesome %}
+{% endif %}
+
+
+
+
+{% if theme.favicon.apple_touch_icon %}
+
+{% endif %}
+{% if theme.favicon.medium %}
+
+{% endif %}
+{% if theme.favicon.small %}
+
+{% endif %}
+{% if theme.favicon.safari_pinned_tab %}
+
+{% endif %}
+{% if theme.favicon.android_manifest %}
+
+{% endif %}
+{% if theme.favicon.ms_browserconfig %}
+
+{% endif %}
+
+{% if page.keywords %}
+
+{% elif page.tags and page.tags.length %}
+
+{% elif theme.keywords %}
+
+{% endif %}
+
+
+{% if theme.rss === '' and config.feed and config.feed.path %}
+ {% set theme.rss = config.feed.path %}
+{% endif %}
+{% if theme.rss %}
+
+{% endif %}
+
+
+{% if theme.facebook_sdk.enable and theme.facebook_sdk.webmaster %}
+
+
+{% endif %}
+
+
+{{
+ open_graph({
+ twitter_id: theme.twitter,
+ google_plus: theme.google_plus,
+ fb_admins: theme.fb_admins,
+ fb_app_id: theme.fb_app_id
+ })
+}}
+
+
+{# Export some HEXO Configurations to Front-End #}
+
+
+{# Canonical, good for google search engine (SEO) : https://support.google.com/webmasters/answer/139066 #}
+{% if theme.canonical %}
+
+{% endif %}
+
+{% include 'head/custom-head.swig' %}
diff --git a/layout/_partials/head/custom-head.swig b/layout/_partials/head/custom-head.swig
new file mode 100644
index 0000000000..6aed40d5e2
--- /dev/null
+++ b/layout/_partials/head/custom-head.swig
@@ -0,0 +1,3 @@
+{#
+Custom head.
+#}
diff --git a/layout/_partials/head/external-fonts.swig b/layout/_partials/head/external-fonts.swig
new file mode 100644
index 0000000000..876e12e7bb
--- /dev/null
+++ b/layout/_partials/head/external-fonts.swig
@@ -0,0 +1,51 @@
+{% if theme.font.enable %}
+
+ {% set font_config = theme.font %}
+ {% set font_families = '' %}
+ {% set font_styles = ':300,300italic,400,400italic,700,700italic' %}
+ {% set font_found = false %}
+
+ {% if font_config.global.family and font_config.global.external %}
+ {% set font_families += font_config.global.family + font_styles %}
+ {% set font_found = true %}
+ {% endif %}
+
+ {% if font_config.headings.family and font_config.headings.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.headings.family + font_styles %}
+ {% endif %}
+
+ {% if font_config.posts.family and font_config.posts.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.posts.family + font_styles %}
+ {% endif %}
+
+ {% if font_config.logo.family and font_config.logo.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.logo.family + font_styles %}
+ {% endif %}
+
+ {% if font_config.codes.family and font_config.codes.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.codes.family + font_styles %}
+ {% endif %}
+
+ {% if font_families !== '' %}
+ {% set font_families += '&subset=latin,latin-ext' %}
+ {% set font_host = font_config.host | default('//fonts.googleapis.com') %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_partials/header.swig b/layout/_partials/header.swig
new file mode 100644
index 0000000000..81d5d74613
--- /dev/null
+++ b/layout/_partials/header.swig
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+{% include '../_custom/header.swig' %}
diff --git a/layout/_partials/page-header.swig b/layout/_partials/page-header.swig
new file mode 100644
index 0000000000..1e1f890dbe
--- /dev/null
+++ b/layout/_partials/page-header.swig
@@ -0,0 +1,11 @@
+
+
+
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %} class="post-title" itemprop="name headline">{{ page.title }}{% if theme.seo %}h2{% else %}h1{% endif %}>
+
+{% if page.description %}
+
diff --git a/layout/_partials/pagination.swig b/layout/_partials/pagination.swig
new file mode 100644
index 0000000000..5f96b99a1e
--- /dev/null
+++ b/layout/_partials/pagination.swig
@@ -0,0 +1,11 @@
+{% if page.prev or page.next %}
+
+{% endif %}
diff --git a/layout/_partials/search.swig b/layout/_partials/search.swig
new file mode 100644
index 0000000000..a507d27b6d
--- /dev/null
+++ b/layout/_partials/search.swig
@@ -0,0 +1,9 @@
+{% if theme.algolia_search.enable %}
+ {% include '../_third-party/search/algolia-search/dom.swig' %}
+{% elseif theme.swiftype_key %}
+ {% include 'search/swiftype.swig' %}
+{% elseif theme.tinysou_Key %}
+ {% include 'search/tinysou.swig' %}
+{% elseif theme.local_search.enable %}
+ {% include 'search/localsearch.swig' %}
+{% endif %}
diff --git a/layout/_partials/search/localsearch.swig b/layout/_partials/search/localsearch.swig
new file mode 100644
index 0000000000..f106aa06a2
--- /dev/null
+++ b/layout/_partials/search/localsearch.swig
@@ -0,0 +1,16 @@
+
+{% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layout/_partials/search/swiftype.swig b/layout/_partials/search/swiftype.swig
new file mode 100644
index 0000000000..732e0c14ba
--- /dev/null
+++ b/layout/_partials/search/swiftype.swig
@@ -0,0 +1,12 @@
+
+
+
diff --git a/layout/_partials/search/tinysou.swig b/layout/_partials/search/tinysou.swig
new file mode 100644
index 0000000000..2dfa3e3175
--- /dev/null
+++ b/layout/_partials/search/tinysou.swig
@@ -0,0 +1,3 @@
+
diff --git a/layout/_partials/share/add-this.swig b/layout/_partials/share/add-this.swig
new file mode 100644
index 0000000000..ae0a6b4f50
--- /dev/null
+++ b/layout/_partials/share/add-this.swig
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/layout/_partials/share/baidushare.swig b/layout/_partials/share/baidushare.swig
new file mode 100644
index 0000000000..6be489844e
--- /dev/null
+++ b/layout/_partials/share/baidushare.swig
@@ -0,0 +1,57 @@
+{% if theme.baidushare.type === "button" %}
+
+
+{% elseif theme.baidushare.type === "slide" %}
+
+{% endif %}
+
diff --git a/layout/_partials/share/duoshuo_share.swig b/layout/_partials/share/duoshuo_share.swig
new file mode 100644
index 0000000000..bfa26f4651
--- /dev/null
+++ b/layout/_partials/share/duoshuo_share.swig
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/layout/_partials/share/jiathis.swig b/layout/_partials/share/jiathis.swig
new file mode 100644
index 0000000000..325135220a
--- /dev/null
+++ b/layout/_partials/share/jiathis.swig
@@ -0,0 +1,25 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/layout/_scripts/boostrap.swig b/layout/_scripts/boostrap.swig
new file mode 100644
index 0000000000..5e950905b1
--- /dev/null
+++ b/layout/_scripts/boostrap.swig
@@ -0,0 +1,9 @@
+{%
+ set boot_scripts = [
+ 'src/bootstrap.js'
+ ]
+%}
+
+{% for bs in boot_scripts %}
+
+{% endfor %}
diff --git a/layout/_scripts/commons.swig b/layout/_scripts/commons.swig
new file mode 100644
index 0000000000..abc2971425
--- /dev/null
+++ b/layout/_scripts/commons.swig
@@ -0,0 +1,10 @@
+{%
+ set js_commons = [
+ 'src/utils.js',
+ 'src/motion.js'
+ ]
+%}
+
+{% for common in js_commons %}
+
+{% endfor %}
diff --git a/layout/_scripts/pages/post-details.swig b/layout/_scripts/pages/post-details.swig
new file mode 100644
index 0000000000..6938779753
--- /dev/null
+++ b/layout/_scripts/pages/post-details.swig
@@ -0,0 +1,2 @@
+
+
diff --git a/layout/_scripts/schemes/gemini.swig b/layout/_scripts/schemes/gemini.swig
new file mode 100644
index 0000000000..5119eba656
--- /dev/null
+++ b/layout/_scripts/schemes/gemini.swig
@@ -0,0 +1,10 @@
+{%
+ set scripts = [
+ 'src/affix.js',
+ 'src/schemes/pisces.js'
+ ]
+%}
+
+{% for script in scripts %}
+
+{% endfor %}
diff --git a/layout/_scripts/schemes/mist.swig b/layout/_scripts/schemes/mist.swig
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/layout/_scripts/schemes/muse.swig b/layout/_scripts/schemes/muse.swig
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/layout/_scripts/schemes/pisces.swig b/layout/_scripts/schemes/pisces.swig
new file mode 100644
index 0000000000..5119eba656
--- /dev/null
+++ b/layout/_scripts/schemes/pisces.swig
@@ -0,0 +1,10 @@
+{%
+ set scripts = [
+ 'src/affix.js',
+ 'src/schemes/pisces.js'
+ ]
+%}
+
+{% for script in scripts %}
+
+{% endfor %}
diff --git a/layout/_scripts/vendors.swig b/layout/_scripts/vendors.swig
new file mode 100644
index 0000000000..c3471f4613
--- /dev/null
+++ b/layout/_scripts/vendors.swig
@@ -0,0 +1,57 @@
+{# Reset `window.Promise` when it was not a function. #}
+{# IE refers the element whose id is `Promise` as `window.Promise`, this causes Velocity throwing an exception #}
+
+
+{% set js_vendors = {} %}
+{% set js_vendors.jquery = 'jquery/index.js?v=2.1.3' %}
+
+{% if theme.fastclick %}
+ {% set js_vendors.fastclick = 'fastclick/lib/fastclick.min.js?v=1.0.6' %}
+{% endif %}
+
+{% if theme.lazyload %}
+ {% set js_vendors.lazyload = 'jquery_lazyload/jquery.lazyload.js?v=1.9.7' %}
+{% endif %}
+
+{% set js_vendors.velocity = 'velocity/velocity.min.js?v=1.2.1' %}
+{% set js_vendors.velocity_ui = 'velocity/velocity.ui.min.js?v=1.2.1' %}
+
+{% if theme.fancybox %}
+ {% set js_vendors.fancybox = 'fancybox/source/jquery.fancybox.pack.js?v=2.1.5' %}
+{% endif %}
+
+{% if theme.canvas_nest %}
+ {% set js_vendors.canvas_nest = 'canvas-nest/canvas-nest.min.js' %}
+{% endif %}
+
+{% if theme.three_waves %}
+ {% set js_vendors.three = 'three/three.min.js' %}
+ {% set js_vendors.three_waves = 'three/three-waves.min.js' %}
+{% endif %}
+
+{% if theme.canvas_lines %}
+ {% set js_vendors.three = 'three/three.min.js' %}
+ {% set js_vendors.canvas_lines = 'three/canvas_lines.min.js' %}
+{% endif %}
+
+{% if theme.canvas_sphere %}
+ {% set js_vendors.three = 'three/three.min.js' %}
+ {% set js_vendors.canvas_sphere = 'three/canvas_sphere.min.js' %}
+{% endif %}
+
+{% if theme.canvas_ribbon.enable and theme.scheme === 'Pisces'%}
+ {% set js_vendors.canvas_ribbon = 'canvas-ribbon/canvas-ribbon.js' %}
+{% endif %}
+
+{% for name, internal in js_vendors %}
+ {% set internal_script = url_for(theme.vendors._internal) + '/' + internal %}
+ {% if name == 'canvas_ribbon' %}
+
+ {% else %}
+
+ {% endif %}
+{% endfor %}
diff --git a/layout/_third-party/analytics/analytics-with-widget.swig b/layout/_third-party/analytics/analytics-with-widget.swig
new file mode 100644
index 0000000000..f2a40490d9
--- /dev/null
+++ b/layout/_third-party/analytics/analytics-with-widget.swig
@@ -0,0 +1,4 @@
+{% include 'busuanzi-counter.swig' %}
+{% include 'tencent-mta.swig' %}
+{% include 'tencent-analytics.swig' %}
+{% include 'cnzz-analytics.swig' %}
\ No newline at end of file
diff --git a/layout/_third-party/analytics/application-insights.swig b/layout/_third-party/analytics/application-insights.swig
new file mode 100644
index 0000000000..c0af16fadd
--- /dev/null
+++ b/layout/_third-party/analytics/application-insights.swig
@@ -0,0 +1,11 @@
+{% if theme.application_insights %}
+
+{% endif %}
\ No newline at end of file
diff --git a/layout/_third-party/analytics/baidu-analytics.swig b/layout/_third-party/analytics/baidu-analytics.swig
new file mode 100644
index 0000000000..9ae1d8349f
--- /dev/null
+++ b/layout/_third-party/analytics/baidu-analytics.swig
@@ -0,0 +1,11 @@
+{% if theme.baidu_analytics %}
+
+{% endif %}
diff --git a/layout/_third-party/analytics/busuanzi-counter.swig b/layout/_third-party/analytics/busuanzi-counter.swig
new file mode 100644
index 0000000000..721b2c8060
--- /dev/null
+++ b/layout/_third-party/analytics/busuanzi-counter.swig
@@ -0,0 +1,21 @@
+{% if theme.busuanzi_count.enable %}
+
+
+
+ {% if theme.busuanzi_count.site_uv %}
+
+ {{ theme.busuanzi_count.site_uv_header }}
+
+ {{ theme.busuanzi_count.site_uv_footer }}
+
+ {% endif %}
+
+ {% if theme.busuanzi_count.site_pv %}
+
+ {{ theme.busuanzi_count.site_pv_header }}
+
+ {{ theme.busuanzi_count.site_pv_footer }}
+
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_third-party/analytics/cnzz-analytics.swig b/layout/_third-party/analytics/cnzz-analytics.swig
new file mode 100644
index 0000000000..bffb73cdcb
--- /dev/null
+++ b/layout/_third-party/analytics/cnzz-analytics.swig
@@ -0,0 +1,7 @@
+{% if theme.cnzz_siteid %}
+
+
+
+{% endif %}
diff --git a/layout/_third-party/analytics/facebook-sdk.swig b/layout/_third-party/analytics/facebook-sdk.swig
new file mode 100644
index 0000000000..7b5a291876
--- /dev/null
+++ b/layout/_third-party/analytics/facebook-sdk.swig
@@ -0,0 +1,19 @@
+{% if theme.facebook_sdk.enable %}
+
+{% endif %}
diff --git a/layout/_third-party/analytics/firestore.swig b/layout/_third-party/analytics/firestore.swig
new file mode 100644
index 0000000000..7493c75f2b
--- /dev/null
+++ b/layout/_third-party/analytics/firestore.swig
@@ -0,0 +1,99 @@
+{% if theme.firestore.enable %}
+
+
+ {% if theme.firestore.bluebird %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_third-party/analytics/google-analytics.swig b/layout/_third-party/analytics/google-analytics.swig
new file mode 100644
index 0000000000..c66d461ff7
--- /dev/null
+++ b/layout/_third-party/analytics/google-analytics.swig
@@ -0,0 +1,10 @@
+{% if theme.google_analytics %}
+
+{% endif %}
\ No newline at end of file
diff --git a/layout/_third-party/analytics/index.swig b/layout/_third-party/analytics/index.swig
new file mode 100644
index 0000000000..78ae38eecb
--- /dev/null
+++ b/layout/_third-party/analytics/index.swig
@@ -0,0 +1,5 @@
+{% include 'facebook-sdk.swig' %}
+{% include 'vkontakte-api.swig' %}
+{% include 'google-analytics.swig' %}
+{% include 'baidu-analytics.swig' %}
+{% include 'application-insights.swig' %}
diff --git a/layout/_third-party/analytics/lean-analytics.swig b/layout/_third-party/analytics/lean-analytics.swig
new file mode 100644
index 0000000000..2e8bb98e4e
--- /dev/null
+++ b/layout/_third-party/analytics/lean-analytics.swig
@@ -0,0 +1,108 @@
+{% if theme.leancloud_visitors.enable %}
+
+ {# custom analytics part create by xiamo #}
+
+
+
+
+{% endif %}
diff --git a/layout/_third-party/analytics/tencent-analytics.swig b/layout/_third-party/analytics/tencent-analytics.swig
new file mode 100644
index 0000000000..c2fab35ec6
--- /dev/null
+++ b/layout/_third-party/analytics/tencent-analytics.swig
@@ -0,0 +1,10 @@
+{% if theme.tencent_analytics %}
+
+{% endif %}
diff --git a/layout/_third-party/analytics/tencent-mta.swig b/layout/_third-party/analytics/tencent-mta.swig
new file mode 100644
index 0000000000..f4b6470157
--- /dev/null
+++ b/layout/_third-party/analytics/tencent-mta.swig
@@ -0,0 +1,14 @@
+{% if theme.tencent_mta %}
+
+{% endif %}
diff --git a/layout/_third-party/analytics/vkontakte-api.swig b/layout/_third-party/analytics/vkontakte-api.swig
new file mode 100644
index 0000000000..913a8fc902
--- /dev/null
+++ b/layout/_third-party/analytics/vkontakte-api.swig
@@ -0,0 +1,27 @@
+{% if theme.vkontakte_api.enable %}
+
+
+
+
+{% endif %}
diff --git a/layout/_third-party/comments/changyan.swig b/layout/_third-party/comments/changyan.swig
new file mode 100644
index 0000000000..d816b2cba1
--- /dev/null
+++ b/layout/_third-party/comments/changyan.swig
@@ -0,0 +1,18 @@
+{% if theme.changyan.enable and theme.changyan.appid and theme.changyan.appkey %}
+ {% if is_home() %}
+
+ {% else %}
+
+
+ {% endif %}
+{% endif %}
diff --git a/layout/_third-party/comments/disqus.swig b/layout/_third-party/comments/disqus.swig
new file mode 100644
index 0000000000..2d14907c69
--- /dev/null
+++ b/layout/_third-party/comments/disqus.swig
@@ -0,0 +1,23 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname %}
+ {% if theme.disqus.enable %}
+
+ {% if theme.disqus.count %}
+
+ {% endif %}
+
+ {% if page.comments %}
+
+ {% endif %}
+
+ {% endif %}
+{% endif %}
diff --git a/layout/_third-party/comments/duoshuo.swig b/layout/_third-party/comments/duoshuo.swig
new file mode 100644
index 0000000000..c8499b2bd4
--- /dev/null
+++ b/layout/_third-party/comments/duoshuo.swig
@@ -0,0 +1,33 @@
+{% if (theme.duoshuo and theme.duoshuo.shortname) or theme.duoshuo_shortname %}
+
+ {% if theme.duoshuo %}
+ {% set duoshuo_shortname = theme.duoshuo.shortname %}
+ {% else %}
+ {% set duoshuo_shortname = theme.duoshuo_shortname %}
+ {% endif %}
+
+
+
+ {% if theme.duoshuo_info.ua_enable %}
+ {% if theme.duoshuo_info.admin_enable %}
+ {% set ua_parser_internal = url_for(theme.vendors._internal) + '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' %}
+
+
+ {% endif %}
+ {% set ua_parser_internal = url_for(theme.vendors._internal) + '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' %}
+
+
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_third-party/comments/gitment.swig b/layout/_third-party/comments/gitment.swig
new file mode 100644
index 0000000000..398779e773
--- /dev/null
+++ b/layout/_third-party/comments/gitment.swig
@@ -0,0 +1,59 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname %}
+{% if theme.gitment.enable and theme.gitment.client_id %}
+
+ {% if theme.gitment.mint %}
+ {% set CommentsClass = "Gitmint" %}
+
+
+ {% else %}
+ {% set CommentsClass = "Gitment" %}
+
+
+ {% endif %}
+
+
+ {% if theme.gitment.cleanly %}
+
+ {% endif %}
+
+ {% if page.comments %}
+
+ {% endif %}
+
+{% endif %}
+{% endif %}
diff --git a/layout/_third-party/comments/hypercomments.swig b/layout/_third-party/comments/hypercomments.swig
new file mode 100644
index 0000000000..de693e4331
--- /dev/null
+++ b/layout/_third-party/comments/hypercomments.swig
@@ -0,0 +1,27 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname and not theme.disqus_shortname %}
+
+ {% if theme.hypercomments_id %}
+
+
+
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_third-party/comments/index.swig b/layout/_third-party/comments/index.swig
new file mode 100644
index 0000000000..b2da2320af
--- /dev/null
+++ b/layout/_third-party/comments/index.swig
@@ -0,0 +1,8 @@
+{% include 'duoshuo.swig' %}
+{% include 'disqus.swig' %}
+{% include 'hypercomments.swig' %}
+{% include 'youyan.swig' %}
+{% include 'livere.swig' %}
+{% include 'changyan.swig' %}
+{% include 'gitment.swig' %}
+{% include 'valine.swig' %}
diff --git a/layout/_third-party/comments/livere.swig b/layout/_third-party/comments/livere.swig
new file mode 100644
index 0000000000..9e1e165630
--- /dev/null
+++ b/layout/_third-party/comments/livere.swig
@@ -0,0 +1,16 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname and not (theme.disqus.enable and theme.disqus.shortname) and not theme.hypercomments_id %}
+
+ {% if page.comments and theme.livere_uid %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_third-party/comments/valine.swig b/layout/_third-party/comments/valine.swig
new file mode 100644
index 0000000000..9bf56633d4
--- /dev/null
+++ b/layout/_third-party/comments/valine.swig
@@ -0,0 +1,23 @@
+{% if theme.valine.enable and theme.valine.appid and theme.valine.appkey %}
+
+
+
+
+{% endif %}
diff --git a/layout/_third-party/comments/youyan.swig b/layout/_third-party/comments/youyan.swig
new file mode 100644
index 0000000000..dbf3e8a853
--- /dev/null
+++ b/layout/_third-party/comments/youyan.swig
@@ -0,0 +1,16 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname)
+ and not theme.duoshuo_shortname
+ and not theme.disqus_shortname
+ and not theme.hypercomments_id %}
+
+ {% if theme.youyan_uid %}
+ {% set uid = theme.youyan_uid %}
+
+ {% if page.comments %}
+
+
+
+ {% endif %}
+ {% endif %}
+
+{% endif %}
diff --git a/layout/_third-party/duoshuo-hot-articles.swig b/layout/_third-party/duoshuo-hot-articles.swig
new file mode 100644
index 0000000000..2d1088d0de
--- /dev/null
+++ b/layout/_third-party/duoshuo-hot-articles.swig
@@ -0,0 +1,5 @@
+{# 多说热评文章 #}
+{% if (theme.duoshuo_hotartical and page.title) %}
+ 热评文章
+
+{% endif %}
diff --git a/layout/_third-party/exturl.swig b/layout/_third-party/exturl.swig
new file mode 100644
index 0000000000..329ab506d7
--- /dev/null
+++ b/layout/_third-party/exturl.swig
@@ -0,0 +1,3 @@
+{% if theme.exturl %}
+
+{% endif %}
diff --git a/layout/_third-party/mathjax.swig b/layout/_third-party/mathjax.swig
new file mode 100644
index 0000000000..89db7b4bcc
--- /dev/null
+++ b/layout/_third-party/mathjax.swig
@@ -0,0 +1,23 @@
+{% if theme.mathjax.enable %}
+ {% if not theme.mathjax.per_page or (page.total or page.mathjax) %}
+
+
+
+
+ {% endif %}
+{% endif %}
diff --git a/layout/_third-party/needsharebutton.swig b/layout/_third-party/needsharebutton.swig
new file mode 100644
index 0000000000..73d8e4b74b
--- /dev/null
+++ b/layout/_third-party/needsharebutton.swig
@@ -0,0 +1,30 @@
+{% if theme.needmoreshare2.enable %}
+ {% set needmoreshare2_css = url_for(theme.vendors._internal + '/needsharebutton/needsharebutton.css') %}
+ {% if theme.vendors.needmoreshare2 %}
+ {% set needmoreshare2_css = theme.vendors.needmoreshare2_css %}
+ {% endif %}
+
+
+ {% set needmoreshare2_js = url_for(theme.vendors._internal + '/needsharebutton/needsharebutton.js') %}
+ {% if theme.vendors.needmoreshare2_js %}
+ {% set needmoreshare2_js = theme.vendors.needmoreshare2_js %}
+ {% endif %}
+
+
+
+{% endif %}
\ No newline at end of file
diff --git a/layout/_third-party/rating.swig b/layout/_third-party/rating.swig
new file mode 100644
index 0000000000..3b376ce317
--- /dev/null
+++ b/layout/_third-party/rating.swig
@@ -0,0 +1,18 @@
+{% if theme.rating.enable and (not is_home() and is_post()) %}
+
+{% endif %}
diff --git a/layout/_third-party/schedule.swig b/layout/_third-party/schedule.swig
new file mode 100644
index 0000000000..6db3a3c46e
--- /dev/null
+++ b/layout/_third-party/schedule.swig
@@ -0,0 +1,185 @@
+{% if theme.calendar.enable %}
+{% if page.type == 'schedule' %}
+
+
+
+{% endif %}
+{% endif %}
diff --git a/layout/_third-party/scroll-cookie.swig b/layout/_third-party/scroll-cookie.swig
new file mode 100644
index 0000000000..9fbb0ebd58
--- /dev/null
+++ b/layout/_third-party/scroll-cookie.swig
@@ -0,0 +1,4 @@
+{% if theme.save_scroll %}
+
+
+{% endif %}
diff --git a/layout/_third-party/search/algolia-search/assets.swig b/layout/_third-party/search/algolia-search/assets.swig
new file mode 100644
index 0000000000..069504f972
--- /dev/null
+++ b/layout/_third-party/search/algolia-search/assets.swig
@@ -0,0 +1,18 @@
+{% if theme.algolia_search.enable %}
+
+ {# S: Include Algolia instantsearch.js library #}
+ {% set algolia_instant_css = url_for(theme.vendors._internal + '/algolia-instant-search/instantsearch.min.css') %}
+ {% if theme.vendors.algolia_instant_css %}
+ {% set algolia_instant_css = theme.vendors.algolia_instant_css %}
+ {% endif %}
+
+
+ {% set algolia_instant_js = url_for(theme.vendors._internal + '/algolia-instant-search/instantsearch.min.js') %}
+ {% if theme.vendors.algolia_instant_js %}
+ {% set algolia_instant_js = theme.vendors.algolia_instant_js %}
+ {% endif %}
+
+ {# E: Include Algolia instantsearch.js library #}
+
+
+{% endif %}
diff --git a/layout/_third-party/search/algolia-search/dom.swig b/layout/_third-party/search/algolia-search/dom.swig
new file mode 100644
index 0000000000..a733bb179d
--- /dev/null
+++ b/layout/_third-party/search/algolia-search/dom.swig
@@ -0,0 +1,20 @@
+{% if theme.algolia_search.enable %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endif %}
diff --git a/layout/_third-party/search/index.swig b/layout/_third-party/search/index.swig
new file mode 100644
index 0000000000..0a352bcc8e
--- /dev/null
+++ b/layout/_third-party/search/index.swig
@@ -0,0 +1,3 @@
+{% include 'tinysou.swig' %}
+{% include 'localsearch.swig' %}
+{% include 'algolia-search/assets.swig' %}
diff --git a/layout/_third-party/search/localsearch.swig b/layout/_third-party/search/localsearch.swig
new file mode 100644
index 0000000000..c373e5c4f8
--- /dev/null
+++ b/layout/_third-party/search/localsearch.swig
@@ -0,0 +1,318 @@
+{% if theme.local_search.enable %}
+
+{% endif %}
diff --git a/layout/_third-party/search/tinysou.swig b/layout/_third-party/search/tinysou.swig
new file mode 100644
index 0000000000..6e186847ab
--- /dev/null
+++ b/layout/_third-party/search/tinysou.swig
@@ -0,0 +1,23 @@
+{% if config.tinysou_Key %}
+
+{% endif %}
\ No newline at end of file
diff --git a/layout/_third-party/seo/baidu-push.swig b/layout/_third-party/seo/baidu-push.swig
new file mode 100644
index 0000000000..ee6838f3a6
--- /dev/null
+++ b/layout/_third-party/seo/baidu-push.swig
@@ -0,0 +1,16 @@
+{% if theme.baidu_push %}
+
+{% endif %}
diff --git a/layout/archive.swig b/layout/archive.swig
new file mode 100644
index 0000000000..970491fab8
--- /dev/null
+++ b/layout/archive.swig
@@ -0,0 +1,62 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post-collapse.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.archive') }} | {{ config.title }}{% endblock %}
+
+{% block page_class %}page-archive{% endblock %}
+
+{% block content %}
+
+ {#####################}
+ {### ARCHIVE BLOCK ###}
+ {#####################}
+
+
+
+
+
+ {% set cheers %}
+ {% set posts_length = site.posts.length %}
+ {% if posts_length > 210 %} {% set cheers = 'excellent' %}
+ {% elif posts_length > 130 %} {% set cheers = 'great' %}
+ {% elif posts_length > 80 %} {% set cheers = 'good' %}
+ {% elif posts_length > 50 %} {% set cheers = 'nice' %}
+ {% elif posts_length > 30 %} {% set cheers = 'ok' %}
+ {% else %}
+ {% set cheers = 'um' %}
+ {% endif %}
+ {{ __('cheers.' + cheers) }}! {{ _p("counter.archive_posts", site.posts.length) }} {{ __('keep_on') }}
+
+
+ {% for post in page.posts %}
+
+ {# Show year #}
+ {% set year %}
+ {% set post.year = date(post.date, 'YYYY') %}
+
+ {% if post.year !== year %}
+ {% set year = post.year %}
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %} class="archive-year" id="archive-year-{{ year }}">{{ year }}{% if theme.seo %}h2{% else %}h1{% endif %}>
+
+ {% endif %}
+ {# endshow #}
+
+ {{ post_template.render(post) }}
+
+ {% endfor %}
+
+
+
+ {#########################}
+ {### END ARCHIVE BLOCK ###}
+ {#########################}
+
+ {% include '_partials/pagination.swig' %}
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/layout/category.swig b/layout/category.swig
new file mode 100644
index 0000000000..8e3aa72c96
--- /dev/null
+++ b/layout/category.swig
@@ -0,0 +1,38 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post-collapse.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.category') }}: {{ page.category }} | {{ config.title }}{% endblock %}
+
+{% block content %}
+
+ {######################}
+ {### CATEGORY BLOCK ###}
+ {######################}
+
+
+
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %}>{#
+ #}{{ page.category }}{#
+ #}{{ __('title.category') }}
+ {% if theme.seo %}h2{% else %}h1{% endif %}>
+
+
+ {% for post in page.posts %}
+ {{ post_template.render(post) }}
+ {% endfor %}
+
+
+
+ {##########################}
+ {### END CATEGORY BLOCK ###}
+ {##########################}
+
+ {% include '_partials/pagination.swig' %}
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/layout/index.swig b/layout/index.swig
new file mode 100644
index 0000000000..995c28a868
--- /dev/null
+++ b/layout/index.swig
@@ -0,0 +1,23 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ config.title }}{% if theme.index_with_subtitle and config.subtitle %} - {{config.subtitle }}{% endif %}{% endblock %}
+
+{% block page_class %}
+ {% if is_home() %}page-home{% endif -%}
+{% endblock %}
+
+{% block content %}
+
+
+ {% include '_partials/pagination.swig' %}
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/layout/page.swig b/layout/page.swig
new file mode 100644
index 0000000000..83ad7bdc32
--- /dev/null
+++ b/layout/page.swig
@@ -0,0 +1,70 @@
+{% extends '_layout.swig' %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+ {% block title %}{#
+ #}{% set page_title_suffix = ' | ' + config.title %}{#
+
+ #}{% if page.type === "categories" and not page.title %}{#
+ #}{{ __('title.category') + page_title_suffix }}{#
+ #}{% elif page.type === "tags" and not page.title %}{#
+ #}{{ __('title.tag') + page_title_suffix }}{#
+ #}{% else %}{#
+ #}{{ page.title + page_title_suffix }}{#
+ #}{% endif %}{#
+#}{% endblock %}
+
+{% block page_class %}page-post-detail{% endblock %}
+
+{% block content %}
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
+
+{% block script_extra %}
+ {% include '_scripts/pages/post-details.swig' %}
+{% endblock %}
diff --git a/layout/post.swig b/layout/post.swig
new file mode 100644
index 0000000000..8274630500
--- /dev/null
+++ b/layout/post.swig
@@ -0,0 +1,37 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+
+{% block title %}{{ page.title }} | {{ config.title }}{% endblock %}
+
+{% block page_class %}page-post-detail{% endblock %}
+
+
+{% block content %}
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(true) }}
+{% endblock %}
+
+{% block script_extra %}
+ {% include '_scripts/pages/post-details.swig' %}
+{% endblock %}
diff --git a/layout/schedule.swig b/layout/schedule.swig
new file mode 100644
index 0000000000..216dfea5a1
--- /dev/null
+++ b/layout/schedule.swig
@@ -0,0 +1,25 @@
+{% extends '_layout.swig' %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.schedule') }} | {{ config.title }}{% endblock %}
+
+{% block page_class %}page-post-detail page-calendar{% endblock %}
+
+{% block content %}
+ {######################}
+ {### SCHEDULE BLOCK ###}
+ {######################}
+
+
+
+
+
+
+ {##########################}
+ {### END SCHEDULE BLOCK ###}
+ {##########################}
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/layout/tag.swig b/layout/tag.swig
new file mode 100644
index 0000000000..e570ce83df
--- /dev/null
+++ b/layout/tag.swig
@@ -0,0 +1,37 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post-collapse.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.tag') }}: {{ page.tag }} | {{ config.title }}{% endblock %}
+
+{% block content %}
+
+ {#################}
+ {### TAG BLOCK ###}
+ {#################}
+
+
+
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %}>{#
+ #}{{ page.tag }}{#
+ #}{{ __('title.tag') }}
+ {% if theme.seo %}h2{% else %}h1{% endif %}>
+
+
+ {% for post in page.posts %}
+ {{ post_template.render(post) }}
+ {% endfor %}
+
+
+
+ {#####################}
+ {### END TAG BLOCK ###}
+ {#####################}
+
+ {% include '_partials/pagination.swig' %}
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000..4c5daedfa5
--- /dev/null
+++ b/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "hexo-theme-next",
+ "version": "6.0.0",
+ "description": "Elegant and powerful theme for Hexo",
+ "main": "index.js",
+ "directories": {
+ "test": "test"
+ },
+ "scripts": {
+ "test": "gulp"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/theme-next/hexo-theme-next.git"
+ },
+ "keywords": [
+ "NexT",
+ "Hexo"
+ ],
+ "author": "iissnan ",
+ "maintainers": [
+ "Ivan Nginx (https://almostover.ru)"
+ ],
+ "license": "AGPL",
+ "bugs": {
+ "url": "https://github.com/theme-next/hexo-theme-next/issues"
+ },
+ "homepage": "https://theme-next.org",
+ "devDependencies": {
+ "coffee-script": "^1.10.0",
+ "gulp": "^3.9.0",
+ "gulp-jshint": "^1.12.0",
+ "gulp-shell": "^0.6.1",
+ "js-yaml": "^3.8.1",
+ "jshint-stylish": "^2.1.0",
+ "stylint": "^1.5.9"
+ }
+}
diff --git a/scripts/merge-configs.js b/scripts/merge-configs.js
new file mode 100644
index 0000000000..3f6cf71dcc
--- /dev/null
+++ b/scripts/merge-configs.js
@@ -0,0 +1,20 @@
+/* global hexo */
+
+var merge = require('./merge');
+
+/**
+ * Merge configs in _data/next.yml into hexo.theme.config.
+ * Note: configs in _data/next.yml will override configs in hexo.theme.config.
+ */
+hexo.on('generateBefore', function () {
+ if (hexo.locals.get) {
+ var data = hexo.locals.get('data');
+ if ( data && data.next ) {
+ if ( data.next.override ) {
+ hexo.theme.config = data.next;
+ } else {
+ merge(hexo.theme.config, data.next);
+ }
+ }
+ }
+});
diff --git a/scripts/merge.js b/scripts/merge.js
new file mode 100644
index 0000000000..f964663d53
--- /dev/null
+++ b/scripts/merge.js
@@ -0,0 +1,2225 @@
+/**
+ * lodash (Custom Build)
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors
+ * Released under MIT license
+ * Based on Underscore.js 1.8.3
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+/** Used as the size to enable large array optimizations. */
+var LARGE_ARRAY_SIZE = 200;
+
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ genTag = '[object GeneratorFunction]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ objectTag = '[object Object]',
+ promiseTag = '[object Promise]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ symbolTag = '[object Symbol]',
+ weakMapTag = '[object WeakMap]';
+
+var arrayBufferTag = '[object ArrayBuffer]',
+ dataViewTag = '[object DataView]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+/**
+ * Used to match `RegExp`
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+ */
+var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+
+/** Used to match `RegExp` flags from their coerced string values. */
+var reFlags = /\w*$/;
+
+/** Used to detect host constructors (Safari). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^(?:0|[1-9]\d*)$/;
+
+/** Used to identify `toStringTag` values of typed arrays. */
+var typedArrayTags = {};
+typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+ typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+ typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+ typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+ typedArrayTags[uint32Tag] = true;
+typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+ typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+ typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
+ typedArrayTags[errorTag] = typedArrayTags[funcTag] =
+ typedArrayTags[mapTag] = typedArrayTags[numberTag] =
+ typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
+ typedArrayTags[setTag] = typedArrayTags[stringTag] =
+ typedArrayTags[weakMapTag] = false;
+
+/** Used to identify `toStringTag` values supported by `_.clone`. */
+var cloneableTags = {};
+cloneableTags[argsTag] = cloneableTags[arrayTag] =
+ cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
+ cloneableTags[boolTag] = cloneableTags[dateTag] =
+ cloneableTags[float32Tag] = cloneableTags[float64Tag] =
+ cloneableTags[int8Tag] = cloneableTags[int16Tag] =
+ cloneableTags[int32Tag] = cloneableTags[mapTag] =
+ cloneableTags[numberTag] = cloneableTags[objectTag] =
+ cloneableTags[regexpTag] = cloneableTags[setTag] =
+ cloneableTags[stringTag] = cloneableTags[symbolTag] =
+ cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
+ cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+cloneableTags[errorTag] = cloneableTags[funcTag] =
+ cloneableTags[weakMapTag] = false;
+
+/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+/** Detect free variable `self`. */
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+/** Used as a reference to the global object. */
+var root = freeGlobal || freeSelf || Function('return this')();
+
+/** Detect free variable `exports`. */
+var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
+
+/** Detect free variable `module`. */
+var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+
+/** Detect the popular CommonJS extension `module.exports`. */
+var moduleExports = freeModule && freeModule.exports === freeExports;
+
+/** Detect free variable `process` from Node.js. */
+var freeProcess = moduleExports && freeGlobal.process;
+
+/** Used to access faster Node.js helpers. */
+var nodeUtil = (function () {
+ try {
+ return freeProcess && freeProcess.binding('util');
+ } catch (e) {
+ }
+}());
+
+/* Node.js helper references. */
+var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+
+/**
+ * Adds the key-value `pair` to `map`.
+ *
+ * @private
+ * @param {Object} map The map to modify.
+ * @param {Array} pair The key-value pair to add.
+ * @returns {Object} Returns `map`.
+ */
+function addMapEntry(map, pair) {
+ // Don't return `map.set` because it's not chainable in IE 11.
+ map.set(pair[0], pair[1]);
+ return map;
+}
+
+/**
+ * Adds `value` to `set`.
+ *
+ * @private
+ * @param {Object} set The set to modify.
+ * @param {*} value The value to add.
+ * @returns {Object} Returns `set`.
+ */
+function addSetEntry(set, value) {
+ // Don't return `set.add` because it's not chainable in IE 11.
+ set.add(value);
+ return set;
+}
+
+/**
+ * A faster alternative to `Function#apply`, this function invokes `func`
+ * with the `this` binding of `thisArg` and the arguments of `args`.
+ *
+ * @private
+ * @param {Function} func The function to invoke.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} args The arguments to invoke `func` with.
+ * @returns {*} Returns the result of `func`.
+ */
+function apply(func, thisArg, args) {
+ switch (args.length) {
+ case 0:
+ return func.call(thisArg);
+ case 1:
+ return func.call(thisArg, args[0]);
+ case 2:
+ return func.call(thisArg, args[0], args[1]);
+ case 3:
+ return func.call(thisArg, args[0], args[1], args[2]);
+ }
+ return func.apply(thisArg, args);
+}
+
+/**
+ * A specialized version of `_.forEach` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+function arrayEach(array, iteratee) {
+ var index = -1,
+ length = array ? array.length : 0;
+
+ while (++index < length) {
+ if (iteratee(array[index], index, array) === false) {
+ break;
+ }
+ }
+ return array;
+}
+
+/**
+ * Appends the elements of `values` to `array`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
+ */
+function arrayPush(array, values) {
+ var index = -1,
+ length = values.length,
+ offset = array.length;
+
+ while (++index < length) {
+ array[offset + index] = values[index];
+ }
+ return array;
+}
+
+/**
+ * A specialized version of `_.reduce` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the first element of `array` as
+ * the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+function arrayReduce(array, iteratee, accumulator, initAccum) {
+ var index = -1,
+ length = array ? array.length : 0;
+
+ if (initAccum && length) {
+ accumulator = array[++index];
+ }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array[index], index, array);
+ }
+ return accumulator;
+}
+
+/**
+ * The base implementation of `_.times` without support for iteratee shorthands
+ * or max array length checks.
+ *
+ * @private
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the array of results.
+ */
+function baseTimes(n, iteratee) {
+ var index = -1,
+ result = Array(n);
+
+ while (++index < n) {
+ result[index] = iteratee(index);
+ }
+ return result;
+}
+
+/**
+ * The base implementation of `_.unary` without support for storing metadata.
+ *
+ * @private
+ * @param {Function} func The function to cap arguments for.
+ * @returns {Function} Returns the new capped function.
+ */
+function baseUnary(func) {
+ return function (value) {
+ return func(value);
+ };
+}
+
+/**
+ * Gets the value at `key` of `object`.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
+function getValue(object, key) {
+ return object == null ? undefined : object[key];
+}
+
+/**
+ * Checks if `value` is a host object in IE < 9.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
+ */
+function isHostObject(value) {
+ // Many host objects are `Object` objects that can coerce to strings
+ // despite having improperly defined `toString` methods.
+ var result = false;
+ if (value != null && typeof value.toString != 'function') {
+ try {
+ result = !!(value + '');
+ } catch (e) {
+ }
+ }
+ return result;
+}
+
+/**
+ * Converts `map` to its key-value pairs.
+ *
+ * @private
+ * @param {Object} map The map to convert.
+ * @returns {Array} Returns the key-value pairs.
+ */
+function mapToArray(map) {
+ var index = -1,
+ result = Array(map.size);
+
+ map.forEach(function (value, key) {
+ result[++index] = [key, value];
+ });
+ return result;
+}
+
+/**
+ * Creates a unary function that invokes `func` with its argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+function overArg(func, transform) {
+ return function (arg) {
+ return func(transform(arg));
+ };
+}
+
+/**
+ * Converts `set` to an array of its values.
+ *
+ * @private
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the values.
+ */
+function setToArray(set) {
+ var index = -1,
+ result = Array(set.size);
+
+ set.forEach(function (value) {
+ result[++index] = value;
+ });
+ return result;
+}
+
+/** Used for built-in method references. */
+var arrayProto = Array.prototype,
+ funcProto = Function.prototype,
+ objectProto = Object.prototype;
+
+/** Used to detect overreaching core-js shims. */
+var coreJsData = root['__core-js_shared__'];
+
+/** Used to detect methods masquerading as native. */
+var maskSrcKey = (function () {
+ var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+ return uid ? ('Symbol(src)_1.' + uid) : '';
+}());
+
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/** Used to infer the `Object` constructor. */
+var objectCtorString = funcToString.call(Object);
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+ funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/** Built-in value references. */
+var Buffer = moduleExports ? root.Buffer : undefined,
+ Symbol = root.Symbol,
+ Uint8Array = root.Uint8Array,
+ getPrototype = overArg(Object.getPrototypeOf, Object),
+ objectCreate = Object.create,
+ propertyIsEnumerable = objectProto.propertyIsEnumerable,
+ splice = arrayProto.splice;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols = Object.getOwnPropertySymbols,
+ nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
+ nativeKeys = overArg(Object.keys, Object),
+ nativeMax = Math.max;
+
+/* Built-in method references that are verified to be native. */
+var DataView = getNative(root, 'DataView'),
+ Map = getNative(root, 'Map'),
+ Promise = getNative(root, 'Promise'),
+ Set = getNative(root, 'Set'),
+ WeakMap = getNative(root, 'WeakMap'),
+ nativeCreate = getNative(Object, 'create');
+
+/** Used to detect maps, sets, and weakmaps. */
+var dataViewCtorString = toSource(DataView),
+ mapCtorString = toSource(Map),
+ promiseCtorString = toSource(Promise),
+ setCtorString = toSource(Set),
+ weakMapCtorString = toSource(WeakMap);
+
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined,
+ symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+
+/**
+ * Creates a hash object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Hash(entries) {
+ var index = -1,
+ length = entries ? entries.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+}
+
+/**
+ * Removes all key-value entries from the hash.
+ *
+ * @private
+ * @name clear
+ * @memberOf Hash
+ */
+function hashClear() {
+ this.__data__ = nativeCreate ? nativeCreate(null) : {};
+}
+
+/**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @name delete
+ * @memberOf Hash
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function hashDelete(key) {
+ return this.has(key) && delete this.__data__[key];
+}
+
+/**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Hash
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function hashGet(key) {
+ var data = this.__data__;
+ if (nativeCreate) {
+ var result = data[key];
+ return result === HASH_UNDEFINED ? undefined : result;
+ }
+ return hasOwnProperty.call(data, key) ? data[key] : undefined;
+}
+
+/**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Hash
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function hashHas(key) {
+ var data = this.__data__;
+ return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
+}
+
+/**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Hash
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the hash instance.
+ */
+function hashSet(key, value) {
+ var data = this.__data__;
+ data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
+ return this;
+}
+
+// Add methods to `Hash`.
+Hash.prototype.clear = hashClear;
+Hash.prototype['delete'] = hashDelete;
+Hash.prototype.get = hashGet;
+Hash.prototype.has = hashHas;
+Hash.prototype.set = hashSet;
+
+/**
+ * Creates an list cache object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function ListCache(entries) {
+ var index = -1,
+ length = entries ? entries.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+}
+
+/**
+ * Removes all key-value entries from the list cache.
+ *
+ * @private
+ * @name clear
+ * @memberOf ListCache
+ */
+function listCacheClear() {
+ this.__data__ = [];
+}
+
+/**
+ * Removes `key` and its value from the list cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf ListCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function listCacheDelete(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ if (index < 0) {
+ return false;
+ }
+ var lastIndex = data.length - 1;
+ if (index == lastIndex) {
+ data.pop();
+ } else {
+ splice.call(data, index, 1);
+ }
+ return true;
+}
+
+/**
+ * Gets the list cache value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf ListCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function listCacheGet(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ return index < 0 ? undefined : data[index][1];
+}
+
+/**
+ * Checks if a list cache value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf ListCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function listCacheHas(key) {
+ return assocIndexOf(this.__data__, key) > -1;
+}
+
+/**
+ * Sets the list cache `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf ListCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the list cache instance.
+ */
+function listCacheSet(key, value) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ if (index < 0) {
+ data.push([key, value]);
+ } else {
+ data[index][1] = value;
+ }
+ return this;
+}
+
+// Add methods to `ListCache`.
+ListCache.prototype.clear = listCacheClear;
+ListCache.prototype['delete'] = listCacheDelete;
+ListCache.prototype.get = listCacheGet;
+ListCache.prototype.has = listCacheHas;
+ListCache.prototype.set = listCacheSet;
+
+/**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function MapCache(entries) {
+ var index = -1,
+ length = entries ? entries.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+}
+
+/**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
+function mapCacheClear() {
+ this.__data__ = {
+ 'hash': new Hash,
+ 'map': new (Map || ListCache),
+ 'string': new Hash
+ };
+}
+
+/**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function mapCacheDelete(key) {
+ return getMapData(this, key)['delete'](key);
+}
+
+/**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function mapCacheGet(key) {
+ return getMapData(this, key).get(key);
+}
+
+/**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function mapCacheHas(key) {
+ return getMapData(this, key).has(key);
+}
+
+/**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache instance.
+ */
+function mapCacheSet(key, value) {
+ getMapData(this, key).set(key, value);
+ return this;
+}
+
+// Add methods to `MapCache`.
+MapCache.prototype.clear = mapCacheClear;
+MapCache.prototype['delete'] = mapCacheDelete;
+MapCache.prototype.get = mapCacheGet;
+MapCache.prototype.has = mapCacheHas;
+MapCache.prototype.set = mapCacheSet;
+
+/**
+ * Creates a stack cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Stack(entries) {
+ this.__data__ = new ListCache(entries);
+}
+
+/**
+ * Removes all key-value entries from the stack.
+ *
+ * @private
+ * @name clear
+ * @memberOf Stack
+ */
+function stackClear() {
+ this.__data__ = new ListCache;
+}
+
+/**
+ * Removes `key` and its value from the stack.
+ *
+ * @private
+ * @name delete
+ * @memberOf Stack
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function stackDelete(key) {
+ return this.__data__['delete'](key);
+}
+
+/**
+ * Gets the stack value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Stack
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function stackGet(key) {
+ return this.__data__.get(key);
+}
+
+/**
+ * Checks if a stack value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Stack
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function stackHas(key) {
+ return this.__data__.has(key);
+}
+
+/**
+ * Sets the stack `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Stack
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the stack cache instance.
+ */
+function stackSet(key, value) {
+ var cache = this.__data__;
+ if (cache instanceof ListCache) {
+ var pairs = cache.__data__;
+ if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+ pairs.push([key, value]);
+ return this;
+ }
+ cache = this.__data__ = new MapCache(pairs);
+ }
+ cache.set(key, value);
+ return this;
+}
+
+// Add methods to `Stack`.
+Stack.prototype.clear = stackClear;
+Stack.prototype['delete'] = stackDelete;
+Stack.prototype.get = stackGet;
+Stack.prototype.has = stackHas;
+Stack.prototype.set = stackSet;
+
+/**
+ * Creates an array of the enumerable property names of the array-like `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @param {boolean} inherited Specify returning inherited property names.
+ * @returns {Array} Returns the array of property names.
+ */
+function arrayLikeKeys(value, inherited) {
+ // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
+ // Safari 9 makes `arguments.length` enumerable in strict mode.
+ var result = (isArray(value) || isArguments(value))
+ ? baseTimes(value.length, String)
+ : [];
+
+ var length = result.length,
+ skipIndexes = !!length;
+
+ for (var key in value) {
+ if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * This function is like `assignValue` except that it doesn't assign
+ * `undefined` values.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function assignMergeValue(object, key, value) {
+ if ((value !== undefined && !eq(object[key], value)) ||
+ (typeof key == 'number' && value === undefined && !(key in object))) {
+ object[key] = value;
+ }
+}
+
+/**
+ * Assigns `value` to `key` of `object` if the existing value is not equivalent
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function assignValue(object, key, value) {
+ var objValue = object[key];
+ if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
+ (value === undefined && !(key in object))) {
+ object[key] = value;
+ }
+}
+
+/**
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function assocIndexOf(array, key) {
+ var length = array.length;
+ while (length--) {
+ if (eq(array[length][0], key)) {
+ return length;
+ }
+ }
+ return -1;
+}
+
+/**
+ * The base implementation of `_.assign` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssign(object, source) {
+ return object && copyObject(source, keys(source), object);
+}
+
+/**
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+ * traversed objects.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @param {boolean} [isFull] Specify a clone including symbols.
+ * @param {Function} [customizer] The function to customize cloning.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The parent object of `value`.
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+ * @returns {*} Returns the cloned value.
+ */
+function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
+ var result;
+ if (customizer) {
+ result = object ? customizer(value, key, object, stack) : customizer(value);
+ }
+ if (result !== undefined) {
+ return result;
+ }
+ if (!isObject(value)) {
+ return value;
+ }
+ var isArr = isArray(value);
+ if (isArr) {
+ result = initCloneArray(value);
+ if (!isDeep) {
+ return copyArray(value, result);
+ }
+ } else {
+ var tag = getTag(value),
+ isFunc = tag == funcTag || tag == genTag;
+
+ if (isBuffer(value)) {
+ return cloneBuffer(value, isDeep);
+ }
+ if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
+ if (isHostObject(value)) {
+ return object ? value : {};
+ }
+ result = initCloneObject(isFunc ? {} : value);
+ if (!isDeep) {
+ return copySymbols(value, baseAssign(result, value));
+ }
+ } else {
+ if (!cloneableTags[tag]) {
+ return object ? value : {};
+ }
+ result = initCloneByTag(value, tag, baseClone, isDeep);
+ }
+ }
+ // Check for circular references and return its corresponding clone.
+ stack || (stack = new Stack);
+ var stacked = stack.get(value);
+ if (stacked) {
+ return stacked;
+ }
+ stack.set(value, result);
+
+ if (!isArr) {
+ var props = isFull ? getAllKeys(value) : keys(value);
+ }
+ arrayEach(props || value, function (subValue, key) {
+ if (props) {
+ key = subValue;
+ subValue = value[key];
+ }
+ // Recursively populate clone (susceptible to call stack limits).
+ assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
+ });
+ return result;
+}
+
+/**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+function baseCreate(proto) {
+ return isObject(proto) ? objectCreate(proto) : {};
+}
+
+/**
+ * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+ * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+ * symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @param {Function} symbolsFunc The function to get the symbols of `object`.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+ var result = keysFunc(object);
+ return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+}
+
+/**
+ * The base implementation of `getTag`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+function baseGetTag(value) {
+ return objectToString.call(value);
+}
+
+/**
+ * The base implementation of `_.isNative` without bad shim checks.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ * else `false`.
+ */
+function baseIsNative(value) {
+ if (!isObject(value) || isMasked(value)) {
+ return false;
+ }
+ var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
+ return pattern.test(toSource(value));
+}
+
+/**
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ */
+function baseIsTypedArray(value) {
+ return isObjectLike(value) &&
+ isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
+}
+
+/**
+ * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function baseKeys(object) {
+ if (!isPrototype(object)) {
+ return nativeKeys(object);
+ }
+ var result = [];
+ for (var key in Object(object)) {
+ if (hasOwnProperty.call(object, key) && key != 'constructor') {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function baseKeysIn(object) {
+ if (!isObject(object)) {
+ return nativeKeysIn(object);
+ }
+ var isProto = isPrototype(object),
+ result = [];
+
+ for (var key in object) {
+ if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * The base implementation of `_.merge` without support for multiple sources.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ * counterparts.
+ */
+function baseMerge(object, source, srcIndex, customizer, stack) {
+ if (object === source) {
+ return;
+ }
+ if (!(isArray(source) || isTypedArray(source))) {
+ var props = baseKeysIn(source);
+ }
+ arrayEach(props || source, function (srcValue, key) {
+ if (props) {
+ key = srcValue;
+ srcValue = source[key];
+ }
+ if (isObject(srcValue)) {
+ stack || (stack = new Stack);
+ baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+ }
+ else {
+ var newValue = customizer
+ ? customizer(object[key], srcValue, (key + ''), object, source, stack)
+ : undefined;
+
+ if (newValue === undefined) {
+ newValue = srcValue;
+ }
+ assignMergeValue(object, key, newValue);
+ }
+ });
+}
+
+/**
+ * A specialized version of `baseMerge` for arrays and objects which performs
+ * deep merges and tracks traversed objects enabling objects with circular
+ * references to be merged.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {string} key The key of the value to merge.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} mergeFunc The function to merge values.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ * counterparts.
+ */
+function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+ var objValue = object[key],
+ srcValue = source[key],
+ stacked = stack.get(srcValue);
+
+ if (stacked) {
+ assignMergeValue(object, key, stacked);
+ return;
+ }
+ var newValue = customizer
+ ? customizer(objValue, srcValue, (key + ''), object, source, stack)
+ : undefined;
+
+ var isCommon = newValue === undefined;
+
+ if (isCommon) {
+ newValue = srcValue;
+ if (isArray(srcValue) || isTypedArray(srcValue)) {
+ if (isArray(objValue)) {
+ newValue = objValue;
+ }
+ else if (isArrayLikeObject(objValue)) {
+ newValue = copyArray(objValue);
+ }
+ else {
+ isCommon = false;
+ newValue = baseClone(srcValue, true);
+ }
+ }
+ else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+ if (isArguments(objValue)) {
+ newValue = toPlainObject(objValue);
+ }
+ else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
+ isCommon = false;
+ newValue = baseClone(srcValue, true);
+ }
+ else {
+ newValue = objValue;
+ }
+ }
+ else {
+ isCommon = false;
+ }
+ }
+ if (isCommon) {
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, newValue);
+ mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+ stack['delete'](srcValue);
+ }
+ assignMergeValue(object, key, newValue);
+}
+
+/**
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ */
+function baseRest(func, start) {
+ start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+ return function () {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ array = Array(length);
+
+ while (++index < length) {
+ array[index] = args[start + index];
+ }
+ index = -1;
+ var otherArgs = Array(start + 1);
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = array;
+ return apply(func, this, otherArgs);
+ };
+}
+
+/**
+ * Creates a clone of `buffer`.
+ *
+ * @private
+ * @param {Buffer} buffer The buffer to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Buffer} Returns the cloned buffer.
+ */
+function cloneBuffer(buffer, isDeep) {
+ if (isDeep) {
+ return buffer.slice();
+ }
+ var result = new buffer.constructor(buffer.length);
+ buffer.copy(result);
+ return result;
+}
+
+/**
+ * Creates a clone of `arrayBuffer`.
+ *
+ * @private
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */
+function cloneArrayBuffer(arrayBuffer) {
+ var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+ new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+ return result;
+}
+
+/**
+ * Creates a clone of `dataView`.
+ *
+ * @private
+ * @param {Object} dataView The data view to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned data view.
+ */
+function cloneDataView(dataView, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+ return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+}
+
+/**
+ * Creates a clone of `map`.
+ *
+ * @private
+ * @param {Object} map The map to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned map.
+ */
+function cloneMap(map, isDeep, cloneFunc) {
+ var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);
+ return arrayReduce(array, addMapEntry, new map.constructor);
+}
+
+/**
+ * Creates a clone of `regexp`.
+ *
+ * @private
+ * @param {Object} regexp The regexp to clone.
+ * @returns {Object} Returns the cloned regexp.
+ */
+function cloneRegExp(regexp) {
+ var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+ result.lastIndex = regexp.lastIndex;
+ return result;
+}
+
+/**
+ * Creates a clone of `set`.
+ *
+ * @private
+ * @param {Object} set The set to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned set.
+ */
+function cloneSet(set, isDeep, cloneFunc) {
+ var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);
+ return arrayReduce(array, addSetEntry, new set.constructor);
+}
+
+/**
+ * Creates a clone of the `symbol` object.
+ *
+ * @private
+ * @param {Object} symbol The symbol object to clone.
+ * @returns {Object} Returns the cloned symbol object.
+ */
+function cloneSymbol(symbol) {
+ return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+}
+
+/**
+ * Creates a clone of `typedArray`.
+ *
+ * @private
+ * @param {Object} typedArray The typed array to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned typed array.
+ */
+function cloneTypedArray(typedArray, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+ return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+}
+
+/**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
+function copyArray(source, array) {
+ var index = -1,
+ length = source.length;
+
+ array || (array = Array(length));
+ while (++index < length) {
+ array[index] = source[index];
+ }
+ return array;
+}
+
+/**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property identifiers to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @param {Function} [customizer] The function to customize copied values.
+ * @returns {Object} Returns `object`.
+ */
+function copyObject(source, props, object, customizer) {
+ object || (object = {});
+
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+
+ var newValue = customizer
+ ? customizer(object[key], source[key], key, object, source)
+ : undefined;
+
+ assignValue(object, key, newValue === undefined ? source[key] : newValue);
+ }
+ return object;
+}
+
+/**
+ * Copies own symbol properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
+ */
+function copySymbols(source, object) {
+ return copyObject(source, getSymbols(source), object);
+}
+
+/**
+ * Creates a function like `_.assign`.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @returns {Function} Returns the new assigner function.
+ */
+function createAssigner(assigner) {
+ return baseRest(function (object, sources) {
+ var index = -1,
+ length = sources.length,
+ customizer = length > 1 ? sources[length - 1] : undefined,
+ guard = length > 2 ? sources[2] : undefined;
+
+ customizer = (assigner.length > 3 && typeof customizer == 'function')
+ ? (length--, customizer)
+ : undefined;
+
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+ customizer = length < 3 ? undefined : customizer;
+ length = 1;
+ }
+ object = Object(object);
+ while (++index < length) {
+ var source = sources[index];
+ if (source) {
+ assigner(object, source, index, customizer);
+ }
+ }
+ return object;
+ });
+}
+
+/**
+ * Creates an array of own enumerable property names and symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+function getAllKeys(object) {
+ return baseGetAllKeys(object, keys, getSymbols);
+}
+
+/**
+ * Gets the data for `map`.
+ *
+ * @private
+ * @param {Object} map The map to query.
+ * @param {string} key The reference key.
+ * @returns {*} Returns the map data.
+ */
+function getMapData(map, key) {
+ var data = map.__data__;
+ return isKeyable(key)
+ ? data[typeof key == 'string' ? 'string' : 'hash']
+ : data.map;
+}
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+ var value = getValue(object, key);
+ return baseIsNative(value) ? value : undefined;
+}
+
+/**
+ * Creates an array of the own enumerable symbol properties of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
+var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;
+
+/**
+ * Gets the `toStringTag` of `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+var getTag = baseGetTag;
+
+// Fallback for data views, maps, sets, and weak maps in IE 11,
+// for data views in Edge < 14, and promises in Node.js.
+if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
+ (Map && getTag(new Map) != mapTag) ||
+ (Promise && getTag(Promise.resolve()) != promiseTag) ||
+ (Set && getTag(new Set) != setTag) ||
+ (WeakMap && getTag(new WeakMap) != weakMapTag)) {
+ getTag = function (value) {
+ var result = objectToString.call(value),
+ Ctor = result == objectTag ? value.constructor : undefined,
+ ctorString = Ctor ? toSource(Ctor) : undefined;
+
+ if (ctorString) {
+ switch (ctorString) {
+ case dataViewCtorString:
+ return dataViewTag;
+ case mapCtorString:
+ return mapTag;
+ case promiseCtorString:
+ return promiseTag;
+ case setCtorString:
+ return setTag;
+ case weakMapCtorString:
+ return weakMapTag;
+ }
+ }
+ return result;
+ };
+}
+
+/**
+ * Initializes an array clone.
+ *
+ * @private
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
+ */
+function initCloneArray(array) {
+ var length = array.length,
+ result = array.constructor(length);
+
+ // Add properties assigned by `RegExp#exec`.
+ if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+ result.index = array.index;
+ result.input = array.input;
+ }
+ return result;
+}
+
+/**
+ * Initializes an object clone.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+function initCloneObject(object) {
+ return (typeof object.constructor == 'function' && !isPrototype(object))
+ ? baseCreate(getPrototype(object))
+ : {};
+}
+
+/**
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+function initCloneByTag(object, tag, cloneFunc, isDeep) {
+ var Ctor = object.constructor;
+ switch (tag) {
+ case arrayBufferTag:
+ return cloneArrayBuffer(object);
+
+ case boolTag:
+ case dateTag:
+ return new Ctor(+object);
+
+ case dataViewTag:
+ return cloneDataView(object, isDeep);
+
+ case float32Tag:
+ case float64Tag:
+ case int8Tag:
+ case int16Tag:
+ case int32Tag:
+ case uint8Tag:
+ case uint8ClampedTag:
+ case uint16Tag:
+ case uint32Tag:
+ return cloneTypedArray(object, isDeep);
+
+ case mapTag:
+ return cloneMap(object, isDeep, cloneFunc);
+
+ case numberTag:
+ case stringTag:
+ return new Ctor(object);
+
+ case regexpTag:
+ return cloneRegExp(object);
+
+ case setTag:
+ return cloneSet(object, isDeep, cloneFunc);
+
+ case symbolTag:
+ return cloneSymbol(object);
+ }
+}
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return !!length &&
+ (typeof value == 'number' || reIsUint.test(value)) &&
+ (value > -1 && value % 1 == 0 && value < length);
+}
+
+/**
+ * Checks if the given arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+ * else `false`.
+ */
+function isIterateeCall(value, index, object) {
+ if (!isObject(object)) {
+ return false;
+ }
+ var type = typeof index;
+ if (type == 'number'
+ ? (isArrayLike(object) && isIndex(index, object.length))
+ : (type == 'string' && index in object)
+ ) {
+ return eq(object[index], value);
+ }
+ return false;
+}
+
+/**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
+function isKeyable(value) {
+ var type = typeof value;
+ return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
+ ? (value !== '__proto__')
+ : (value === null);
+}
+
+/**
+ * Checks if `func` has its source masked.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+ */
+function isMasked(func) {
+ return !!maskSrcKey && (maskSrcKey in func);
+}
+
+/**
+ * Checks if `value` is likely a prototype object.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+ */
+function isPrototype(value) {
+ var Ctor = value && value.constructor,
+ proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+
+ return value === proto;
+}
+
+/**
+ * This function is like
+ * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * except that it includes inherited enumerable properties.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function nativeKeysIn(object) {
+ var result = [];
+ if (object != null) {
+ for (var key in Object(object)) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * Converts `func` to its source code.
+ *
+ * @private
+ * @param {Function} func The function to process.
+ * @returns {string} Returns the source code.
+ */
+function toSource(func) {
+ if (func != null) {
+ try {
+ return funcToString.call(func);
+ } catch (e) {
+ }
+ try {
+ return (func + '');
+ } catch (e) {
+ }
+ }
+ return '';
+}
+
+/**
+ * Performs a
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
+ */
+function eq(value, other) {
+ return value === other || (value !== value && other !== other);
+}
+
+/**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ * else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+function isArguments(value) {
+ // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
+ return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
+ (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
+}
+
+/**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+var isArray = Array.isArray;
+
+/**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+function isArrayLike(value) {
+ return value != null && isLength(value.length) && !isFunction(value);
+}
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ * else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+ return isObjectLike(value) && isArrayLike(value);
+}
+
+/**
+ * Checks if `value` is a buffer.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+ * @example
+ *
+ * _.isBuffer(new Buffer(2));
+ * // => true
+ *
+ * _.isBuffer(new Uint8Array(2));
+ * // => false
+ */
+var isBuffer = nativeIsBuffer || stubFalse;
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in Safari 8-9 which returns 'object' for typed array and other constructors.
+ var tag = isObject(value) ? objectToString.call(value) : '';
+ return tag == funcTag || tag == genTag;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+function isLength(value) {
+ return typeof value == 'number' &&
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+/**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.8.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */
+function isPlainObject(value) {
+ if (!isObjectLike(value) ||
+ objectToString.call(value) != objectTag || isHostObject(value)) {
+ return false;
+ }
+ var proto = getPrototype(value);
+ if (proto === null) {
+ return true;
+ }
+ var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+ return (typeof Ctor == 'function' &&
+ Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);
+}
+
+/**
+ * Checks if `value` is classified as a typed array.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ * @example
+ *
+ * _.isTypedArray(new Uint8Array);
+ * // => true
+ *
+ * _.isTypedArray([]);
+ * // => false
+ */
+var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+
+/**
+ * Converts `value` to a plain object flattening inherited enumerable string
+ * keyed properties of `value` to own properties of the plain object.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Object} Returns the converted plain object.
+ * @example
+ *
+ * function Foo() {
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.assign({ 'a': 1 }, new Foo);
+ * // => { 'a': 1, 'b': 2 }
+ *
+ * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ * // => { 'a': 1, 'b': 2, 'c': 3 }
+ */
+function toPlainObject(value) {
+ return copyObject(value, keysIn(value));
+}
+
+/**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+function keys(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+}
+
+/**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
+function keysIn(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+}
+
+/**
+ * This method is like `_.assign` except that it recursively merges own and
+ * inherited enumerable string keyed properties of source objects into the
+ * destination object. Source properties that resolve to `undefined` are
+ * skipped if a destination value exists. Array and plain object properties
+ * are merged recursively. Other objects and value types are overridden by
+ * assignment. Source objects are applied from left to right. Subsequent
+ * sources overwrite property assignments of previous sources.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {
+ * 'a': [{ 'b': 2 }, { 'd': 4 }]
+ * };
+ *
+ * var other = {
+ * 'a': [{ 'c': 3 }, { 'e': 5 }]
+ * };
+ *
+ * _.merge(object, other);
+ * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+ */
+var merge = createAssigner(function (object, source, srcIndex) {
+ baseMerge(object, source, srcIndex);
+});
+
+/**
+ * This method returns a new empty array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {Array} Returns the new empty array.
+ * @example
+ *
+ * var arrays = _.times(2, _.stubArray);
+ *
+ * console.log(arrays);
+ * // => [[], []]
+ *
+ * console.log(arrays[0] === arrays[1]);
+ * // => false
+ */
+function stubArray() {
+ return [];
+}
+
+/**
+ * This method returns `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {boolean} Returns `false`.
+ * @example
+ *
+ * _.times(2, _.stubFalse);
+ * // => [false, false]
+ */
+function stubFalse() {
+ return false;
+}
+
+module.exports = merge;
diff --git a/scripts/tags/button.js b/scripts/tags/button.js
new file mode 100644
index 0000000000..dfc0962021
--- /dev/null
+++ b/scripts/tags/button.js
@@ -0,0 +1,31 @@
+/* global hexo */
+// Usage: {% button /path/to/url/, text, icon [class], title %}
+// Alias: {% btn /path/to/url/, text, icon [class], title %}
+
+function postButton(args) {
+ args = args.join(' ').split(',');
+ var url = args[0];
+ var text = args[1] || '';
+ var icon = args[2] || '';
+ var title = args[3] || '';
+
+ if (!url) {
+ hexo.log.warn('URL can NOT be empty');
+ }
+
+ text = text.trim();
+ icon = icon.trim();
+ title = title.trim();
+
+ var result = [' 0 && result.push(' title="' + title + '"');
+ result.push('>');
+ icon.length > 0 && result.push('');
+ text.length > 0 && result.push(text);
+ result.push('');
+
+ return result.join('');
+}
+
+hexo.extend.tag.register('button', postButton);
+hexo.extend.tag.register('btn', postButton);
diff --git a/scripts/tags/center-quote.js b/scripts/tags/center-quote.js
new file mode 100644
index 0000000000..93c5258395
--- /dev/null
+++ b/scripts/tags/center-quote.js
@@ -0,0 +1,12 @@
+/* global hexo */
+// Usage: {% centerquote %} Something {% endcenterquote %}
+// Alias: {% cq %} Something {% endcq %}
+
+function centerQuote (args, content) {
+ return '' +
+ hexo.render.renderSync({text: content, engine: 'markdown'}) +
+ '
';
+}
+
+hexo.extend.tag.register('centerquote', centerQuote, {ends: true});
+hexo.extend.tag.register('cq', centerQuote, {ends: true});
diff --git a/scripts/tags/exturl.js b/scripts/tags/exturl.js
new file mode 100644
index 0000000000..901a9cef4a
--- /dev/null
+++ b/scripts/tags/exturl.js
@@ -0,0 +1,59 @@
+/* global hexo */
+// Usage: {% exturl text url "title" %}
+// Alias: {% extlink text url "title" %}
+
+'use strict';
+
+/*jshint camelcase: false */
+var util = require('hexo-util');
+/*jshint camelcase: true */
+var htmlTag = util.htmlTag;
+
+var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/;
+
+// Create Base64 Object
+var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};
+
+function extURL(args, content) {
+ var exturl = 'exturl';
+ var url = '';
+ var text = [''];
+ var title = '';
+ var item = '';
+ var i = 0;
+ var len = args.length;
+
+ // Find link URL and text
+ for (; i < len; i++) {
+ item = args[i];
+
+ if (rUrl.test(item)) {
+ url = Base64.encode(item);
+ break;
+ } else {
+ text.push(item);
+ }
+ }
+
+ // Delete link URL and text from arguments
+ args = args.slice(i + 1);
+
+ // Check if the link should be open in a new window
+ // and collect the last text as the link title
+ if (args.length) {
+ var shift = args[0];
+ title = args.join(' ');
+ }
+
+ var attrs = {
+ class: exturl,
+ 'data-url': url,
+ title: title
+ };
+
+ //console.log(url);
+ return htmlTag('span', attrs, text.join(' '));
+}
+
+hexo.extend.tag.register('exturl', extURL, {ends: false});
+hexo.extend.tag.register('extlink', extURL, {ends: false});
diff --git a/scripts/tags/full-image.js b/scripts/tags/full-image.js
new file mode 100644
index 0000000000..d4e0e4f9b2
--- /dev/null
+++ b/scripts/tags/full-image.js
@@ -0,0 +1,26 @@
+/* global hexo */
+// Usage: {% fullimage /path/to/image, alt, title %}
+// Alias: {% fi /path/to/image, alt, title %}
+
+function fullImage(args) {
+ args = args.join(' ').split(',');
+ var src = args[0];
+ var alt = args[1] || '';
+ var title = args[2] || '';
+
+ if (!src) {
+ hexo.log.warn('Image src can NOT be empty');
+ }
+ alt = alt.trim();
+ title = title.trim();
+
+ var image = [' 0 && image.push('alt="' + alt + '"');
+ title.length > 0 && image.push('title="' + title + '"');
+ image.push('/>');
+
+ return image.join(' ');
+}
+
+hexo.extend.tag.register('fullimage', fullImage);
+hexo.extend.tag.register('fi', fullImage);
diff --git a/scripts/tags/group-pictures.js b/scripts/tags/group-pictures.js
new file mode 100644
index 0000000000..df7774be2c
--- /dev/null
+++ b/scripts/tags/group-pictures.js
@@ -0,0 +1,833 @@
+/* global hexo */
+// Usage: {% grouppicture group-layout %}{% endgrouppicture %}
+// Alias: {% gp group-layout %}{% endgp %}
+
+function groupPicture(args, content) {
+ args = args[0].split('-');
+ var group = parseInt(args[0]);
+ var layout = parseInt(args[1]);
+
+ content = hexo.render.renderSync({text: content, engine: 'markdown'});
+
+ var pictures = content.match(//g);
+
+ return '' +
+ templates.dispatch(pictures, group, layout) +
+ '';
+}
+
+var templates = {
+
+ dispatch: function (pictures, group, layout) {
+ var fn = 'group' + group + 'Layout' + layout;
+ fn = templates[fn] || templates.defaults;
+ return fn.call(templates, pictures);
+ },
+
+ /**
+ * 2-1
+ *
+ * □
+ * □
+ *
+ * @param pictures
+ * @returns {string}
+ */
+ group2Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1)
+ ]);
+ },
+
+ /**
+ * 2-2
+ *
+ * □ □
+ *
+ * @param pictures
+ */
+ group2Layout2: function (pictures) {
+ return this.getHTML(pictures);
+ },
+
+ /**
+ * 3-1
+ *
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group3Layout1: function (pictures) {
+ return this.getHTML(pictures);
+ },
+
+ /**
+ * 3-2
+ *
+ * □
+ * □ □
+ *
+ * @param pictures
+ */
+ group3Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1)
+ ]);
+ },
+
+ /**
+ * 3-3
+ *
+ * □ □
+ * □
+ *
+ * @param pictures
+ */
+ group3Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2)
+ ]);
+ },
+
+ /**
+ * 4-1
+ *
+ * □
+ * □ □
+ * □
+ *
+ * @param pictures
+ */
+ group4Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 4-2
+ *
+ * □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group4Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1)
+ ]);
+ },
+
+ /**
+ * 4-3
+ *
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group4Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2)
+ ]);
+ },
+
+ /**
+ * 4-4
+ *
+ * □ □ □
+ * □
+ *
+ * @param pictures
+ */
+ group4Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 5-1
+ *
+ * □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group5Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 5-2
+ *
+ * □ □
+ * □
+ * □ □
+ *
+ * @param pictures
+ */
+ group5Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 5-3
+ *
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group5Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2)
+ ]);
+ },
+
+ /**
+ * 5-4
+ *
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group5Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 6-1
+ *
+ * □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group6Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 6-2
+ *
+ * □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group6Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 6-3
+ *
+ * □ □
+ * □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group6Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 6-4
+ *
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group6Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 6-5
+ *
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group6Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 7-1
+ *
+ * □
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group7Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 7-2
+ *
+ * □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group7Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 7-3
+ *
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group7Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 7-4
+ *
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group7Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 7-5
+ *
+ * □ □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group7Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-1
+ *
+ * □
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group8Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-2
+ *
+ * □
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group8Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 8-3
+ *
+ * □
+ * □ □ □
+ * □ □
+ * □ □
+ * @param pictures
+ */
+ group8Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 8-4
+ *
+ * □ □
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group8Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 8-5
+ *
+ * □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group8Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-6
+ *
+ * □ □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group8Layout6: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-7
+ *
+ * □ □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group8Layout7: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-1
+ *
+ * □
+ * □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-2
+ *
+ * □
+ * □ □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-3
+ *
+ * □ □
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-4
+ *
+ * □ □
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group9Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 9-5
+ *
+ * □ □
+ * □ □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group9Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 9-6
+ *
+ * □ □ □
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group9Layout6: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 9-7
+ *
+ * □ □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout7: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 10-1
+ *
+ * □
+ * □ □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-2
+ *
+ * □ □
+ * □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-3
+ *
+ * □ □
+ * □ □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-4
+ *
+ * □ □
+ * □ □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group10Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5, 8),
+ pictures.slice(8)
+ ]);
+ },
+
+ /**
+ * 10-5
+ *
+ * □ □ □
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-6
+ *
+ * □ □ □
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group10Layout6: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5, 8),
+ pictures.slice(8)
+ ]);
+ },
+
+ /**
+ * 10-7
+ *
+ * □ □ □
+ * □ □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group10Layout7: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6, 8),
+ pictures.slice(8)
+ ]);
+ },
+
+ /**
+ * Defaults Layout
+ *
+ * □ □ □
+ * □ □ □
+ * ...
+ *
+ * @param pictures
+ */
+ defaults: function (pictures) {
+ var ROW_SIZE = 3;
+ var rows = pictures.length / ROW_SIZE + 1;
+ var pictureArr = [];
+
+ for (var i = 0; i < rows; i++) {
+ pictureArr.push(pictures.slice(i * ROW_SIZE, (i + 1) * ROW_SIZE));
+ }
+
+ return this.getHTML(pictureArr);
+ },
+
+ getHTML: function (rows) {
+ var rowHTML = '';
+
+ for (var i = 0; i < rows.length; i++) {
+ rowHTML += this.getRowHTML(rows[i]);
+ }
+
+ return '' + rowHTML + '';
+ },
+
+ getRowHTML: function (pictures) {
+ return (
+ '' +
+ this.getColumnHTML(pictures) +
+ ''
+ );
+ },
+
+ getColumnHTML: function (pictures) {
+ var columns = [];
+ var columnWidth = 100 / pictures.length;
+ var columnStyle = ' style="width: ' + columnWidth + '%;"';
+
+ for (var i = 0; i < pictures.length; i++) {
+ columns.push('' + pictures[i] + '');
+ }
+ return columns.join('');
+ }
+};
+
+hexo.extend.tag.register('grouppicture', groupPicture, {ends: true});
+hexo.extend.tag.register('gp', groupPicture, {ends: true});
diff --git a/scripts/tags/label.js b/scripts/tags/label.js
new file mode 100644
index 0000000000..57e54ddc30
--- /dev/null
+++ b/scripts/tags/label.js
@@ -0,0 +1,23 @@
+/**
+ * label.js | global hexo script.
+ *
+ * Usage:
+ *
+ * {% label [class]@Text %}
+ *
+ * [class] : default | primary | success | info | warning | danger.
+ * If not defined, default class will be selected.
+ */
+
+function postLabel (args) {
+ args = args.join(' ').split('@');
+ var classes = args[0] || 'default';
+ var text = args[1] || '';
+
+ classes = classes.trim();
+ !text && hexo.log.warn('Label text must be defined!');
+
+ return '' + text + '';
+}
+
+hexo.extend.tag.register('label', postLabel, { ends: false });
diff --git a/scripts/tags/lazy-image.js b/scripts/tags/lazy-image.js
new file mode 100644
index 0000000000..650d57a2cc
--- /dev/null
+++ b/scripts/tags/lazy-image.js
@@ -0,0 +1,26 @@
+/* global hexo */
+// Usage: {% lazyimage /path/to/image, alt, title %}
+// Alias: {% li /path/to/image, alt, title %}
+
+function lazyImage(args) {
+ args = args.join(' ').split(',');
+ var src = args[0];
+ var alt = args[1] || '';
+ var title = args[2] || '';
+
+ if (!src) {
+ hexo.log.warn('Image src can NOT be empty');
+ }
+ alt = alt.trim();
+ title = title.trim();
+
+ var image = [' 0 && image.push('alt="' + alt + '"');
+ title.length > 0 && image.push('title="' + title + '"');
+ image.push('/>');
+
+ return image.join(' ');
+}
+
+hexo.extend.tag.register('lazyimage', lazyImage);
+hexo.extend.tag.register('li', lazyImage);
diff --git a/scripts/tags/note.js b/scripts/tags/note.js
new file mode 100644
index 0000000000..a5690a30b3
--- /dev/null
+++ b/scripts/tags/note.js
@@ -0,0 +1,20 @@
+/**
+ * note.js | global hexo script.
+ *
+ * ATTENTION! No need to write this tag in 1 line if u don't want see probally bugs.
+ *
+ * Usage:
+ *
+ * {% note [class] %}
+ * Any content (support inline tags too).
+ * {% endnote %}
+ *
+ * [class] : default | primary | success | info | warning | danger.
+ * May be not defined.
+ */
+
+function bscallOut (args, content) {
+ return '' + hexo.render.renderSync({text: content, engine: 'markdown'}).trim() + '';
+}
+
+hexo.extend.tag.register('note', bscallOut, {ends: true});
diff --git a/scripts/tags/tabs.js b/scripts/tags/tabs.js
new file mode 100644
index 0000000000..9af8f68284
--- /dev/null
+++ b/scripts/tags/tabs.js
@@ -0,0 +1,78 @@
+/**
+ * tabs.js | global hexo script.
+ *
+ * Usage:
+ *
+ * {% tabs [Unique name], [index] %}
+ *
+ * Any content (support inline tags too).
+ *
+ * {% endtabs %}
+ *
+ * [Unique name] : Unique name of tabs block tag without comma.
+ * Will be used in #id's as prefix for each tab with their index numbers.
+ * If there are whitespaces in name, for generate #id all whitespaces will replaced by dashes.
+ * Only for current url of post/page must be unique!
+ * [index] : Index number of active tab.
+ * If not defined, first tab (1) will be selected.
+ * If index is -1, no tab will be selected. It's will be something like spoiler.
+ * May be not defined.
+ * [Tab caption] : Caption of current tab.
+ * If not caption specified, unique name with tab index suffix will be used as caption of tab.
+ * If not caption specified, but specified icon, caption will empty.
+ * May be not defined.
+ * [icon] : Font awesome icon.
+ * May be not defined.
+ */
+
+'use strict';
+
+ function postTabs (args, content) {
+ var tabBlock = /\n([\w\W\s\S]*?)/g;
+
+ var args = args.join(' ').split(',');
+ var tabName = args[0];
+ var tabActive = args[1] || '';
+
+ var matches = [];
+ var match;
+ var tabId = 0;
+ var tabNav = '';
+ var tabContent = '';
+
+ !tabName && hexo.log.warn('Tabs block must have unique name!');
+
+ while (match = tabBlock.exec(content)) {
+ matches.push(match[1]);
+ matches.push(match[2]);
+ }
+
+ for (var i = 0; i < matches.length; i += 2) {
+ var tabParameters = matches[i].split('@');
+ var postContent = matches[i + 1];
+ var tabCaption = tabParameters[0] || '';
+ var tabIcon = tabParameters[1] || '';
+ var tabHref = '';
+
+ postContent = hexo.render.renderSync({text: postContent, engine: 'markdown'});
+
+ tabId += 1;
+ tabHref = (tabName + ' ' + tabId).toLowerCase().split(' ').join('-');
+
+ ((tabCaption.length === 0) && (tabIcon.length === 0)) && (tabCaption = tabName + ' ' + tabId);
+
+ var isOnlyicon = (tabIcon.length > 0 && tabCaption.length === 0) ? 'style="text-align: center;' : '';
+ tabIcon.length > 0 && (tabIcon = '');
+
+ var isActive = ((tabActive.length > 0 && tabActive == tabId) || (tabActive.length === 0 && tabId == 1)) ? ' active' : '';
+ tabNav += '' + tabIcon + tabCaption + ' ';
+ tabContent += '' + postContent + '';
+ }
+
+ tabNav = ' ';
+ tabContent = '' + tabContent + '';
+
+ return '' + tabNav + tabContent + '';
+ }
+
+ hexo.extend.tag.register('tabs', postTabs, {ends: true});
diff --git a/source/css/_common/components/back-to-top-sidebar.styl b/source/css/_common/components/back-to-top-sidebar.styl
new file mode 100644
index 0000000000..d23d35d572
--- /dev/null
+++ b/source/css/_common/components/back-to-top-sidebar.styl
@@ -0,0 +1,25 @@
+.back-to-top {
+ display: none;
+ margin: 20px -10px -20px;
+ background: $body-bg-color;
+ font-size: $b2t-font-size;
+ opacity: $b2t-opacity;
+ cursor: pointer;
+ text-align: center;
+ -webkit-transform: translateZ(0);
+ the-transition();
+ &:hover { opacity: 0.8; }
+
+ +tablet() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+
+ &.back-to-top-on {
+ display: block;
+ }
+}
diff --git a/source/css/_common/components/back-to-top.styl b/source/css/_common/components/back-to-top.styl
new file mode 100644
index 0000000000..1ae463a7da
--- /dev/null
+++ b/source/css/_common/components/back-to-top.styl
@@ -0,0 +1,31 @@
+.back-to-top {
+ box-sizing: border-box;
+ position: fixed;
+ bottom: $b2t-position-bottom;
+ right: $b2t-position-right;
+ z-index: $zindex-5;
+ padding: 0 6px;
+ width: hexo-config('sidebar.scrollpercent') ? initial : 24px;
+ background: $b2t-bg-color;
+ font-size: $b2t-font-size;
+ opacity: $b2t-opacity;
+ color: $b2t-color;
+ cursor: pointer;
+ text-align: center;
+ -webkit-transform: translateZ(0);
+ transition-property: bottom;
+ the-transition();
+
+ +tablet() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+
+ &.back-to-top-on {
+ bottom: $b2t-position-bottom-on;
+ }
+}
diff --git a/source/css/_common/components/buttons.styl b/source/css/_common/components/buttons.styl
new file mode 100644
index 0000000000..771264651f
--- /dev/null
+++ b/source/css/_common/components/buttons.styl
@@ -0,0 +1,38 @@
+.btn {
+ display: inline-block;
+ padding: 0 20px;
+ font-size: $btn-default-font-size;
+ color: $btn-default-color;
+ background: $btn-default-bg;
+ border: $btn-default-border-width solid $btn-default-border-color;
+ text-decoration: none;
+ border-radius: $btn-default-radius;
+ transition-property: background-color;
+ the-transition();
+ line-height: 2;
+
+ &:hover {
+ border-color: $btn-default-hover-border-color;
+ color: $btn-default-hover-color;
+ background: $btn-default-hover-bg;
+ }
+
+ +.btn {
+ margin: 0 0 8px 8px;
+ }
+
+ .fa-fw {
+ width: (18em / 14);
+ text-align: left;
+ }
+}
+
+.btn-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ background: $text-color;
+ border-radius: 1px;
+
+ &+.btn-bar { margin-top: 4px; }
+}
diff --git a/source/css/_common/components/comments.styl b/source/css/_common/components/comments.styl
new file mode 100644
index 0000000000..bf3edb945c
--- /dev/null
+++ b/source/css/_common/components/comments.styl
@@ -0,0 +1 @@
+.comments { margin: 60px 20px 0; }
diff --git a/source/css/_common/components/components.styl b/source/css/_common/components/components.styl
new file mode 100644
index 0000000000..fe4a160d90
--- /dev/null
+++ b/source/css/_common/components/components.styl
@@ -0,0 +1,16 @@
+@import "highlight";
+@import "tags";
+
+@import "buttons";
+@import "pagination";
+@import "comments";
+@import "tag-cloud";
+@import hexo-config('sidebar.b2t') ? "back-to-top-sidebar" : "back-to-top";
+
+@import "header";
+@import "post";
+@import "sidebar";
+@import "footer";
+@import "third-party";
+
+@import "pages";
diff --git a/source/css/_common/components/footer/footer.styl b/source/css/_common/components/footer/footer.styl
new file mode 100644
index 0000000000..af7ce8c839
--- /dev/null
+++ b/source/css/_common/components/footer/footer.styl
@@ -0,0 +1,30 @@
+.footer {
+ font-size: 14px;
+ color: $grey-dark;
+
+ img { border: none; }
+}
+
+.footer-inner { text-align: center; }
+
+.with-love {
+ display: inline-block;
+ margin: 0 5px;
+}
+
+.powered-by,
+.theme-info { display: inline-block; }
+
+.cc-license {
+ margin-top: 10px;
+ text-align: center;
+
+ .cc-opacity {
+ opacity: 0.7;
+ border-bottom: none;
+
+ &:hover { opacity: 0.9; }
+ }
+
+ img { display: inline-block; }
+}
diff --git a/source/css/_common/components/header/header.styl b/source/css/_common/components/header/header.styl
new file mode 100644
index 0000000000..01f7f8af0a
--- /dev/null
+++ b/source/css/_common/components/header/header.styl
@@ -0,0 +1,9 @@
+.header { background: $head-bg; }
+
+.header-inner { position: relative; }
+
+
+@import "headerband";
+@import "site-meta";
+@import "site-nav";
+@import "menu";
diff --git a/source/css/_common/components/header/headerband.styl b/source/css/_common/components/header/headerband.styl
new file mode 100644
index 0000000000..382dbd9cdd
--- /dev/null
+++ b/source/css/_common/components/header/headerband.styl
@@ -0,0 +1,4 @@
+.headband {
+ height: $headband-height;
+ background: $headband-bg;
+}
diff --git a/source/css/_common/components/header/menu.styl b/source/css/_common/components/header/menu.styl
new file mode 100644
index 0000000000..d2b0f055d2
--- /dev/null
+++ b/source/css/_common/components/header/menu.styl
@@ -0,0 +1,32 @@
+// Menu
+// --------------------------------------------------
+.menu {
+ margin-top: 20px;
+ padding-left: 0;
+ text-align: center;
+}
+
+.menu .menu-item {
+ display: inline-block;
+ margin: 0 10px;
+ list-style: none;
+
+ @media screen and (max-width: 767px) {
+ margin-top: 10px;
+ }
+
+ a {
+ display: block;
+ font-size: 13px;
+ line-height: inherit;
+ border-bottom: 1px solid $menu-link-border;
+ transition-property: border-color;
+ the-transition();
+
+ &:hover { border-bottom-color: $menu-link-hover-border; }
+ }
+
+ .fa { margin-right: 5px; }
+}
+
+.use-motion .menu-item { opacity: 0; }
diff --git a/source/css/_common/components/header/site-meta.styl b/source/css/_common/components/header/site-meta.styl
new file mode 100644
index 0000000000..efe31ec26f
--- /dev/null
+++ b/source/css/_common/components/header/site-meta.styl
@@ -0,0 +1,48 @@
+.site-meta {
+ margin: 0;
+ text-align: $site-meta-text-align;
+
+ +mobile() { text-align: center; }
+}
+
+.brand {
+ position: relative;
+ display: inline-block;
+ padding: 0 40px;
+ color: $brand-color;
+ background: $brand-bg;
+ border-bottom: none;
+ &:hover { color: $brand-hover-color; }
+}
+
+.logo {
+ display: inline-block;
+ margin-right: 5px;
+ line-height: 36px;
+ vertical-align: top;
+}
+
+.site-title {
+ display: inline-block;
+ vertical-align: top;
+ line-height: 36px;
+ font-size: $logo-font-size;
+ font-weight: normal;
+ font-family: $font-family-logo;
+}
+
+.site-subtitle {
+ margin-top: 10px;
+ font-size: $subtitle-font-size;
+ color: $subtitle-color;
+}
+
+.use-motion {
+ .brand { opacity: 0; }
+
+ .logo, .site-title, .site-subtitle {
+ opacity: 0;
+ position: relative;
+ top: -10px;
+ }
+}
diff --git a/source/css/_common/components/header/site-nav.styl b/source/css/_common/components/header/site-nav.styl
new file mode 100644
index 0000000000..c6446e73f4
--- /dev/null
+++ b/source/css/_common/components/header/site-nav.styl
@@ -0,0 +1,28 @@
+.site-nav-toggle {
+ display: none;
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ +mobile() {
+ display: block;
+ }
+
+ button {
+ margin-top: 2px;
+ padding: 9px 10px;
+ background: transparent;
+ border: none;
+ }
+}
+
+.site-nav {
+ +mobile() {
+ display: none;
+ margin: 0 -10px;
+ padding: 0 10px;
+ clear: both;
+ border-top: 1px solid $gray-lighter;
+ }
+ +tablet() { display: block !important; }
+ +desktop() { display: block !important; }
+}
diff --git a/source/css/_common/components/highlight/diff.styl b/source/css/_common/components/highlight/diff.styl
new file mode 100644
index 0000000000..f77949909d
--- /dev/null
+++ b/source/css/_common/components/highlight/diff.styl
@@ -0,0 +1,8 @@
+$highlight_theme = hexo-config("highlight_theme")
+
+if $highlight_theme == "normal"
+ $highlight-deletion = #fdd
+ $highlight-addition = #dfd
+else
+ $highlight-deletion = #008000
+ $highlight-addition = #800000
diff --git a/source/css/_common/components/highlight/highlight.styl b/source/css/_common/components/highlight/highlight.styl
new file mode 100644
index 0000000000..6b540fdc3e
--- /dev/null
+++ b/source/css/_common/components/highlight/highlight.styl
@@ -0,0 +1,177 @@
+// https://github.com/chriskempson/tomorrow-theme
+
+@require "theme"
+@require "diff"
+
+// Placeholder: $code-block
+$code-block {
+ overflow: auto;
+ margin: 20px 0;
+ padding: 0;
+ font-size $code-font-size;
+ color: $highlight-foreground;
+ background: $highlight-background;
+ line-height: $line-height-code-block;
+}
+
+pre, code { font-family: $code-font-family; }
+
+code {
+ padding: 2px 4px;
+ word-wrap: break-word;
+ color: $code-foreground;
+ background: $code-background;
+ border-radius: $code-border-radius;
+ font-size $code-font-size;
+}
+
+pre {
+ @extend $code-block;
+ padding: 10px;
+
+ code {
+ padding: 0;
+ color: $highlight-foreground;
+ background: none;
+ text-shadow: none;
+ }
+}
+
+.highlight {
+ @extend $code-block;
+ border-radius: 1px
+
+ pre {
+ border: none;
+ margin: 0;
+ padding: 10px 0;
+ }
+
+ table {
+ margin: 0;
+ width: auto;
+ border: none;
+ }
+
+ td {
+ border: none;
+ padding: 0;
+ }
+
+ figcaption {
+ clearfix();
+ font-size: 1em;
+ color: $highlight-foreground;
+ line-height: 1em;
+ margin-bottom: 1em;
+
+ a {
+ float: right;
+ color: $highlight-foreground;
+
+ &:hover { border-bottom-color: $highlight-foreground; }
+ }
+ }
+
+ .gutter pre {
+ padding-left: 10px
+ padding-right: 10px
+ color: $highlight-gutter.color
+ text-align: right
+ background-color: $highlight-gutter.bg-color
+ }
+
+ .code pre {
+ width: 100%
+ padding-left: 10px
+ padding-right: 10px
+ background-color: $highlight-background
+ }
+
+ .line { height: 20px; }
+}
+
+
+.gutter {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.gist table {
+ width: auto;
+
+ td { border: none; }
+}
+
+// For diff highlight
+pre .deletion { background: $highlight-deletion; }
+pre .addition { background: $highlight-addition; }
+pre .meta { color: $highlight-purple; }
+
+pre {
+
+ .comment { color: $highlight-comment; }
+
+ .variable
+ .attribute
+ .tag
+ .regexp
+ .ruby .constant
+ .xml .tag .title
+ .xml .pi
+ .xml .doctype
+ .html .doctype
+ .css .id
+ .css .class
+ .css .pseudo {
+ color: $highlight-red;
+ }
+
+ .number
+ .preprocessor
+ .built_in
+ .literal
+ .params
+ .constant
+ .command {
+ color: $highlight-orange;
+ }
+
+ .ruby .class .title
+ .css .rules .attribute
+ .string
+ .value
+ .inheritance
+ .header
+ .ruby .symbol
+ .xml .cdata
+ .special
+ .number
+ .formula {
+ color: $highlight-green;
+ }
+
+ .title
+ .css .hexcolor {
+ color: $highlight-aqua;
+ }
+
+ .function
+ .python .decorator
+ .python .title
+ .ruby .function .title
+ .ruby .title .keyword
+ .perl .sub
+ .javascript .title
+ .coffeescript .title {
+ color: $highlight-blue;
+ }
+
+ .keyword
+ .javascript .function {
+ color: $highlight-purple;
+ }
+
+}
diff --git a/source/css/_common/components/highlight/theme.styl b/source/css/_common/components/highlight/theme.styl
new file mode 100644
index 0000000000..ff1f4be005
--- /dev/null
+++ b/source/css/_common/components/highlight/theme.styl
@@ -0,0 +1,92 @@
+$highlight_theme = hexo-config("highlight_theme")
+
+
+if $highlight_theme == "normal"
+ $highlight-background = #f7f7f7
+ $highlight-current-line = #efefef
+ $highlight-selection = #d6d6d6
+ $highlight-foreground = #4d4d4c
+ $highlight-comment = #8e908c
+ $highlight-red = #c82829
+ $highlight-orange = #f5871f
+ $highlight-yellow = #eab700
+ $highlight-green = #718c00
+ $highlight-aqua = #3e999f
+ $highlight-blue = #4271ae
+ $highlight-purple = #8959a8
+ $highlight-gutter = {
+ color: #869194,
+ bg-color: #eff2f3
+ }
+
+if $highlight_theme == "night"
+ $highlight-background = #1d1f21
+ $highlight-current-line = #282a2e
+ $highlight-selection = #373b41
+ $highlight-foreground = #c5c8c6
+ $highlight-comment = #969896
+ $highlight-red = #cc6666
+ $highlight-orange = #de935f
+ $highlight-yellow = #f0c674
+ $highlight-green = #b5bd68
+ $highlight-aqua = #8abeb7
+ $highlight-blue = #81a2be
+ $highlight-purple = #b294bb
+ $highlight-gutter = {
+ color: lighten($highlight-background, 50%),
+ bg-color: darken($highlight-background, 100%)
+ }
+
+if $highlight_theme == "night eighties"
+ $highlight-background = #2d2d2d
+ $highlight-current-line = #393939
+ $highlight-selection = #515151
+ $highlight-foreground = #cccccc
+ $highlight-comment = #999999
+ $highlight-red = #f2777a
+ $highlight-orange = #f99157
+ $highlight-yellow = #ffcc66
+ $highlight-green = #99cc99
+ $highlight-aqua = #66cccc
+ $highlight-blue = #6699cc
+ $highlight-purple = #cc99cc
+ $highlight-gutter = {
+ color: $highlight-comment,
+ bg-color: darken($highlight-background, 40%)
+ }
+
+if $highlight_theme == "night blue"
+ $highlight-background = #002451
+ $highlight-current-line = #00346e
+ $highlight-selection = #003f8e
+ $highlight-foreground = #ffffff
+ $highlight-comment = #7285b7
+ $highlight-red = #ff9da4
+ $highlight-orange = #ffc58f
+ $highlight-yellow = #ffeead
+ $highlight-green = #d1f1a9
+ $highlight-aqua = #99ffff
+ $highlight-blue = #bbdaff
+ $highlight-purple = #ebbbff
+ $highlight-gutter = {
+ color: $highlight-comment,
+ bg-color: darken($highlight-background, 60%)
+ }
+
+if $highlight_theme == "night bright"
+ $highlight-background = #000000
+ $highlight-current-line = #2a2a2a
+ $highlight-selection = #424242
+ $highlight-foreground = #eaeaea
+ $highlight-comment = #969896
+ $highlight-red = #d54e53
+ $highlight-orange = #e78c45
+ $highlight-yellow = #e7c547
+ $highlight-green = #b9ca4a
+ $highlight-aqua = #70c0b1
+ $highlight-blue = #7aa6da
+ $highlight-purple = #c397d8
+ $highlight-gutter = {
+ color: lighten($highlight-background, 40%),
+ bg-color: lighten($highlight-background, 16%)
+ }
diff --git a/source/css/_common/components/pages/archive.styl b/source/css/_common/components/pages/archive.styl
new file mode 100644
index 0000000000..8a1363d684
--- /dev/null
+++ b/source/css/_common/components/pages/archive.styl
@@ -0,0 +1,29 @@
+.page-archive {
+
+ .archive-page-counter {
+ position: relative;
+ top: 3px;
+ left: 20px;
+
+ +mobile() {
+ top: 5px;
+ }
+ }
+
+ .posts-collapse {
+
+ .archive-move-on {
+ position: absolute;
+ top: 11px;
+ left: 0;
+ margin-left: -6px;
+ width: 10px;
+ height: 10px;
+ opacity: 0.5;
+ background: $black-light;
+ border: 1px solid white;
+
+ circle();
+ }
+ }
+}
diff --git a/source/css/_common/components/pages/categories.styl b/source/css/_common/components/pages/categories.styl
new file mode 100644
index 0000000000..db3bb10a34
--- /dev/null
+++ b/source/css/_common/components/pages/categories.styl
@@ -0,0 +1,27 @@
+.category-all-page {
+ .category-all-title { text-align: center; }
+
+ .category-all { margin-top: 20px; }
+
+ .category-list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+ .category-list-item { margin: 5px 10px; }
+
+ .category-list-count {
+ color: $grey;
+ &:before {
+ display: inline;
+ content: " ("
+ }
+ &:after {
+ display: inline;
+ content: ") "
+ }
+ }
+
+ .category-list-child { padding-left: 10px; }
+}
diff --git a/source/css/_common/components/pages/pages.styl b/source/css/_common/components/pages/pages.styl
new file mode 100644
index 0000000000..cb14d04cbb
--- /dev/null
+++ b/source/css/_common/components/pages/pages.styl
@@ -0,0 +1,6 @@
+// Page specific styles
+
+@import "archive";
+@import "categories";
+@import "schedule";
+@import "post-detail";
diff --git a/source/css/_common/components/pages/post-detail.styl b/source/css/_common/components/pages/post-detail.styl
new file mode 100644
index 0000000000..3f26afdb29
--- /dev/null
+++ b/source/css/_common/components/pages/post-detail.styl
@@ -0,0 +1,6 @@
+.page-post-detail {
+
+ .sidebar-toggle-line { background: $sidebar-highlight; }
+
+ .comments { overflow: hidden; }
+}
diff --git a/source/css/_common/components/pages/schedule.styl b/source/css/_common/components/pages/schedule.styl
new file mode 100644
index 0000000000..18ec9334ad
--- /dev/null
+++ b/source/css/_common/components/pages/schedule.styl
@@ -0,0 +1,101 @@
+@keyframes dot-flash {
+ from {opacity: 1; transform:scale(1.1);}
+ to {opacity: 0; transform:scale(1);}
+}
+
+#schedule {
+ ul#event-list {
+ padding-left: 30px
+ hr {
+ margin: 20px 0 45px 0!important
+ background: #222
+ &:after {
+ display: inline-block
+ content: 'NOW'
+ background: #222
+ color: #FFF
+ font-weight:bold
+ text-align: right
+ padding: 0 5px
+ }
+ }
+ li.event {
+ margin: 20px 0px
+ background: #F9F9F9
+ padding-left: 10px
+ min-height: 40px
+ h2.event-summary {
+ margin: 0
+ padding-bottom: 3px
+ &:before {
+ display: inline-block
+ font-family: FontAwesome
+ font-size: 8px
+ content: '\f111'
+ vertical-align: middle
+ margin-right: 25px
+ color: #bbb
+ }
+ }
+ span.event-relative-time {
+ display: inline-block
+ font-size: 12px
+ font-weight: 400
+ padding-left: 12px
+ color: #bbb
+ }
+ span.event-details {
+ display: block
+ color: #bbb
+ margin-left: 56px
+ padding-top: 3px
+ padding-bottom: 6px
+ text-indent: -24px
+ line-height: 18px
+ &:before {
+ text-indent: 0
+ display: inline-block
+ width: 14px
+ font-family: FontAwesome
+ text-align: center
+ margin-right: 9px
+ color: #bbb
+ }
+ &.event-location:before {
+ content: '\f041'
+ }
+ &.event-duration:before {
+ content: '\f017'
+ }
+ }
+ }
+ li.event-past {
+ background: #FCFCFC
+ & > * {
+ opacity: .6
+ }
+ h2.event-summary {
+ color: #bbb
+ &:before {
+ color: #DFDFDF
+ }
+ }
+ }
+ li.event-now {
+ background: #222
+ color: #FFF
+ padding: 15px 0 15px 10px
+ h2.event-summary {
+ &:before {
+ transform: scale(1.2)
+ color: #FFF
+ animation: dot-flash 1s alternate infinite ease-in-out;
+ }
+ }
+ * {
+ color: #FFF!important
+ }
+ }
+ }
+}
+
diff --git a/source/css/_common/components/pagination.styl b/source/css/_common/components/pagination.styl
new file mode 100644
index 0000000000..a054ef009a
--- /dev/null
+++ b/source/css/_common/components/pagination.styl
@@ -0,0 +1,56 @@
+.pagination {
+ margin: 120px 0 40px;
+ text-align: center;
+ border-top: 1px solid $pagination-border;
+}
+
+.page-number-basic {
+ display: inline-block;
+ position: relative;
+ top: -1px;
+ margin: 0 10px;
+ padding: 0 11px;
+
+ +mobile() { margin: 0 5px; }
+}
+
+.pagination {
+ .prev, .next, .page-number {
+ @extend .page-number-basic;
+ border-bottom: 0;
+ border-top: 1px solid $pagination-link-border;
+ transition-property: border-color;
+ the-transition();
+
+ &:hover { border-top-color: $pagination-link-hover-border; }
+ }
+
+ .space {
+ @extend .page-number-basic;
+ padding: 0;
+ margin: 0;
+ }
+
+ .prev { margin-left: 0; }
+ .next { margin-right: 0; }
+
+ .page-number.current {
+ color: $pagination-active-color;
+ background: $pagination-active-bg;
+ border-top-color: $pagination-active-border;
+ }
+}
+
+@media (max-width: 767px)
+ .pagination { border-top: none; }
+
+ .pagination {
+ .prev, .next, .page-number {
+ margin-bottom: 10px;
+ border-top: 0;
+ border-bottom: 1px solid $pagination-link-border;
+ padding: 0 10px;
+
+ &:hover { border-bottom-color: $pagination-link-hover-border; }
+ }
+ }
diff --git a/source/css/_common/components/post/post-button.styl b/source/css/_common/components/post/post-button.styl
new file mode 100644
index 0000000000..fd0809f81c
--- /dev/null
+++ b/source/css/_common/components/post/post-button.styl
@@ -0,0 +1,3 @@
+.post-button {
+ margin-top: 40px;
+}
diff --git a/source/css/_common/components/post/post-collapse.styl b/source/css/_common/components/post/post-collapse.styl
new file mode 100644
index 0000000000..6633a450da
--- /dev/null
+++ b/source/css/_common/components/post/post-collapse.styl
@@ -0,0 +1,111 @@
+// TODO: Refactor.
+
+@media (max-width: 767px) {
+ .posts-collapse {
+ margin: 0 20px;
+
+ .post-title, .post-meta {
+ display: block;
+ width: auto;
+ text-align: left;
+ }
+ }
+}
+
+.posts-collapse {
+ position: relative;
+ z-index: $zindex-1;
+
+ &::after {
+ content: " ";
+ position: absolute;
+ top: 20px;
+ left: 0;
+ margin-left: -2px;
+ width: 4px;
+ height: 100%;
+ background: $whitesmoke;
+ z-index: $zindex-bottom;
+ }
+
+ margin-left: $posts-collapse-left;
+ +mobile() { margin: 0 20px; }
+
+ .collection-title {
+ position: relative;
+ margin: 60px 0;
+
+ h1, h2 { margin-left: 20px; }
+
+ small { color: $grey; margin-left: 5px; }
+
+ &::before {
+ content: " ";
+ position: absolute;
+ left: 0;
+ top: 50%;
+ margin-left: -4px;
+ margin-top: -4px;
+ width: 8px;
+ height: 8px;
+ background: $grey;
+ circle();
+ }
+ }
+
+ .post { margin: 30px 0; }
+
+ .post-header {
+ position: relative;
+ the-transition();
+ transition-property: border;
+ border-bottom: 1px dashed $grey-light;
+
+ &::before {
+ content: " ";
+ position: absolute;
+ left: 0;
+ top: 12px;
+ width: 6px;
+ height: 6px;
+ margin-left: -4px;
+ background: $grey;
+ circle();
+ border: 1px solid white;
+ the-transition();
+ transition-property: background;
+ }
+ }
+
+ .post-header:hover {
+ border-bottom-color: $grey-dim;
+
+ &::before { background: $black-deep; }
+ }
+
+ .post-meta {
+ position: absolute;
+ font-size: 12px;
+ left: 20px;
+ top: 5px;
+ }
+
+ .post-comments-count { display: none; }
+
+ .post-title {
+ margin-left: 60px;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: inherit;
+
+ &::after {
+ margin-left: 3px;
+ opacity: 0.6;
+ }
+
+ a {
+ color: $grey-dim;
+ border-bottom: none;
+ }
+ }
+}
diff --git a/source/css/_common/components/post/post-copyright.styl b/source/css/_common/components/post/post-copyright.styl
new file mode 100644
index 0000000000..f1cc7cbab7
--- /dev/null
+++ b/source/css/_common/components/post/post-copyright.styl
@@ -0,0 +1,7 @@
+.post-copyright {
+ margin: $post-copyright.margin;
+ padding: $post-copyright.padding;
+ border-left: $post-copyright.border.width $post-copyright.border.style $post-copyright.border.color;
+ background-color: $post-copyright.bg;
+ list-style: none;
+}
diff --git a/source/css/_common/components/post/post-eof.styl b/source/css/_common/components/post/post-eof.styl
new file mode 100644
index 0000000000..e4303252ea
--- /dev/null
+++ b/source/css/_common/components/post/post-eof.styl
@@ -0,0 +1,17 @@
+.posts-expand {
+ .post-eof {
+ display: block;
+ margin: $post-eof-margin-top auto $post-eof-margin-bottom;
+ width: 8%;
+ height: 1px;
+ background: $grey-light;
+ text-align: center;
+ }
+}
+
+
+.post:last-child {
+ .post-eof.post-eof.post-eof {
+ display: none;
+ }
+}
diff --git a/source/css/_common/components/post/post-expand.styl b/source/css/_common/components/post/post-expand.styl
new file mode 100644
index 0000000000..8c6d8a5b97
--- /dev/null
+++ b/source/css/_common/components/post/post-expand.styl
@@ -0,0 +1,64 @@
+// TODO: Refactor.
+
+.posts-expand {
+ padding-top: 40px;
+}
+
+@media (max-width: 767px) {
+ .posts-expand {
+ margin: 0 20px;
+ }
+
+ .post-body {
+ pre {
+ .gutter pre {
+ padding-right: 10px;
+ }
+ }
+
+ .highlight {
+ margin-left: 0px;
+ margin-right: 0px;
+ padding: 0;
+ .gutter pre {
+ padding-right: 10px;
+ }
+ }
+ }
+}
+
+.posts-expand .post-body {
+ +desktop() { text-align: justify; }
+
+
+ h2, h3, h4, h5, h6 {
+ padding-top: 10px;
+
+ .header-anchor{
+ float: right;
+ margin-left: 10px;
+ color: $grey-light;
+ border-bottom-style: none;
+ visibility: hidden;
+
+ &:hover{
+ color: inherit;
+ }
+ }
+
+ &:hover .header-anchor{
+ visibility: visible;
+ }
+ }
+
+ ul li { list-style: circle; }
+
+ img {
+ box-sizing: border-box;
+ margin: auto;
+ padding: 3px;
+ border: 1px solid $gray-lighter;
+ }
+}
+
+.posts-expand .post-body .fancybox img { margin: 0 auto 25px; }
diff --git a/source/css/_common/components/post/post-gallery.styl b/source/css/_common/components/post/post-gallery.styl
new file mode 100644
index 0000000000..b2385ae3f7
--- /dev/null
+++ b/source/css/_common/components/post/post-gallery.styl
@@ -0,0 +1,23 @@
+.post-gallery {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+ border-collapse: separate;
+}
+
+.post-gallery-row { display: table-row; }
+
+.post-gallery .post-gallery-img {
+ display: table-cell;
+ text-align: center;
+ vertical-align: middle;
+ border: none;
+}
+
+.post-gallery .post-gallery-img img {
+ max-width: 100%;
+ max-height: 100%;
+ border: none;
+}
+
+.fancybox-close, .fancybox-close:hover { border: none; }
diff --git a/source/css/_common/components/post/post-meta.styl b/source/css/_common/components/post/post-meta.styl
new file mode 100644
index 0000000000..97b650c3bd
--- /dev/null
+++ b/source/css/_common/components/post/post-meta.styl
@@ -0,0 +1,49 @@
+.posts-expand .post-meta {
+ margin: 3px 0 60px 0;
+ color: $grey-dark;
+ font-family: $font-family-posts;
+ font-size: 12px;
+ text-align: center;
+
+ .post-category-list {
+ display: inline-block;
+ margin: 0;
+ padding: 3px;
+ }
+ .post-category-list-link { color: $grey-dark; }
+
+ .post-description {
+ font-size: 14px;
+ margin-top: 2px;
+ }
+}
+
+.post-wordcount {
+ if !hexo-config('symbols_count_time.separated_meta') { display: inline-block; }
+}
+
+.post-meta-divider {
+ margin: 0 .5em;
+}
+
+.post-meta-item-icon {
+ margin-right: 3px;
+ +tablet() {
+ display: inline-block;
+ }
+ +mobile() {
+ display: inline-block;
+ }
+}
+.post-meta-item-text {
+ +tablet() {
+ display: none;
+ }
+ +mobile() {
+ display: none;
+ }
+}
+
+.posts-expand .post-comments-count {
+ +mobile() { display: none; }
+}
diff --git a/source/css/_common/components/post/post-nav.styl b/source/css/_common/components/post/post-nav.styl
new file mode 100644
index 0000000000..fa85838d23
--- /dev/null
+++ b/source/css/_common/components/post/post-nav.styl
@@ -0,0 +1,57 @@
+.post-nav {
+ display: table;
+ margin-top: 15px;
+ width: 100%;
+ border-top: 1px solid $gainsboro;
+}
+
+.post-nav-divider {
+ display: table-cell;
+ width: 10%;
+}
+
+.post-nav-item {
+ display: table-cell;
+ padding: 10px 0 0 0;
+ width: 45%;
+ vertical-align: top;
+
+ a {
+ position: relative;
+ display: block;
+ line-height: 25px;
+ font-size: 14px;
+ color: $link-color;
+ border-bottom: none;
+
+ &:hover {
+ color: $link-hover-color;
+ border-bottom: none;
+ }
+
+ &:active { top: 2px; }
+ }
+
+ .fa {
+ position: absolute;
+ top: 8px;
+ left: 0;
+ font-size: 12px;
+ }
+
+}
+
+.post-nav-next {
+ a { padding-left: 15px; }
+}
+
+.post-nav-prev {
+ text-align: right;
+
+ a { padding-right: 15px; }
+
+ .fa {
+ right: 0;
+ left: auto;
+ }
+}
diff --git a/source/css/_common/components/post/post-reward.styl b/source/css/_common/components/post/post-reward.styl
new file mode 100644
index 0000000000..450a104ead
--- /dev/null
+++ b/source/css/_common/components/post/post-reward.styl
@@ -0,0 +1,64 @@
+#rewardButton {
+ cursor: pointer;
+ border: 0;
+ outline: 0;
+ border-radius: 5px;
+ padding: 0;
+ margin: 0;
+ letter-spacing: normal;
+ text-transform: none;
+ text-indent: 0px;
+ text-shadow: none;
+}
+#rewardButton span {
+ display: inline-block;
+ width: 80px;
+ height: 35px;
+ border-radius: 5px;
+ color: #fff;
+ font-weight: 400;
+ font-style: normal;
+ font-variant: normal;
+ font-stretch: normal;
+ font-size: 18px;
+ font-family: "Microsoft Yahei";
+ background: #F44336;
+}
+#rewardButton span:hover{
+ background: #F7877F;
+}
+#QR{
+ padding-top:20px;
+}
+#QR a{
+ border:0;
+}
+#QR img{
+ width: 180px;
+ max-width: 100%;
+ display: inline-block;
+ margin: 0.8em 2em 0 2em;
+}
+#wechat:hover p{
+ animation: roll 0.1s infinite linear;
+ -webkit-animation: roll 0.1s infinite linear;
+ -moz-animation: roll 0.1s infinite linear;
+}
+#alipay:hover p{
+ animation: roll 0.1s infinite linear;
+ -webkit-animation: roll 0.1s infinite linear;
+ -moz-animation: roll 0.1s infinite linear;
+}
+#bitcoin:hover p {
+ animation: roll 0.1s infinite linear;
+ -webkit-animation: roll 0.1s infinite linear;
+ -moz-animation: roll 0.1s infinite linear;
+}
+@keyframes roll {
+ from {
+ transform(rotateZ(30deg));
+ }
+ to {
+ transform(rotateZ(-30deg));
+ }
+}
diff --git a/source/css/_common/components/post/post-rtl.styl b/source/css/_common/components/post/post-rtl.styl
new file mode 100644
index 0000000000..ea048b9f03
--- /dev/null
+++ b/source/css/_common/components/post/post-rtl.styl
@@ -0,0 +1,11 @@
+.rtl {
+ &.post-body {
+ p, a, h1, h2, h3, h4, h5, h6, li, ul, ol {
+ direction: rtl;
+ font-family: UKIJ Ekran;
+ }
+ }
+ &.post-title {
+ font-family: UKIJ Ekran;
+ }
+}
diff --git a/source/css/_common/components/post/post-tags.styl b/source/css/_common/components/post/post-tags.styl
new file mode 100644
index 0000000000..8c04ec7f07
--- /dev/null
+++ b/source/css/_common/components/post/post-tags.styl
@@ -0,0 +1,10 @@
+.posts-expand .post-tags {
+ margin-top: 40px;
+ text-align: center;
+
+ a {
+ display: inline-block;
+ margin-right: 10px;
+ font-size: 13px;
+ }
+}
diff --git a/source/css/_common/components/post/post-title.styl b/source/css/_common/components/post/post-title.styl
new file mode 100644
index 0000000000..dcd1c06713
--- /dev/null
+++ b/source/css/_common/components/post/post-title.styl
@@ -0,0 +1,33 @@
+.posts-expand .post-title {
+ text-align: center;
+ word-break: break-word;
+ font-weight: $posts-expand-title-font-weight
+}
+.posts-expand .post-title-link {
+ display: inline-block;
+ position: relative;
+ color: $black-light;
+ border-bottom: none;
+ line-height: 1.2;
+ vertical-align: top;
+
+ &::before {
+ content: "";
+ position: absolute;
+ width: 100%;
+ height: 2px;
+ bottom: 0;
+ left: 0;
+ background-color: #000;
+ visibility: hidden;
+ transform: scaleX(0);
+ the-transition();
+ }
+
+ &:hover::before {
+ visibility: visible;
+ transform: scaleX(1);
+ }
+
+ .fa { font-size: 16px; }
+}
diff --git a/source/css/_common/components/post/post-type.styl b/source/css/_common/components/post/post-type.styl
new file mode 100644
index 0000000000..c3d2510b90
--- /dev/null
+++ b/source/css/_common/components/post/post-type.styl
@@ -0,0 +1,14 @@
+// TODO: Refactor.
+
+.page-home, .page-post-detail {
+ .post-type-quote {
+ .post-header,
+ .post-tags {
+ display: none;
+ }
+
+ blockquote {
+ @extend .blockquote-center
+ }
+ }
+}
diff --git a/source/css/_common/components/post/post-widgets.styl b/source/css/_common/components/post/post-widgets.styl
new file mode 100644
index 0000000000..4914c5a154
--- /dev/null
+++ b/source/css/_common/components/post/post-widgets.styl
@@ -0,0 +1,41 @@
+.post-widgets {
+ border-top: 1px solid #eee;
+ padding-top: 9px;
+ margin-top: 45px;
+ display: flex;
+ justify-content: center;
+ flex-wrap: wrap;
+ align-items: center;
+
+ .post-meta-divider {
+ height: 28px;
+ color: $grey-dark;
+ }
+}
+
+.wp_rating {
+ height: 20px;
+ margin-right: 10px;
+ text-align: center;
+ line-height: 20px;
+ padding-top: 6px;
+}
+
+.social-like {
+ font-size: 14px;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+}
+
+.vk_like {
+ width: 85px;
+ height: 21px;
+ padding-top: 7px;
+ align-self: center;
+}
+
+.fb_like {
+ height: 30px;
+ align-self: center;
+}
diff --git a/source/css/_common/components/post/post.styl b/source/css/_common/components/post/post.styl
new file mode 100644
index 0000000000..f8a05f7cff
--- /dev/null
+++ b/source/css/_common/components/post/post.styl
@@ -0,0 +1,60 @@
+.post-body {
+ font-family: $font-family-posts;
+ +mobile() {
+ word-break: break-word;
+ }
+}
+
+.post-body .fancybox img {
+ display: block !important;
+ margin: 0 auto;
+ cursor: pointer;
+ cursor: zoom-in;
+ cursor: -webkit-zoom-in;
+}
+
+.post-body .image-caption {
+ margin: -20px auto 15px;
+ text-align: center;
+ font-size: $font-size-base;
+ color: $grey-dark;
+ font-weight: bold;
+ line-height: 1;
+}
+
+.post-body .figure .caption {
+ @extend .post-body .image-caption;
+}
+
+.post-sticky-flag {
+ display: inline-block;
+ font-size: 16px;
+ -ms-transform: rotate(30deg);
+ transform: rotate(30deg);
+}
+
+.use-motion {
+ if hexo-config('motion.transition.post_block') {
+ .post-block,
+ .pagination,
+ .comments { opacity: 0; }
+ }
+ if hexo-config('motion.transition.post_header') { .post-header { opacity: 0; } }
+ if hexo-config('motion.transition.post_body') { .post-body { opacity: 0; } }
+ if hexo-config('motion.transition.coll_header') { .collection-title { opacity: 0; } }
+}
+
+@import "post-expand";
+@import "post-collapse";
+@import "post-type";
+@import "post-title";
+@import "post-meta";
+@import "post-button";
+@import "post-tags";
+@import "post-nav";
+@import "post-eof";
+@import "post-gallery";
+@import "post-reward" if hexo-config('alipay') or hexo-config('wechatpay') or hexo-config('bitcoin');
+@import "post-copyright" if hexo-config('post_copyright.enable');
+@import "post-widgets" if (hexo-config('facebook_sdk.enable') and hexo-config('facebook_sdk.like_button')) or (hexo-config('vkontakte_api.enable') and hexo-config('vkontakte_api.like')) or hexo-config('rating.enable') or (hexo-config('needmoreshare2.enable') and hexo-config('needmoreshare2.postbottom.enable'));
+@import "post-rtl";
diff --git a/source/css/_common/components/sidebar/sidebar-author-links.styl b/source/css/_common/components/sidebar/sidebar-author-links.styl
new file mode 100644
index 0000000000..227e839fec
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-author-links.styl
@@ -0,0 +1,23 @@
+.links-of-author {
+ margin-top: 20px;
+}
+
+.links-of-author a {
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 10px;
+ margin-bottom: 10px;
+ border-bottom-color: $black-light;
+ font-size: 13px;
+
+ &:before {
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 3px;
+ content: " ";
+ width: 4px;
+ height: 4px;
+ border-radius: 50%;
+ background: rgb(random-color(0, 255) - 50%, random-color(0, 255) - 50%, random-color(0, 255) - 50%);
+ }
+}
diff --git a/source/css/_common/components/sidebar/sidebar-author.styl b/source/css/_common/components/sidebar/sidebar-author.styl
new file mode 100644
index 0000000000..14ac7172f4
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-author.styl
@@ -0,0 +1,22 @@
+.site-author-image {
+ display: block;
+ margin: 0 auto;
+ padding: $site-author-image-padding;
+ max-width: $site-author-image-width;
+ height: $site-author-image-height;
+ border: $site-author-image-border-width solid $site-author-image-border-color;
+}
+
+.site-author-name {
+ margin: $site-author-name-margin;
+ text-align: $site-author-name-align;
+ color: $site-author-name-color;
+ font-weight: $site-author-name-weight;
+}
+
+.site-description {
+ margin-top: $site-description-margin-top;
+ text-align: $site-description-align;
+ font-size: $site-description-font-size;
+ color: $site-description-color;
+}
diff --git a/source/css/_common/components/sidebar/sidebar-blogroll.styl b/source/css/_common/components/sidebar/sidebar-blogroll.styl
new file mode 100644
index 0000000000..b677e6868b
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-blogroll.styl
@@ -0,0 +1,25 @@
+.links-of-blogroll { font-size: 13px; }
+
+.links-of-blogroll-title {
+ margin-top: 20px;
+ font-size: 14px;
+ font-weight: $font-weight-bold;
+}
+.links-of-blogroll-list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.links-of-blogroll-item {
+ padding: 2px 10px;
+
+ a {
+ max-width: 280px;
+ box-sizing: border-box;
+ display: inline-block;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+}
diff --git a/source/css/_common/components/sidebar/sidebar-dimmer.styl b/source/css/_common/components/sidebar/sidebar-dimmer.styl
new file mode 100644
index 0000000000..b2da3cec2d
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-dimmer.styl
@@ -0,0 +1,21 @@
+.sidebar-active #sidebar-dimmer {
+ opacity: .7;
+ -webkit-transform: translateX(-150%);
+ transform: translateX(-150%);
+ transition: opacity .2s;
+}
+
+#sidebar-dimmer {
+ display: none;
+ position: absolute;
+ top: 0;
+ left: 100%;
+ width: 200%;
+ height: 100%;
+ background: #000;
+ opacity: 0;
+ transition: opacity .2s,transform 0s .2s;
+ +mobile() {
+ display: block;
+ }
+}
diff --git a/source/css/_common/components/sidebar/sidebar-feed-link.styl b/source/css/_common/components/sidebar/sidebar-feed-link.styl
new file mode 100644
index 0000000000..b3868a8584
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-feed-link.styl
@@ -0,0 +1,23 @@
+.feed-link {
+ margin-top: 20px;
+
+ a {
+ display: inline-block;
+ padding: 0 15px;
+ color: rgb(252, 100, 35);
+ border: 1px solid rgb(252, 100, 35);
+ border-radius: 4px;
+
+ i {
+ color: rgb(252, 100, 35);
+ font-size: 14px;
+ }
+
+ &:hover {
+ color:white;
+ background: rgb(252, 100, 35);
+
+ i { color: white; }
+ }
+ }
+}
diff --git a/source/css/_common/components/sidebar/sidebar-nav.styl b/source/css/_common/components/sidebar/sidebar-nav.styl
new file mode 100644
index 0000000000..973eda70f1
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-nav.styl
@@ -0,0 +1,29 @@
+// Sidebar Navigation
+
+.sidebar-nav {
+ margin: 0 0 20px;
+ padding-left: 0;
+}
+.sidebar-nav li {
+ display: inline-block;
+ cursor: pointer;
+ border-bottom: 1px solid transparent;
+ font-size: 14px;
+ color: $sidebar-nav-color;
+
+ &:hover { color: $sidebar-nav-hover-color; }
+}
+
+.page-post-detail .sidebar-nav-toc { padding: 0 5px; }
+
+.page-post-detail .sidebar-nav-overview { margin-left: 10px; }
+
+.sidebar-nav .sidebar-nav-active {
+ color: $sidebar-highlight;
+ border-bottom-color: $sidebar-highlight;
+
+ &:hover { color: $sidebar-highlight; }
+}
+
+.sidebar-panel { display: none; }
+.sidebar-panel-active { display: block; }
diff --git a/source/css/_common/components/sidebar/sidebar-toc.styl b/source/css/_common/components/sidebar/sidebar-toc.styl
new file mode 100644
index 0000000000..27e15f0ef9
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-toc.styl
@@ -0,0 +1,60 @@
+
+.post-toc-empty {
+ font-size: 14px;
+ color: $grey-dim;
+}
+
+.post-toc-wrap { overflow: hidden; }
+
+.post-toc { overflow: auto; }
+
+.post-toc ol {
+ margin: 0;
+ padding: 0 2px 5px 10px;
+ text-align: left;
+ list-style: none;
+ font-size: 14px;
+
+ & > ol { padding-left: 0; }
+
+ a {
+ the-transition();
+ transition-property: all;
+ color: $toc-link-color;
+ border-bottom-color: $toc-link-border-color;
+
+ &:hover {
+ color: $toc-link-hover-color;
+ border-bottom-color: $toc-link-hover-border-color;
+ }
+ }
+}
+
+.post-toc .nav-item {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ text-align: justify;
+ white-space: nowrap if !hexo-config('toc.wrap');
+ line-height: 1.8;
+}
+
+.post-toc .nav .nav-child { display: none; }
+
+.post-toc .nav .active > .nav-child { display: block; }
+
+.post-toc .nav .active-current > .nav-child {
+ display: block;
+ & > .nav-item { display: block; }
+}
+
+.post-toc .nav .active > a {
+ color: $toc-link-active-color;
+ border-bottom-color: $toc-link-active-border-color;
+}
+
+.post-toc .nav .active-current > a {
+ color: $toc-link-active-current-color;
+ &:hover {
+ color: $toc-link-active-current-border-color;
+ }
+}
diff --git a/source/css/_common/components/sidebar/sidebar-toggle.styl b/source/css/_common/components/sidebar/sidebar-toggle.styl
new file mode 100644
index 0000000000..c4b6a06b11
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar-toggle.styl
@@ -0,0 +1,36 @@
+.sidebar-toggle {
+ position: fixed;
+ right: $b2t-position-right;
+ bottom: 45px;
+ width: 14px;
+ height: 14px;
+ padding: 5px;
+ background: $black-deep;
+ line-height: 0;
+ z-index: $zindex-5;
+ cursor: pointer;
+ -webkit-transform: translateZ(0);
+
+ +tablet() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+}
+
+
+
+.sidebar-toggle-line {
+ position: relative;
+ display: inline-block;
+ vertical-align: top;
+ height: 2px;
+ width: 100%;
+ background: white;
+ margin-top: 3px;
+
+ &:first-child { margin-top: 0; }
+}
diff --git a/source/css/_common/components/sidebar/sidebar.styl b/source/css/_common/components/sidebar/sidebar.styl
new file mode 100644
index 0000000000..635cc94fd0
--- /dev/null
+++ b/source/css/_common/components/sidebar/sidebar.styl
@@ -0,0 +1,52 @@
+.sidebar {
+ position: fixed;
+ right: 0;
+ top: 0;
+ bottom: 0;
+
+ width: 0;
+ z-index: $zindex-4;
+ box-shadow: inset 0 2px 6px black;
+ background: $black-deep;
+ -webkit-transform: translateZ(0); // http://stackoverflow.com/questions/17079857/position-fixed-broken-in-chrome-with-flash-behind
+
+ a {
+ color: $grey-dark;
+ border-bottom-color: $black-light;
+ &:hover { color: $gainsboro; }
+ }
+
+ +tablet() {
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+
+}
+
+.sidebar-inner {
+ position: relative;
+ padding: 20px 10px;
+ color: $grey-dark;
+ text-align: center;
+}
+
+.site-overview-wrap {
+ overflow: hidden;
+}
+
+.site-overview {
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+@import "sidebar-toggle";
+@import "sidebar-author";
+@import "site-state";
+@import "sidebar-feed-link";
+@import "sidebar-author-links";
+@import "sidebar-blogroll";
+@import "sidebar-nav";
+@import "sidebar-toc";
+@import "sidebar-dimmer" if hexo-config('sidebar.onmobile');
diff --git a/source/css/_common/components/sidebar/site-state.styl b/source/css/_common/components/sidebar/site-state.styl
new file mode 100644
index 0000000000..c05b0ea09b
--- /dev/null
+++ b/source/css/_common/components/sidebar/site-state.styl
@@ -0,0 +1,28 @@
+.site-state {
+ overflow: hidden;
+ line-height: 1.4;
+ white-space: nowrap;
+ text-align: $site-state-align;
+}
+
+.site-state-item {
+ display: inline-block;
+ padding: 0 15px;
+ border-left: 1px solid $site-state-item-border-color;
+
+ &:first-child { border-left: none; }
+
+ a { border-bottom: none; }
+}
+.site-state-item-count {
+ display: block;
+ text-align: center;
+ color: $site-state-item-count-color;
+ font-weight: $font-weight-bold;
+ font-size: $site-state-item-count-font-size;
+}
+
+.site-state-item-name {
+ font-size: $site-state-item-name-font-size;
+ color: $site-state-item-name-color;
+}
diff --git a/source/css/_common/components/tag-cloud.styl b/source/css/_common/components/tag-cloud.styl
new file mode 100644
index 0000000000..30b01c6427
--- /dev/null
+++ b/source/css/_common/components/tag-cloud.styl
@@ -0,0 +1,8 @@
+.tag-cloud {
+ text-align: center;
+
+ a {
+ display: inline-block;
+ margin: 10px;
+ }
+}
\ No newline at end of file
diff --git a/source/css/_common/components/tags/blockquote-center.styl b/source/css/_common/components/tags/blockquote-center.styl
new file mode 100644
index 0000000000..b0f3bccaa0
--- /dev/null
+++ b/source/css/_common/components/tags/blockquote-center.styl
@@ -0,0 +1,33 @@
+// Blockquote with all children centered.
+.blockquote-center {
+ position: relative;
+ margin: 40px 0;
+ padding: 0;
+ border-left: none;
+ text-align: center;
+
+ &::before, &::after {
+ position: absolute;
+ content: ' ';
+ display: block;
+ width: 100%;
+ height: 24px;
+ opacity: 0.2;
+ background-repeat: no-repeat;
+ background-position: 0 -6px;
+ background-size: 22px 22px;
+ }
+ &::before {
+ top: -20px;
+ background-image: url($center-quote-left);
+ border-top: 1px solid $grey-light;
+ }
+ &::after {
+ bottom: -20px;
+ background-image: url($center-quote-right);
+ border-bottom: 1px solid $grey-light;
+ background-position: 100% 8px;
+ }
+
+ p, div { text-align: center; }
+}
diff --git a/source/css/_common/components/tags/exturl.styl b/source/css/_common/components/tags/exturl.styl
new file mode 100644
index 0000000000..49a1684f9b
--- /dev/null
+++ b/source/css/_common/components/tags/exturl.styl
@@ -0,0 +1,18 @@
+.exturl {
+ // Remove the gray background color from active links in IE 10.
+ background-color: transparent;
+
+ cursor: pointer;
+ border-bottom: 1px solid #999;
+
+ .fa {
+ font-size: 14px;
+ }
+}
+
+// Improve readability when focused and also mouse hovered in all browsers.
+.exturl:active, .exturl:hover {
+ outline: 0;
+ color: $black-deep;
+ border-bottom-color: $black-deep;
+}
diff --git a/source/css/_common/components/tags/full-image.styl b/source/css/_common/components/tags/full-image.styl
new file mode 100644
index 0000000000..11ae578362
--- /dev/null
+++ b/source/css/_common/components/tags/full-image.styl
@@ -0,0 +1,12 @@
+// Expand image to 126% with nagative margin-left/right on Desktop.
+.full-image.full-image.full-image.full-image {
+ border: none;
+ max-width: 100%;
+ width: auto;
+ margin: 20px auto 25px;
+ +desktop() {
+ max-width: none;
+ width: $full-image-width;
+ margin: $full-image-margin-vertical $full-image-margin-horizontal;
+ }
+}
diff --git a/source/css/_common/components/tags/group-pictures.styl b/source/css/_common/components/tags/group-pictures.styl
new file mode 100644
index 0000000000..ce1461ddf6
--- /dev/null
+++ b/source/css/_common/components/tags/group-pictures.styl
@@ -0,0 +1,35 @@
+.post .post-body .group-picture {
+ img {
+ box-sizing: border-box;
+ padding: 0 3px;
+ border: none;
+ }
+}
+
+.post .group-picture-row {
+ overflow: hidden;
+ margin-top: 6px;
+ &:first-child { margin-top: 0; }
+}
+
+.post .group-picture-column { float: left; }
+
+.page-post-detail .post-body .group-picture-column {
+ float: none;
+ margin-top: 10px;
+ width: auto !important;
+ img { margin: 0 auto; }
+}
+
+.page-archive {
+ .group-picture-container { overflow: hidden; }
+ .group-picture-row {
+ float: left;
+ &:first-child { margin-top: 6px; }
+ }
+
+ .group-picture-column {
+ max-width: 150px;
+ max-height: 150px;
+ }
+}
diff --git a/source/css/_common/components/tags/label.styl b/source/css/_common/components/tags/label.styl
new file mode 100644
index 0000000000..541dd2dac8
--- /dev/null
+++ b/source/css/_common/components/tags/label.styl
@@ -0,0 +1,12 @@
+.post-body .label {
+ display: inline;
+ padding: 0 2px;
+ white-space: nowrap;
+
+ &.default { background-color: $label-default; }
+ &.primary { background-color: $label-primary; }
+ &.info { background-color: $label-info; }
+ &.success { background-color: $label-success; }
+ &.warning { background-color: $label-warning; }
+ &.danger { background-color: $label-danger; }
+}
diff --git a/source/css/_common/components/tags/note-modern.styl b/source/css/_common/components/tags/note-modern.styl
new file mode 100644
index 0000000000..cf7659e7a8
--- /dev/null
+++ b/source/css/_common/components/tags/note-modern.styl
@@ -0,0 +1,183 @@
+.post-body .note {
+ note_icons = hexo-config('note.icons');
+
+ position: relative;
+ padding: 15px;
+ margin-bottom: 20px;
+
+ border: 1px solid transparent;
+ background-color: $whitesmoke;
+ border-radius: unit(hexo-config('note.border_radius'), px) if hexo-config('note.border_radius') is a 'unit';
+
+ h2, h3, h4, h5, h6 {
+ if note_icons {
+ margin-top: 3px;
+ } else {
+ margin-top: 0;
+ }
+ margin-bottom: 0;
+ border-bottom: initial;
+ padding-top: 0 !important;
+ }
+
+ p, ul, ol, table, pre, blockquote {
+ &:first-child {
+ margin-top: 0;
+ }
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ if note_icons {
+ &:not(.no-icon) {
+ padding-left: 45px;
+ &:before {
+ position: absolute;
+ font-family: 'FontAwesome';
+ font-size: larger;
+ top: 13px;
+ left: 15px;
+ }
+ }
+ }
+
+ &.default {
+ background-color: $note-modern-default-bg;
+ border-color: $note-modern-default-border;
+ color: $note-modern-default-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-default-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-default-text;
+ border-bottom: 1px solid $note-modern-default-text;
+ &:hover {
+ color: $note-modern-default-hover;
+ border-bottom: 1px solid $note-modern-default-hover;
+ }
+ }
+ }
+ }
+
+ &.primary {
+ background-color: $note-modern-primary-bg;
+ border-color: $note-modern-primary-border;
+ color: $note-modern-primary-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-primary-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-primary-text;
+ border-bottom: 1px solid $note-modern-primary-text;
+ &:hover {
+ color: $note-modern-primary-hover;
+ border-bottom: 1px solid $note-modern-primary-hover;
+ }
+ }
+ }
+ }
+
+ &.info {
+ background-color: $note-modern-info-bg;
+ border-color: $note-modern-info-border;
+ color: $note-modern-info-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-info-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-info-text;
+ border-bottom: 1px solid $note-modern-info-text;
+ &:hover {
+ color: $note-modern-info-hover;
+ border-bottom: 1px solid $note-modern-info-hover;
+ }
+ }
+ }
+ }
+
+ &.success {
+ background-color: $note-modern-success-bg;
+ border-color: $note-modern-success-border;
+ color: $note-modern-success-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-success-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-success-text;
+ border-bottom: 1px solid $note-modern-success-text;
+ &:hover {
+ color: $note-modern-success-hover;
+ border-bottom: 1px solid $note-modern-success-hover;
+ }
+ }
+ }
+ }
+
+ &.warning {
+ background-color: $note-modern-warning-bg;
+ border-color: $note-modern-warning-border;
+ color: $note-modern-warning-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-warning-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-warning-text;
+ border-bottom: 1px solid $note-modern-warning-text;
+ &:hover {
+ color: $note-modern-warning-hover;
+ border-bottom: 1px solid $note-modern-warning-hover;
+ }
+ }
+ }
+ }
+
+ &.danger {
+ background-color: $note-modern-danger-bg;
+ border-color: $note-modern-danger-border;
+ color: $note-modern-danger-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-danger-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-danger-text;
+ border-bottom: 1px solid $note-modern-danger-text;
+ &:hover {
+ color: $note-modern-danger-hover;
+ border-bottom: 1px solid $note-modern-danger-hover;
+ }
+ }
+ }
+ }
+
+}
diff --git a/source/css/_common/components/tags/note.styl b/source/css/_common/components/tags/note.styl
new file mode 100644
index 0000000000..4b234b0d38
--- /dev/null
+++ b/source/css/_common/components/tags/note.styl
@@ -0,0 +1,161 @@
+.post-body .note {
+ note_style = hexo-config('note.style');
+ note_icons = hexo-config('note.icons');
+
+ position: relative;
+ padding: 15px;
+ margin-bottom: 20px;
+
+ if note_style == 'simple' {
+ border: 1px solid $gainsboro;
+ border-left-width: 5px;
+ }
+ if note_style == 'flat' {
+ border: initial;
+ border-left: 3px solid $gainsboro;
+ background-color: lighten($gainsboro, 65%);
+ }
+ border-radius: unit(hexo-config('note.border_radius'), px) if hexo-config('note.border_radius') is a 'unit';
+
+ h2, h3, h4, h5, h6 {
+ if note_icons {
+ margin-top: 3px;
+ } else {
+ margin-top: 0;
+ }
+ margin-bottom: 0;
+ border-bottom: initial;
+ padding-top: 0 !important;
+ }
+
+ p, ul, ol, table, pre, blockquote {
+ &:first-child {
+ margin-top: 0;
+ }
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ if note_icons {
+ &:not(.no-icon) {
+ padding-left: 45px;
+ &:before {
+ position: absolute;
+ font-family: 'FontAwesome';
+ font-size: larger;
+ top: 13px;
+ left: 15px;
+ }
+ }
+ }
+
+ &.default {
+ if note_style == 'flat' {
+ background-color: $note-default-bg;
+ }
+ border-left-color: $note-default-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-default-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-default-icon;
+ color : $note-default-text;
+ }
+ }
+ }
+ }
+
+ &.primary {
+ if note_style == 'flat' {
+ background-color: $note-primary-bg;
+ }
+ border-left-color: $note-primary-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-primary-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-primary-icon;
+ color : $note-primary-text;
+ }
+ }
+ }
+ }
+
+ &.info {
+ if note_style == 'flat' {
+ background-color: $note-info-bg;
+ }
+ border-left-color: $note-info-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-info-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-info-icon;
+ color : $note-info-text;
+ }
+ }
+ }
+ }
+
+ &.success {
+ if note_style == 'flat' {
+ background-color: $note-success-bg;
+ }
+ border-left-color: $note-success-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-success-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-success-icon;
+ color : $note-success-text;
+ }
+ }
+ }
+ }
+
+ &.warning {
+ if note_style == 'flat' {
+ background-color: $note-warning-bg;
+ }
+ border-left-color: $note-warning-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-warning-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-warning-icon;
+ color : $note-warning-text;
+ }
+ }
+ }
+ }
+
+ &.danger {
+ if note_style == 'flat' {
+ background-color: $note-danger-bg;
+ }
+ border-left-color: $note-danger-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-danger-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-danger-icon;
+ color : $note-danger-text;
+ }
+ }
+ }
+ }
+
+}
diff --git a/source/css/_common/components/tags/tabs.styl b/source/css/_common/components/tags/tabs.styl
new file mode 100644
index 0000000000..c3c27c4e9b
--- /dev/null
+++ b/source/css/_common/components/tags/tabs.styl
@@ -0,0 +1,99 @@
+.post-body .tabs {
+ position: relative;
+ display: block;
+ margin-bottom: 20px;
+ padding-top: 10px;
+
+ // Read tabs border_radius from NexT config and set in "tbr px" to use it as string variable in this CSS section.
+ hexo-config('tabs.border_radius') is a 'unit' ? (tbr = unit(hexo-config('tabs.border_radius'), px)) : (tbr = 0)
+
+ ul.nav-tabs {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ margin-bottom: -1px;
+
+ +mobile-smallest() {
+ display: block;
+ margin-bottom: 5px;
+ }
+
+ li.tab {
+ list-style-type: none !important;
+ margin: 0 .25em 0 0;
+ border-top: 3px solid transparent;
+ border-left: 1px solid transparent;
+ border-right: 1px solid transparent;
+
+ +mobile-smallest() {
+ margin: initial;
+ border-top: 1px solid transparent;
+ border-left: 3px solid transparent;
+ border-right: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ }
+
+ if tbr > 0 {
+ border-radius: tbr tbr 0 0;
+ +mobile-smallest() { border-radius: tbr; }
+ }
+ if hexo-config('tabs.transition.tabs') { the-transition-ease-out(); }
+
+ & a {
+ outline: 0;
+ border-bottom: initial;
+ display: block;
+ line-height: 1.8em;
+ padding: .25em .75em;
+ & i { width: (18em / 14); }
+ if hexo-config('tabs.transition.labels') { the-transition-ease-out(); }
+ }
+
+ &.active {
+ border-top: 3px solid $orange;
+ border-left: 1px solid $table-border-color;
+ border-right: 1px solid $table-border-color;
+ background-color: #fff;
+
+ +mobile-smallest() {
+ border-top: 1px solid $table-border-color;
+ border-left: 3px solid $orange;
+ border-right: 1px solid $table-border-color;
+ border-bottom: 1px solid $table-border-color;
+ }
+
+ & a {
+ cursor: default;
+ color: $link-color;
+ }
+ }
+ }
+
+ }
+
+ .tab-content {
+ background-color: #fff;
+
+ .tab-pane {
+ border: 1px solid $table-border-color;
+ padding: 20px 20px 0 20px;
+ if tbr > 0 { border-radius: tbr; }
+
+ &:not(.active) {
+ hide();
+ }
+ &.active {
+ show();
+ if tbr > 0 {
+ &:nth-of-type(1) {
+ border-radius: 0 tbr tbr tbr;
+ +mobile-smallest() { border-radius: tbr; }
+ }
+ }
+ }
+
+ }
+
+ }
+
+}
diff --git a/source/css/_common/components/tags/tags.styl b/source/css/_common/components/tags/tags.styl
new file mode 100644
index 0000000000..e7e027ad8c
--- /dev/null
+++ b/source/css/_common/components/tags/tags.styl
@@ -0,0 +1,8 @@
+@import "full-image";
+@import "blockquote-center";
+@import "group-pictures";
+@import "exturl" if hexo-config('exturl');
+@import "note" if hexo-config('note.style') == 'simple' || hexo-config('note.style') == 'flat';
+@import "note-modern" if hexo-config('note.style') == 'modern';
+@import "label" if hexo-config('label');
+@import "tabs" if hexo-config('tabs.enable');
diff --git a/source/css/_common/components/third-party/algolia-search.styl b/source/css/_common/components/third-party/algolia-search.styl
new file mode 100644
index 0000000000..e2e98280df
--- /dev/null
+++ b/source/css/_common/components/third-party/algolia-search.styl
@@ -0,0 +1,125 @@
+.algolia-pop-overlay
+ position: fixed
+ width: 100%
+ height: 100%
+ top: 0
+ left: 0
+ z-index: 2080
+ background-color: rgba(0, 0, 0, 0.3)
+
+.algolia-popup
+ overflow: hidden
+ padding: 0
+ display: none
+ position: fixed
+ top: 10%
+ left: 50%
+ width: 700px
+ height: 80%
+ margin-left: -350px
+ background: #fff
+ color: #333
+ z-index: 9999
+ border-radius: 5px
+ +mobile()
+ padding: 0
+ top: 0
+ left: 0
+ margin: 0
+ width: 100%
+ height: 100%
+ border-radius: 0
+
+ .popup-btn-close
+ position: absolute
+ right: 14px
+ color: #4EBD79
+ font-size: 14px
+ font-weight: bold
+ text-transform: uppercase
+ cursor: pointer
+ padding-left: 15px
+ border-left: 1px solid #eee
+ top: 10px
+ .fa
+ color: $grey-dark
+ font-size: 18px
+ &:hover .fa
+ color: $black-deep
+
+.algolia-search
+ padding: 10px 15px 5px
+ max-height: 50px
+ border-bottom: 1px solid #ccc
+ background: $whitesmoke
+ border-top-left-radius: 5px
+ border-top-right-radius: 5px
+
+.algolia-search-input-icon
+ display: inline-block
+ width: 20px
+ .fa
+ font-size: 18px
+
+.algolia-search-input
+ display: inline-block
+ width: calc(90% - 20px)
+ input
+ padding: 5px 0
+ width: 100%
+ outline: none
+ border: none
+ background: transparent
+
+.algolia-powered
+ float: right
+ img
+ display: inline-block
+ height: 18px
+ vertical-align: middle
+
+.algolia-results
+ position: relative
+ overflow: auto
+ padding: 10px 30px
+ height: calc(100% - 50px)
+
+ hr
+ margin: 10px 0
+
+ .highlight
+ font-style: normal
+ margin: 0
+ padding: 0 2px
+ font-size: inherit
+ color: red
+
+.algolia-hits
+ margin-top: 20px
+
+.algolia-hit-item
+ margin: 15px 0
+
+.algolia-hit-item-link
+ display: block
+ border-bottom: 1px dashed #ccc
+ the-transition()
+
+.algolia-pagination
+ .pagination
+ margin-top: 40px
+ border-top: none
+ padding: 0
+ .pagination-item
+ display: inline-block
+ .page-number
+ border-top: none
+ &:hover
+ border-bottom: 1px solid $black-deep
+
+ .current .page-number
+ @extend .pagination .page-number.current
+
+ .disabled-item
+ visibility: hidden
+
diff --git a/source/css/_common/components/third-party/baidushare.styl b/source/css/_common/components/third-party/baidushare.styl
new file mode 100644
index 0000000000..fc42b713d4
--- /dev/null
+++ b/source/css/_common/components/third-party/baidushare.styl
@@ -0,0 +1,12 @@
+.post-spread {
+ margin-top: 20px;
+ text-align: center;
+}
+
+.bdshare-slide-button-box a { border: none; }
+
+.bdsharebuttonbox {
+ display: inline-block;
+
+ a { border: none; }
+}
diff --git a/source/css/_common/components/third-party/busuanzi-counter.styl b/source/css/_common/components/third-party/busuanzi-counter.styl
new file mode 100644
index 0000000000..960fef6868
--- /dev/null
+++ b/source/css/_common/components/third-party/busuanzi-counter.styl
@@ -0,0 +1,30 @@
+if hexo-config("scheme") == Pisces
+ .busuanzi-count {
+ +tablet() {
+ width: auto;
+ }
+ +mobile() {
+ width: auto;
+ }
+ }
+
+.site-uv,
+.site-pv,
+.page-pv {
+ display: inline-block;
+
+ .busuanzi-value {
+ margin: 0 5px;
+ }
+}
+
+if hexo-config("busuanzi_count.site_pv") and hexo-config("busuanzi_count.site_uv")
+ .site-uv
+ {
+ margin-right: 10px;
+
+ &::after {
+ content: "|";
+ padding-left: 10px;
+ }
+ }
diff --git a/source/css/_common/components/third-party/duoshuo.styl b/source/css/_common/components/third-party/duoshuo.styl
new file mode 100644
index 0000000000..33595189be
--- /dev/null
+++ b/source/css/_common/components/third-party/duoshuo.styl
@@ -0,0 +1,290 @@
+
+.theme-next {
+ $duoshuoBaseBorderColor = #c7d4e1;
+ $duoshuoBaseBgColor = #f6f8fa;
+
+ #ds-thread #ds-reset {
+ color: #555;
+ }
+
+ #ds-thread #ds-reset .ds-replybox {
+ margin-bottom: 30px;
+ }
+
+ #ds-thread #ds-reset .ds-replybox .ds-avatar, #ds-reset .ds-avatar img {
+ box-shadow: none;
+ }
+
+ #ds-thread #ds-reset .ds-textarea-wrapper {
+ border-color: $duoshuoBaseBorderColor;
+ background: none;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ }
+
+
+ #ds-thread #ds-reset .ds-textarea-wrapper textarea {
+ height: 60px;
+ }
+
+ #ds-reset .ds-rounded-top {
+ border-radius: 0;
+ }
+
+ #ds-thread #ds-reset .ds-post-toolbar {
+ box-sizing: border-box;
+ border: 1px solid $duoshuoBaseBorderColor;
+ background: $duoshuoBaseBgColor;
+ }
+
+ #ds-thread #ds-reset .ds-post-options {
+ height: 40px;
+ border: none;
+ background: none;
+ }
+
+ #ds-thread #ds-reset .ds-toolbar-buttons {
+ top: 11px;
+ }
+
+ #ds-thread #ds-reset .ds-sync {
+ top: 5px;
+ }
+
+ #ds-thread #ds-reset .ds-post-button {
+ top: 4px;
+ right: 5px;
+ width: 90px;
+ height: 30px;
+ border: 1px solid #c5ced7;
+ border-radius: 3px;
+ background-image: linear-gradient(#fbfbfc, #f5f7f9);
+ color: #60676d;
+ }
+
+ #ds-thread #ds-reset .ds-post-button:hover {
+ background-position: 0 -30px;
+ color: #60676d;
+ }
+
+ #ds-thread #ds-reset .ds-comments-info {
+ padding: 10px 0;
+ }
+
+ #ds-thread #ds-reset .ds-sort {
+ display: none;
+ }
+
+ #ds-thread #ds-reset li.ds-tab a.ds-current {
+ border: none;
+ background: $duoshuoBaseBgColor;
+ color: #60676d;
+
+ &:hover {
+ background-color: #e9f0f7;
+ color: #60676d;
+ }
+ }
+
+ #ds-thread #ds-reset li.ds-tab a {
+ border-radius: 2px;
+ padding: 5px;
+ }
+
+ #ds-thread #ds-reset .ds-login-buttons p {
+ color: #999;
+ line-height: 36px;
+ }
+
+ #ds-thread #ds-reset .ds-login-buttons .ds-service-list li {
+ height: 28px;
+ }
+
+ #ds-thread #ds-reset .ds-service-list a {
+ background: none;
+ padding: 5px;
+ border: 1px solid;
+ border-radius: 3px;
+ text-align: center;
+
+ &:hover {
+ color: #fff;
+ background: #666;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-weibo {
+ color: #fc9b00;
+ border-color: #fc9b00;
+
+ &:hover {
+ background: #fc9b00;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-qq {
+ color: #60a3ec;
+ border-color: #60a3ec;
+
+ &:hover {
+ background: #60a3ec;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-renren {
+ color: #2e7ac4;
+ border-color: #2e7ac4;
+
+ &:hover {
+ background: #2e7ac4;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-douban {
+ color: #37994c;
+ border-color: #37994c;
+
+ &:hover {
+ background: #37994c;
+ }
+ }
+ #ds-thread #ds-reset .ds-service-list .ds-kaixin {
+ color: #fef20d;
+ border-color: #fef20d;
+
+ &:hover {
+ background: #fef20d;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-netease {
+ color: #f00;
+ border-color: #f00;
+
+ &:hover {
+ background: #f00;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-sohu {
+ color: #ffcb05;
+ border-color: #ffcb05;
+
+ &:hover {
+ background: #ffcb05;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-baidu {
+ color: #2831e0;
+ border-color: #2831e0;
+
+ &:hover {
+ background: #2831e0;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-google {
+ color: #166bec;
+ border-color: #166bec;
+
+ &:hover {
+ background: #166bec;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-weixin {
+ color: #00CE0D;
+ border-color: #00CE0D;
+
+ &:hover {
+ background: #00CE0D;
+ }
+ }
+ #ds-thread #ds-reset .ds-service-list .ds-more-services {
+ border: none;
+ &:hover {
+ background: none;
+ }
+ }
+
+/*duoshuo UA style begin*/
+
+ #ds-reset .duoshuo-ua-admin {
+ display: inline-block;
+ color: red;
+ }
+
+ #ds-reset .duoshuo-ua-platform,
+ #ds-reset .duoshuo-ua-browser {
+ color: #ccc;
+
+ .fa {
+ display: inline-block;
+ margin-right: 3px;
+ }
+ }
+
+ #ds-reset .duoshuo-ua-separator {
+ display: inline-block;
+ margin-left: 5px;
+ }
+
+ .this_ua {
+ background-color: #ccc !important;
+ border-radius: 4px;
+ padding: 0 5px !important;
+ margin: 1px 1px !important;
+ border: 1px solid #BBB !important;
+ color: #fff;
+ display: inline-block !important;
+ }
+
+ .this_ua.admin {
+ background-color: #d9534f !important;
+ border-color: #d9534f !important;
+ }
+
+ .this_ua.platform.iOS, .this_ua.platform.Mac, .this_ua.platform.Windows {
+ background-color: #39b3d7 !important;
+ border-color: #46b8da !important;
+ }
+
+ .this_ua.platform.Linux {
+ background-color: #3A3A3A !important;
+ border-color: #1F1F1F !important;
+ }
+
+ .this_ua.platform.Android {
+ background-color: #00C47D !important;
+ border-color: #01B171 !important;
+ }
+
+ .this_ua.browser.Mobile, .this_ua.browser.Chrome {
+ background-color: #5cb85c !important;
+ border-color: #4cae4c !important;
+ }
+
+ .this_ua.browser.Firefox {
+ background-color: #f0ad4e !important;
+ border-color: #eea236 !important;
+ }
+
+ .this_ua.browser.Maxthon, .this_ua.browser.IE {
+ background-color: #428bca !important;
+ border-color: #357ebd !important;
+ }
+
+ .this_ua.browser.baidu, .this_ua.browser.UCBrowser, .this_ua.browser.Opera {
+ background-color: #d9534f !important;
+ border-color: #d43f3a !important;
+ }
+
+ .this_ua.browser.Android, .this_ua.browser.QQBrowser {
+ background-color: #78ACE9 !important;
+ border-color: #4cae4c !important;
+ }
+
+/*duoshuo UA style end*/
+
+}
diff --git a/source/css/_common/components/third-party/gitment.styl b/source/css/_common/components/third-party/gitment.styl
new file mode 100644
index 0000000000..52babf0baa
--- /dev/null
+++ b/source/css/_common/components/third-party/gitment.styl
@@ -0,0 +1,13 @@
+#gitment-display-button{
+ display: inline-block;
+ padding: 0 15px;
+ color: #0a9caf;
+ cursor: pointer;
+ font-size: 14px;
+ border: 1px solid #0a9caf;
+ border-radius: 4px;
+}
+#gitment-display-button:hover{
+ color: #fff;
+ background: #0a9caf;
+}
\ No newline at end of file
diff --git a/source/css/_common/components/third-party/han.styl b/source/css/_common/components/third-party/han.styl
new file mode 100644
index 0000000000..d02c9697bc
--- /dev/null
+++ b/source/css/_common/components/third-party/han.styl
@@ -0,0 +1,3 @@
+.fa {
+ font-family: FontAwesome!important;
+}
diff --git a/source/css/_common/components/third-party/jiathis.styl b/source/css/_common/components/third-party/jiathis.styl
new file mode 100644
index 0000000000..d501fb5034
--- /dev/null
+++ b/source/css/_common/components/third-party/jiathis.styl
@@ -0,0 +1,10 @@
+.post-spread {
+ margin-top: 20px;
+ text-align: center;
+}
+
+.jiathis_style {
+ display: inline-block;
+
+ a { border: none; }
+}
\ No newline at end of file
diff --git a/source/css/_common/components/third-party/localsearch.styl b/source/css/_common/components/third-party/localsearch.styl
new file mode 100644
index 0000000000..85f43cf9a6
--- /dev/null
+++ b/source/css/_common/components/third-party/localsearch.styl
@@ -0,0 +1,102 @@
+.local-search-pop-overlay
+ position: fixed
+ width: 100%
+ height: 100%
+ top: 0
+ left: 0
+ z-index: 2080
+ background-color: rgba(0, 0, 0, 0.3)
+
+.local-search-popup
+ display: none
+ position: fixed
+ top: 10%
+ left: 50%
+ margin-left: -350px
+ width: 700px
+ height: 80%
+ padding: 0
+ background: #fff
+ color: #333
+ z-index: 9999
+ border-radius: 5px
+ +mobile()
+ padding: 0
+ top: 0
+ left: 0
+ margin: 0
+ width: 100%
+ height: 100%
+ border-radius: 0
+
+ ul.search-result-list
+ padding: 0
+ margin: 0 5px
+
+ p.search-result
+ border-bottom: 1px dashed #ccc
+ padding: 5px 0
+
+ a.search-result-title
+ font-weight: bold
+ font-size: 16px
+
+ .search-keyword
+ border-bottom: 1px dashed #f00
+ font-weight: bold
+ color: #f00
+
+ .local-search-header
+ padding: 5px
+ height: 36px
+ background: #f5f5f5
+ border-top-left-radius: 5px
+ border-top-right-radius: 5px
+
+ #local-search-result
+ overflow: auto
+ position: relative
+ padding: 5px 25px
+ height: calc(100% - 55px)
+
+ .local-search-input-wrapper
+ display: inline-block
+ width: calc(100% - 90px)
+ height: 36px
+ line-height: 36px
+ padding: 0 5px
+
+ .local-search-input-wrapper input
+ padding: 8px 0
+ height: 20px
+ display: block
+ width: 100%
+ outline: none
+ border: none
+ background: transparent
+ vertical-align: middle
+
+ .search-icon, .popup-btn-close
+ display: inline-block
+ font-size: 18px
+ color: #999
+ height: 36px
+ width: 18px
+ padding-left: 10px
+ padding-right: 10px
+
+ .search-icon
+ float: left
+
+ .popup-btn-close
+ border-left: 1px solid #eee
+ float: right
+ cursor: pointer
+
+ #no-result
+ position: absolute
+ left: 50%
+ top: 50%
+ -webkit-transform: translate(-50%, -50%)
+ transform: translate(-50%, -50%)
+ color: #ccc
diff --git a/source/css/_common/components/third-party/needsharebutton.styl b/source/css/_common/components/third-party/needsharebutton.styl
new file mode 100644
index 0000000000..2caae446f9
--- /dev/null
+++ b/source/css/_common/components/third-party/needsharebutton.styl
@@ -0,0 +1,27 @@
+#needsharebutton-postbottom {
+ position: relative;
+ cursor: pointer;
+ height: 26px;
+
+ .btn {
+ display: initial;
+ padding: 1px 4px;
+ border: 1px solid $btn-default-border-color;
+ border-radius: 3px;
+ }
+}
+
+#needsharebutton-float {
+ position: fixed;
+ bottom: 38px;
+ left: -8px;
+ z-index: 9999;
+ cursor: pointer;
+
+ .btn {
+ //display: initial;
+ padding: 0 10px 0 14px
+ border: 1px solid $btn-default-border-color;
+ border-radius: 4px;
+ }
+}
diff --git a/source/css/_common/components/third-party/third-party.styl b/source/css/_common/components/third-party/third-party.styl
new file mode 100644
index 0000000000..c2298d002a
--- /dev/null
+++ b/source/css/_common/components/third-party/third-party.styl
@@ -0,0 +1,9 @@
+@import "duoshuo";
+@import "gitment" if hexo-config('gitment.enable');
+@import "jiathis";
+@import "han";
+@import "baidushare";
+@import "localsearch";
+@import "busuanzi-counter";
+@import "algolia-search" if hexo-config('algolia_search.enable');
+@import "needsharebutton" if hexo-config('needmoreshare2.enable');
diff --git a/source/css/_common/outline/outline.styl b/source/css/_common/outline/outline.styl
new file mode 100644
index 0000000000..7337e18235
--- /dev/null
+++ b/source/css/_common/outline/outline.styl
@@ -0,0 +1,58 @@
+//
+// Layout
+// Note: Must name this file "outline" instead of "layout"
+// Or Hexo will use it as template layout.
+// =================================================
+
+
+html, body { height: 100%; }
+
+.container {
+ position: relative;
+ min-height: 100%;
+}
+
+
+// Header Section
+// --------------------------------------------------
+.header-inner {
+ margin: 0 auto;
+ padding: 100px 0 70px;
+ width: $content-desktop;
+
+ +desktop-large() {
+ .container & { width: $content-desktop-large; }
+ }
+}
+
+// Main Section
+// --------------------------------------------------
+.main { padding-bottom: $footer-height + $gap-between-main-and-footer; }
+.main-inner {
+ margin: 0 auto;
+ width: $content-desktop;
+
+ +desktop-large() {
+ .container & { width: $content-desktop-large; }
+ }
+}
+
+
+// Footer Section
+// --------------------------------------------------
+.footer {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ min-height: $footer-height;
+}
+.footer-inner {
+ box-sizing: border-box;
+ margin: 20px auto;
+ width: $content-desktop;
+
+ +desktop-large() {
+ .container & { width: $content-desktop-large; }
+ }
+}
diff --git a/source/css/_common/scaffolding/base.styl b/source/css/_common/scaffolding/base.styl
new file mode 100644
index 0000000000..74c77e3297
--- /dev/null
+++ b/source/css/_common/scaffolding/base.styl
@@ -0,0 +1,111 @@
+
+::selection {
+ background: $selection-bg;
+ color: $selection-color;
+}
+
+body {
+ position: relative; // Required by scrollspy
+ font-family: $font-family-base;
+ font-size: $font-size-base;
+ line-height: $line-height-base;
+ color: $text-color;
+ background: $body-bg-color;
+
+ +mobile() { padding-right: 0 !important; }
+ +tablet() { padding-right: 0 !important; }
+ +desktop-large() { font-size: $font-size-large; }
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 0;
+ padding: 0;
+ font-weight: bold;
+ line-height: 1.5;
+ font-family: $font-family-headings;
+}
+
+h2, h3, h4, h5, h6 { margin: 20px 0 15px; }
+
+for headline in (1..6) {
+ h{headline} {
+ font-size: $font-size-headings-base - $font-size-headings-step * headline;
+ }
+
+ +mobile() {
+ h{headline} {
+ font-size: $font-size-headings-base - $font-size-headings-step * headline - 4px;
+ }
+ }
+}
+
+p { margin: 0 0 20px 0; }
+
+a {
+ color: $link-color;
+ text-decoration: none;
+ outline: none;
+ border-bottom: 1px solid $grey-dark;
+ word-wrap: break-word;
+
+ &:hover {
+ color: $link-hover-color;
+ border-bottom-color: $link-decoration-hover-color;
+ }
+}
+
+blockquote {
+ margin: 0;
+ padding: 0;
+}
+
+img {
+ display: block;
+ margin: auto;
+ max-width: 100%;
+ height: auto;
+}
+
+
+hr {
+ margin: 40px 0;
+ height: 3px;
+ border: none;
+ background-color: $gray-lighter;
+ background-image: repeating-linear-gradient(
+ -45deg,
+ white,
+ white 4px,
+ transparent 4px,
+ transparent 8px
+ );
+}
+
+blockquote {
+ padding: 0 15px;
+ color: $grey-dim;
+ border-left: 4px solid $gray-lighter;
+
+ cite::before {
+ content: "-";
+ padding: 0 5px;
+ }
+}
+
+dt { font-weight: $font-weight-bolder; }
+
+dd {
+ margin: 0;
+ padding: 0;
+}
+
+kbd {
+ border: 1px solid $grey-light;
+ border-radius: 0.2em;
+ box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1);
+ background-color: #f9f9f9;
+ font-family: inherit;
+ background-image: -webkit-linear-gradient(top, #eee, white, #eee);
+ padding: 0.1em 0.3em;
+ white-space: nowrap;
+}
diff --git a/source/css/_common/scaffolding/helpers.styl b/source/css/_common/scaffolding/helpers.styl
new file mode 100644
index 0000000000..a00d0bb4ff
--- /dev/null
+++ b/source/css/_common/scaffolding/helpers.styl
@@ -0,0 +1,67 @@
+//
+// Helpers
+// =================================================
+
+
+
+// Alignment
+.text-left { text-align: left; }
+.text-center { text-align: center; }
+.text-right { text-align: right; }
+.text-justify { text-align: justify; }
+.text-nowrap { white-space: nowrap; }
+
+
+// Transformation
+.text-lowercase { text-transform: lowercase; }
+.text-uppercase { text-transform: uppercase; }
+.text-capitalize { text-transform: capitalize; }
+
+
+// Center-align a block level element.
+.center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+
+// Clearfix. http://nicolasgallagher.com/micro-clearfix-hack/
+.clearfix {
+ clearfix();
+}
+
+.pullquote {
+ width: 45%;
+
+ &.left {
+ float: left;
+ margin-left: 5px;
+ margin-right: 10px;
+ }
+
+ &.right {
+ float: right;
+ margin-left: 10px;
+ margin-right: 5px;
+ }
+}
+
+.affix.affix.affix { position: fixed; }
+
+.translation {
+ margin-top: -20px;
+ font-size: 14px;
+ color: $grey-dark;
+}
+
+// https://davidwalsh.name/detect-scrollbar-width
+.scrollbar-measure {
+ width: 100px;
+ height: 100px;
+ overflow: scroll;
+ position: absolute;
+ top: -9999px;
+}
+
+.use-motion .motion-element { opacity: 0; }
diff --git a/source/css/_common/scaffolding/mobile.styl b/source/css/_common/scaffolding/mobile.styl
new file mode 100644
index 0000000000..191fbfdaa4
--- /dev/null
+++ b/source/css/_common/scaffolding/mobile.styl
@@ -0,0 +1,121 @@
+/*
+// > 1600px
++desktop-large() {
+
+}
+
+// > 992px
++desktop() {
+
+}
+
+// > 768px & < 991px
++tablet() {
+
+}
+
+
+// < 767px
++mobile() {
+
+}
+*/
+
+// < 567px
++mobile-small() {
+
+ // For Muse & Mist schemes only vertical economy.
+ .header-inner {
+ margin-bottom: initial !important;
+ }
+ .main-inner {
+ margin-top: initial !important;
+ }
+
+ // For Pisces & Gemini schemes only wider width (remove main blocks in Gemini).
+ .content-wrap {
+ padding: initial !important;
+ }
+
+ // For all schemes wider width.
+ .posts-expand {
+ padding-top: $content-mobile-padding !important;
+ // For Muse & Mist & Pisces schemes only wider width.
+ margin: initial !important;
+
+ .post-header {
+ padding: 0 18px;
+ }
+
+ .post-meta {
+ margin: 3px 0 10px 0 !important;
+ }
+
+ }
+
+ .post-block {
+ // Inside posts blocks content padding (default 40px).
+ padding: $content-mobile-padding 0 !important;
+ }
+
+ .post-body {
+ // For headers narrow width.
+ h2, h3, h4, h5, h6 {
+ margin: 10px 18px 8px;
+ }
+ // Rewrite paddings & margins inside tags.
+ .note, .tabs .tab-content .tab-pane {
+ h2, h3, h4, h5, h6 {
+ margin: 0 5px;
+ }
+ }
+
+ // For paragraphs narrow width.
+ p {
+ margin: 0 0 10px 0;
+ padding: 0 18px;
+ }
+
+ // Rewrite paddings & margins inside tags.
+ .note > p, .tabs .tab-content .tab-pane > p {
+ padding: 0 5px;
+ }
+
+ .video-container .fluid-vids {
+ margin-bottom: 10px !important;
+ }
+
+ .note {
+ padding: 10px !important;
+ margin-bottom: 10px !important;
+
+ if hexo-config('note.icons') {
+ &:not(.no-icon) {
+ padding-left: 35px !important;
+ &:before {
+ top: 8px !important;
+ left: 12px !important;
+ }
+ }
+ }
+ }
+
+ .tabs .tab-content .tab-pane {
+ padding: 10px 10px 0 10px !important;
+ }
+ }
+
+ // Need to refactor into flex.
+ .post-nav {
+ padding-bottom: 2px;
+ //padding: 2px 8px;
+ }
+
+}
+
+/*
+// < 413px
++mobile-smallest() {
+
+}
+*/
diff --git a/source/css/_common/scaffolding/normalize.styl b/source/css/_common/scaffolding/normalize.styl
new file mode 100644
index 0000000000..81c6f31ea4
--- /dev/null
+++ b/source/css/_common/scaffolding/normalize.styl
@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
\ No newline at end of file
diff --git a/source/css/_common/scaffolding/scaffolding.styl b/source/css/_common/scaffolding/scaffolding.styl
new file mode 100644
index 0000000000..b5d3500250
--- /dev/null
+++ b/source/css/_common/scaffolding/scaffolding.styl
@@ -0,0 +1,9 @@
+//
+// Scaffolding
+// =================================================
+
+@import "normalize";
+@import "base";
+@import "helpers";
+@import "tables";
+@import "mobile" if hexo-config('mobile_layout_economy');
diff --git a/source/css/_common/scaffolding/tables.styl b/source/css/_common/scaffolding/tables.styl
new file mode 100644
index 0000000000..c653b812f1
--- /dev/null
+++ b/source/css/_common/scaffolding/tables.styl
@@ -0,0 +1,33 @@
+table {
+ margin: 20px 0;
+ width: $table-width;
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px solid $table-border-color;
+ font-size: $table-font-size;
+ table-layout: fixed;
+ word-wrap: break-all;
+}
+table>tbody>tr {
+ &:nth-of-type(odd) { background-color: $table-row-odd-bg-color; }
+ &:hover { background-color: $table-row-hover-bg-color; }
+}
+
+caption, th, td {
+ padding: $table-cell-padding;
+ text-align: $table-content-alignment;
+ vertical-align: $table-content-vertical;
+ font-weight: normal;
+}
+
+th, td {
+ border-bottom: 3px solid $table-cell-border-bottom-color;
+ border-right: 1px solid $table-cell-border-right-color;
+}
+
+th {
+ padding-bottom: 10px;
+ font-weight: $table-th-font-weight;
+}
+
+td { border-bottom-width: 1px; }
diff --git a/source/css/_custom/custom.styl b/source/css/_custom/custom.styl
new file mode 100644
index 0000000000..63937f7cf4
--- /dev/null
+++ b/source/css/_custom/custom.styl
@@ -0,0 +1 @@
+// Custom styles.
diff --git a/source/css/_mixins/Gemini.styl b/source/css/_mixins/Gemini.styl
new file mode 100644
index 0000000000..eb4102ee2e
--- /dev/null
+++ b/source/css/_mixins/Gemini.styl
@@ -0,0 +1 @@
+@import "Pisces.styl";
diff --git a/source/css/_mixins/Mist.styl b/source/css/_mixins/Mist.styl
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/source/css/_mixins/Muse.styl b/source/css/_mixins/Muse.styl
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/source/css/_mixins/Pisces.styl b/source/css/_mixins/Pisces.styl
new file mode 100644
index 0000000000..34543b17a3
--- /dev/null
+++ b/source/css/_mixins/Pisces.styl
@@ -0,0 +1,17 @@
+sidebar-inline-links-item() {
+ margin: 5px 0 0;
+ if !hexo-config('social_icons.icons_only') { width: 50%; }
+
+ & a {
+ max-width: 216px;
+ box-sizing: border-box;
+ display: inline-block;
+ margin-right: 0;
+ margin-bottom: 0;
+ padding: 0 5px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ if hexo-config('social_icons.transition') { the-transition(); }
+ }
+}
diff --git a/source/css/_mixins/base.styl b/source/css/_mixins/base.styl
new file mode 100644
index 0000000000..0e787f7948
--- /dev/null
+++ b/source/css/_mixins/base.styl
@@ -0,0 +1,92 @@
+the-transition() {
+ transition-duration: 0.2s;
+ transition-timing-function: ease-in-out;
+ transition-delay: 0s;
+}
+
+the-transition-ease-in() {
+ transition-duration: 0.2s;
+ transition-timing-function: ease-in;
+ transition-delay: 0s;
+}
+
+the-transition-ease-out() {
+ transition-duration: 0.2s;
+ transition-timing-function: ease-out;
+ transition-delay: 0s;
+}
+
+mobile-smallest() {
+ @media (max-width: 413px) {
+ {block}
+ }
+}
+
+mobile-small() {
+ @media (max-width: 567px) {
+ {block}
+ }
+}
+
+mobile() {
+ @media (max-width: 767px) {
+ {block}
+ }
+}
+
+tablet() {
+ @media (min-width: 768px) and (max-width: 991px) {
+ {block}
+ }
+}
+
+desktop() {
+ @media (min-width: 992px) {
+ {block}
+ }
+}
+
+desktop-large() {
+ @media (min-width: 1600px) {
+ {block}
+ }
+}
+
+circle() {
+ border-radius: 50%;
+}
+
+transform() {
+ -webkit-transform: arguments
+ -moz-transform: arguments
+ -ms-transform: arguments
+ -o-transform: arguments
+ transform: arguments
+}
+
+hide() {
+ display: none !important;
+}
+
+show() {
+ display: block !important;
+}
+
+fixbutton() {
+ right: 20px;
+ opacity: 0.8;
+}
+
+random-color($min, $max) {
+ return floor(math(0, 'random') * ($max - $min + 1) + $min);
+}
+
+// Clearfix. http://nicolasgallagher.com/micro-clearfix-hack/
+clearfix() {
+ &:before,
+ &:after {
+ content: " ";
+ display: table;
+ }
+ &:after { clear: both; }
+}
diff --git a/source/css/_mixins/custom.styl b/source/css/_mixins/custom.styl
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/source/css/_schemes/Gemini/index.styl b/source/css/_schemes/Gemini/index.styl
new file mode 100644
index 0000000000..95dd34dc4c
--- /dev/null
+++ b/source/css/_schemes/Gemini/index.styl
@@ -0,0 +1,243 @@
+@import "../Pisces/_layout";
+@import "../Pisces/_brand";
+@import "../Pisces/_menu";
+@import "../Pisces/_sidebar";
+// Import _posts if want to justify text-align on mobile.
+//@import "../Pisces/_posts";
+
+// =================================================
+// Rewrite _layout.styl
+// =================================================
+// Sidebar padding used as main desktop content padding for sidebar padding and post blocks padding too.
+
+// In main NexT config set `sidebar: offset: 12` option as main padding.
+// In `source/css/_variables/Gemini.styl` there are variables for other resolutions:
+// $content-tablet-paddin = 10px;
+// $content-mobile-padding = 8px;
+// P.S. If u want to change this paddings u may set this variables into `source/css/_variables/custom.styl`.
+
+// So, it will 12px in Desktop, 10px in Tablets and 8px in Mobiles for all possible paddings.
+// =================================================
+// Read values from NexT config and set they as local variables to use as string variables (in any CSS section).
+hexo-config('sidebar.offset') is a 'unit' ? (sboffset = unit(hexo-config('sidebar.offset'), px)) : (sboffset = 0)
+use_seo = hexo-config('seo');
+
+// =================================================
+// Desktop layout styles.
+// =================================================
+// Post blocks.
+.content-wrap {
+ padding: initial;
+ background: initial;
+ box-shadow: initial;
+ border-radius: initial;
+}
+
+// Post & Comments blocks.
+.post-block {
+ padding: $content-desktop-padding;
+ background: white;
+ box-shadow: $box-shadow-inner;
+ border-radius: $border-radius-inner;
+}
+
+// When blocks are siblings (homepage).
+#posts > article + article {
+ .post-block {
+ margin-top: sboffset;
+ // Rewrite shadows & borders because all blocks have offsets.
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ }
+}
+
+// Comments blocks.
+.comments {
+ padding: $content-desktop-padding;
+ margin: initial;
+ margin-top: sboffset;
+ background: white;
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+}
+
+// Top main padding from header to posts (default 40px).
+.posts-expand {
+ padding-top: initial;
+}
+
+// Post navigation items.
+.post-nav-divider {
+ width: 4%;
+}
+.post-nav-item {
+ width: 48%;
+}
+
+// Post delimiters.
+.post-eof,
+.post-spread {
+ hide();
+}
+
+// Pagination.
+.pagination {
+ .prev, .next, .page-number {
+ margin-bottom: initial;
+ top: initial;
+ }
+ margin: sboffset 0 0;
+ border-top: initial;
+ background: white;
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ padding: 10px 0 10px;
+}
+
+// Footer alignment.
+.main {
+ padding-bottom: initial;
+}
+.footer {
+ bottom: auto;
+}
+
+// =================================================
+// Headers.
+// =================================================
+// No need anymore?
+.post-header {
+ h1, h2 {
+ margin: initial;
+ }
+}
+.posts-expand .post-title-link {
+ line-height: inherit;
+}
+.posts-expand .post-title {
+ font-size: 1.7em;
+}
+.post-body {
+ h1 {
+ font-size: 1.6em;
+ border-bottom: 1px solid $body-bg-color;
+ }
+ h2 {
+ font-size: 1.45em;
+ border-bottom: 1px solid $body-bg-color;
+ }
+ h3 {
+ font-size: 1.3em;
+ if use_seo {
+ border-bottom: 1px solid $body-bg-color;
+ } else {
+ border-bottom: 1px dotted $body-bg-color;
+ }
+ }
+ h4 {
+ font-size: 1.2em;
+ if use_seo {
+ border-bottom: 1px dotted $body-bg-color;
+ }
+ }
+ h5 {
+ font-size: 1.07em;
+ }
+ h6 {
+ font-size: 1.03em;
+ }
+}
+
+// =================================================
+// > 768px & < 991px
+// =================================================
++tablet() {
+
+ // Posts in blocks.
+ .content-wrap {
+ padding: $content-tablet-padding;
+ }
+ .posts-expand {
+ margin: initial;
+
+ // Components inside Posts.
+ .post-button {
+ margin-top: ($content-tablet-padding * 2);
+ }
+ }
+
+ .post-block {
+ // Inside posts blocks content padding (default 40px).
+ padding: ($content-tablet-padding * 2);
+ // Rewrite shadows & borders because all blocks have offsets.
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ }
+
+ // Only if blocks are siblings need bottom margin (homepage).
+ #posts > article + article {
+ .post-block {
+ margin-top: $content-tablet-padding;
+ }
+ }
+
+ .comments {
+ margin-top: $content-tablet-padding;
+ padding: $content-tablet-padding ($content-tablet-padding * 2);
+ //padding: initial;
+ //padding-top: $content-tablet-padding;
+ }
+
+ .pagination {
+ margin: $content-tablet-padding 0 0;
+ }
+
+}
+// =================================================
+// < 767px
+// =================================================
++mobile() {
+
+ // Posts in blocks.
+ .content-wrap {
+ padding: $content-mobile-padding;
+ }
+ .posts-expand {
+ margin: initial;
+
+ // Components inside Posts.
+ .post-button {
+ margin-top: sboffset;
+ //padding-bottom : 15px;
+ }
+ img {
+ padding: initial !important;
+ }
+ }
+
+ .post-block {
+ // Inside posts blocks content padding (default 40px).
+ padding: sboffset;
+ min-height: auto;
+ // Rewrite shadows & borders because all blocks have offsets.
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ }
+
+ // Only if blocks are siblings need bottom margin (homepage).
+ #posts > article + article {
+ .post-block {
+ margin-top: $content-mobile-padding;
+ }
+ }
+
+ .comments {
+ margin-top: $content-mobile-padding;
+ padding: 0 sboffset;
+ }
+
+ .pagination {
+ margin: $content-mobile-padding 0 0;
+ }
+
+}
diff --git a/source/css/_schemes/Mist/_base.styl b/source/css/_schemes/Mist/_base.styl
new file mode 100644
index 0000000000..97dc4cb795
--- /dev/null
+++ b/source/css/_schemes/Mist/_base.styl
@@ -0,0 +1,12 @@
+// Tags
+// --------------------------------------------------
+h1, h2, h3, h4, h5, h6 { margin: 20px 0 10px; }
+
+p { margin: 0 0 25px 0; }
+
+a { border-bottom-color: $grey-light; }
+
+hr {
+ margin: 20px 0;
+ height: 2px;
+}
diff --git a/source/css/_schemes/Mist/_header.styl b/source/css/_schemes/Mist/_header.styl
new file mode 100644
index 0000000000..a191649073
--- /dev/null
+++ b/source/css/_schemes/Mist/_header.styl
@@ -0,0 +1,63 @@
+// Header
+// --------------------------------------------------
+.header { background: $whitesmoke; }
+.header-inner {
+ padding: 25px 0 20px;
+ clearfix();
+
+ +mobile() {
+ width: auto;
+ margin-bottom: 50px;
+ padding: 10px;
+ }
+}
+
+.site-meta {
+ float: left;
+ margin-left: -20px;
+ line-height: normal;
+
+ +mobile() {
+ margin-left: 10px;
+ }
+
+ .brand {
+ padding: 2px 1px;
+ background: none;
+
+ +mobile() { display: block; }
+ }
+
+ .logo { display: none; }
+
+ .site-title {
+ font-size: 22px;
+ font-weight: bolder;
+
+ +mobile() { line-height: 34px; }
+ }
+}
+
+
+.logo-line-before,
+.logo-line-after {
+ display: block;
+ overflow: hidden;
+ margin: 0 auto;
+ width: 75%;
+
+ +mobile() { display: none; }
+
+ i {
+ position: relative;
+ display: block;
+ height: 2px;
+ background: $black-deep;
+ +mobile() { height: 3px; }
+ }
+}
+
+.use-motion {
+ .logo-line-before i { left: -100%; }
+ .logo-line-after i { right: -100%; }
+}
diff --git a/source/css/_schemes/Mist/_logo.styl b/source/css/_schemes/Mist/_logo.styl
new file mode 100644
index 0000000000..571b407073
--- /dev/null
+++ b/source/css/_schemes/Mist/_logo.styl
@@ -0,0 +1 @@
+.site-subtitle { display: none; }
diff --git a/source/css/_schemes/Mist/_menu.styl b/source/css/_schemes/Mist/_menu.styl
new file mode 100644
index 0000000000..fa0cd4e4da
--- /dev/null
+++ b/source/css/_schemes/Mist/_menu.styl
@@ -0,0 +1,46 @@
+// Menu
+// --------------------------------------------------
+.site-nav-toggle {
+ position: static;
+ float: right;
+}
+
+
+.menu {
+ float: right;
+ margin: 8px 0 0 0;
+
+ +mobile() {
+ margin: 20px 0 0 0;
+ padding: 0;
+ }
+
+ br { display: none; }
+
+ .menu-item {
+ margin: 0;
+ +mobile() { display: block; }
+ }
+
+ .menu-item a {
+ padding: 0 10px;
+ background: none;
+ border: none;
+ border-radius: 2px;
+ transition-property: background;
+
+ +mobile() {
+ text-align: left;
+ }
+
+ &:hover { background: #e1e1e1; }
+ }
+
+ a::before {
+ display: none;
+
+ +mobile() { display: block; }
+ }
+
+ +mobile() { float: none; }
+}
diff --git a/source/css/_schemes/Mist/_posts-expanded.styl b/source/css/_schemes/Mist/_posts-expanded.styl
new file mode 100644
index 0000000000..4ca1b298fe
--- /dev/null
+++ b/source/css/_schemes/Mist/_posts-expanded.styl
@@ -0,0 +1,67 @@
+// Post Expanded
+// --------------------------------------------------
+.posts-expand {
+ padding-top: 0;
+
+ .post-title,
+ .post-meta {
+ text-align: $site-meta-text-align;
+ +mobile() { text-align: center; }
+ }
+ .post-eof { display: none; }
+
+ .post { margin-top: 120px; }
+ .post:first-child { margin-top: 0; }
+
+ .post-meta {
+ margin-top: 5px;
+ margin-bottom: 20px;
+ }
+
+ .post-title {
+ position: relative;
+ font-size: $font-size-headings-base;
+ font-weight: 400;
+ +mobile() { font-size: $font-size-headings-small; }
+ +desktop-large() { font-size: $font-size-headings-large; }
+ }
+ .post-title:hover:before { background: $black-deep; }
+
+ .post-body {
+ +mobile() { font-size: $font-size-small; }
+ }
+
+ .post-body img { margin: 0; }
+
+ .post-tags {
+ text-align: left;
+ a {
+ padding: 1px 5px;
+ background: $whitesmoke;
+ border-bottom: none;
+ }
+ a:hover { background: $grey-light; }
+ }
+ .post-nav { margin-top: 40px; }
+}
+
+.post-button {
+ margin-top: 20px;
+ text-align: left;
+
+ a {
+ padding: 0;
+ font-size: $font-size-base;
+ //color: $grey-dim;
+ background: none;
+ border: none;
+ border-bottom: 2px solid $grey-dim;
+ transition-property: border;
+
+ +mobile() { font-size: $font-size-small; }
+ +desktop-large() { font-size: $font-size-large; }
+
+
+ &:hover { border-bottom-color: $black-deep; }
+ }
+}
diff --git a/source/css/_schemes/Mist/_search.styl b/source/css/_schemes/Mist/_search.styl
new file mode 100644
index 0000000000..6cd7b2c960
--- /dev/null
+++ b/source/css/_schemes/Mist/_search.styl
@@ -0,0 +1,5 @@
+// Search
+// --------------------------------------------------
+.site-search form {
+ display: none;
+}
\ No newline at end of file
diff --git a/source/css/_schemes/Mist/index.styl b/source/css/_schemes/Mist/index.styl
new file mode 100644
index 0000000000..7d047f4db2
--- /dev/null
+++ b/source/css/_schemes/Mist/index.styl
@@ -0,0 +1,91 @@
+//
+// Mist scheme
+// =================================================
+
+@import "_base";
+@import "outline/outline";
+@import "_header";
+@import "_logo";
+@import "_menu";
+@import "_search.styl";
+@import "_posts-expanded";
+@import "sidebar/sidebar-blogroll";
+
+
+// Components
+// --------------------------------------------------
+.btn {
+ padding: 0 10px;
+ border-width: 2px;
+ border-radius: 0;
+}
+
+.headband { display: none; }
+
+
+// Search
+// --------------------------------------------------
+.site-search {
+ position: relative;
+ float: right;
+ margin-top: 5px;
+ padding-top: 3px;
+
+ +mobile() {
+ float: none;
+ padding: 0 10px;
+ }
+}
+
+
+// Page - Container
+// --------------------------------------------------
+.container .main-inner {
+ +mobile() { width: auto; }
+}
+
+
+// Page - Post details
+// --------------------------------------------------
+.page-post-detail {
+ .post-title,
+ .post-meta { text-align: center; }
+
+ .post-title:before { display: none; }
+
+ .post-meta { margin-bottom: 60px; }
+}
+
+
+// Pagination
+// --------------------------------------------------
+.pagination {
+ margin: 120px 0 0;
+ text-align: left;
+
+ +mobile() {
+ margin: 80px 10px 0;
+ text-align: center;
+ }
+}
+
+// Footer
+// --------------------------------------------------
+.footer {
+ margin-top: 80px;
+ padding: 10px 0;
+ background: $whitesmoke;
+ color: $grey-dim;
+}
+.footer-inner {
+ margin: 0 auto;
+ text-align: left;
+
+ +mobile() {
+ width: auto;
+ text-align: center;
+ }
+}
+
+// Helpers
+// --------------------------------------------------
diff --git a/source/css/_schemes/Mist/outline/outline.styl b/source/css/_schemes/Mist/outline/outline.styl
new file mode 100644
index 0000000000..12c0bae253
--- /dev/null
+++ b/source/css/_schemes/Mist/outline/outline.styl
@@ -0,0 +1 @@
+.main-inner { margin-top: 80px; }
diff --git a/source/css/_schemes/Mist/sidebar/sidebar-blogroll.styl b/source/css/_schemes/Mist/sidebar/sidebar-blogroll.styl
new file mode 100644
index 0000000000..6db1ed79ba
--- /dev/null
+++ b/source/css/_schemes/Mist/sidebar/sidebar-blogroll.styl
@@ -0,0 +1 @@
+.links-of-blogroll-inline .links-of-blogroll-item { display: inline-block; }
diff --git a/source/css/_schemes/Muse/_layout.styl b/source/css/_schemes/Muse/_layout.styl
new file mode 100644
index 0000000000..010747229a
--- /dev/null
+++ b/source/css/_schemes/Muse/_layout.styl
@@ -0,0 +1,9 @@
+.header-inner, .container .main-inner, .footer-inner {
+ +mobile() { width: auto; }
+}
+
+// embed tag
+embed {
+ display: block;
+ margin: 0px auto 25px auto;
+}
diff --git a/source/css/_schemes/Muse/_logo.styl b/source/css/_schemes/Muse/_logo.styl
new file mode 100644
index 0000000000..1d0437aefd
--- /dev/null
+++ b/source/css/_schemes/Muse/_logo.styl
@@ -0,0 +1,21 @@
+.custom-logo {
+ .site-meta-headline { text-align: center; }
+
+ .brand { background: none; }
+
+ .site-title {
+ margin: 10px auto 0;
+ font-size: 24px;
+ color: $black-deep;
+ a { border: none; }
+ }
+
+
+}
+
+.custom-logo-image {
+ margin: 0 auto;
+ padding: 5px;
+ max-width: 150px;
+ background: white;
+}
diff --git a/source/css/_schemes/Muse/_menu.styl b/source/css/_schemes/Muse/_menu.styl
new file mode 100644
index 0000000000..b18fed9443
--- /dev/null
+++ b/source/css/_schemes/Muse/_menu.styl
@@ -0,0 +1,33 @@
+.site-nav {
+ +mobile() {
+ position: absolute;
+ left: 0;
+ top: 52px;
+ margin: 0;
+ width: 100%;
+ padding: 0;
+ background: white;
+ border-bottom: 1px solid $gray-lighter;
+ z-index: $zindex-5;
+ }
+}
+
+.menu {
+ +mobile() { text-align: left; }
+}
+.menu .menu-item {
+ +mobile() {
+ display: block;
+ margin: 0 10px;
+ vertical-align: top;
+ }
+
+ br {
+ +mobile() { display: none; }
+ }
+
+ a {
+ +mobile() { padding: 5px 10px; }
+ }
+ .fa { margin-right: 0; }
+}
diff --git a/source/css/_schemes/Muse/_search.styl b/source/css/_schemes/Muse/_search.styl
new file mode 100644
index 0000000000..6cd7b2c960
--- /dev/null
+++ b/source/css/_schemes/Muse/_search.styl
@@ -0,0 +1,5 @@
+// Search
+// --------------------------------------------------
+.site-search form {
+ display: none;
+}
\ No newline at end of file
diff --git a/source/css/_schemes/Muse/index.styl b/source/css/_schemes/Muse/index.styl
new file mode 100644
index 0000000000..35effe878d
--- /dev/null
+++ b/source/css/_schemes/Muse/index.styl
@@ -0,0 +1,5 @@
+@import "_layout.styl";
+@import "_logo.styl";
+@import "_menu.styl";
+@import "_search.styl";
+@import "sidebar/sidebar-blogroll";
diff --git a/source/css/_schemes/Muse/sidebar/sidebar-blogroll.styl b/source/css/_schemes/Muse/sidebar/sidebar-blogroll.styl
new file mode 100644
index 0000000000..6db1ed79ba
--- /dev/null
+++ b/source/css/_schemes/Muse/sidebar/sidebar-blogroll.styl
@@ -0,0 +1 @@
+.links-of-blogroll-inline .links-of-blogroll-item { display: inline-block; }
diff --git a/source/css/_schemes/Pisces/_brand.styl b/source/css/_schemes/Pisces/_brand.styl
new file mode 100644
index 0000000000..c85ee8f506
--- /dev/null
+++ b/source/css/_schemes/Pisces/_brand.styl
@@ -0,0 +1,30 @@
+.site-brand-wrapper {
+ position: relative;
+}
+
+.site-meta {
+ padding: 20px 0;
+ color: white;
+ background: $black-deep;
+
+ +tablet() {
+ box-shadow: 0 0 16px rgba(0,0,0,0.5);
+ }
+ +mobile() {
+ box-shadow: 0 0 16px rgba(0,0,0,0.5);
+ }
+}
+
+.brand {
+ padding: 0;
+ background: none;
+
+ &:hover { color: white; }
+}
+
+.site-subtitle {
+ margin: 10px 10px 0;
+ font-weight: initial;
+}
+
+.site-search form { display: none; }
diff --git a/source/css/_schemes/Pisces/_layout.styl b/source/css/_schemes/Pisces/_layout.styl
new file mode 100644
index 0000000000..f7e5e0de9e
--- /dev/null
+++ b/source/css/_schemes/Pisces/_layout.styl
@@ -0,0 +1,130 @@
+.header {
+ position: relative;
+ margin: 0 auto;
+ width: $main-desktop;
+
+ +tablet() {
+ width: auto;
+ }
+ +mobile() {
+ width: auto;
+ }
+}
+
+.header-inner {
+ position: absolute;
+ top: 0;
+ overflow: hidden;
+ padding: 0;
+ width: 240px;
+ background: white;
+ box-shadow: $box-shadow-inner;
+ border-radius: $border-radius-inner;
+
+ +desktop-large() {
+ .container & { width: 240px; }
+ }
+ +tablet() {
+ position: relative;
+ width: auto;
+ border-radius: initial;
+ }
+ +mobile() {
+ position: relative;
+ width: auto;
+ border-radius: initial;
+ }
+}
+
+.main {
+ clearfix();
+ +tablet() {
+ padding-bottom: 100px;
+ }
+ +mobile() {
+ padding-bottom: 100px;
+ }
+}
+
+.container .main-inner {
+ width: $main-desktop;
+
+ +tablet() {
+ width: auto;
+ }
+ +mobile() {
+ width: auto;
+ }
+}
+
+.content-wrap {
+ float: right;
+ box-sizing: border-box;
+ padding: $content-desktop-padding;
+ width: $content-desktop;
+ background: white;
+ min-height: 700px;
+ box-shadow: $box-shadow-inner;
+ border-radius: $border-radius-inner;
+
+ +tablet() {
+ width: 100%;
+ padding: 20px;
+ border-radius: initial;
+ }
+ +mobile() {
+ width: 100%;
+ padding: 20px;
+ min-height: auto;
+ border-radius: initial;
+ }
+}
+
+.sidebar {
+ position: static;
+ float: left;
+ margin-top: 300px;
+ width: $sidebar-desktop;
+ background: $body-bg-color;
+ box-shadow: none;
+
+ +tablet() {
+ display: none;
+ }
+ +mobile() {
+ display: none;
+ }
+}
+
+.sidebar-toggle { display: none; }
+
+
+.footer-inner {
+ width: $main-desktop;
+ padding-left: 260px;
+
+ +tablet() {
+ width: auto;
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ }
+ +mobile() {
+ width: auto;
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ }
+}
+
+
+
+.sidebar-position-right {
+ .header-inner { right: 0; }
+ .content-wrap { float: left; }
+ .sidebar { float: right; }
+
+ .footer-inner {
+ padding-left: 0;
+ padding-right: 260px;
+ }
+}
+
diff --git a/source/css/_schemes/Pisces/_menu.styl b/source/css/_schemes/Pisces/_menu.styl
new file mode 100644
index 0000000000..21986ace25
--- /dev/null
+++ b/source/css/_schemes/Pisces/_menu.styl
@@ -0,0 +1,67 @@
+.site-nav {
+ border-top: none;
+
+ +tablet() {
+ display: none !important;
+ }
+}
+
+.site-nav-on {
+ +tablet() {
+ display: block !important;
+ }
+}
+
+.menu .menu-item {
+ display: block;
+ margin: 0;
+
+ a {
+ position: relative;
+ box-sizing: border-box;
+ padding: 5px 20px;
+ text-align: left;
+ line-height: inherit;
+ transition-property: background-color;
+ the-transition();
+
+ &:hover {
+ background: #f9f9f9;
+ border-bottom-color: white;
+ }
+ }
+
+ br { display: none; }
+}
+
+.menu-item-active a {
+ @extend .menu .menu-item a:hover;
+
+ &:after {
+ content: " ";
+ position: absolute;
+ top: 50%;
+ margin-top: -3px;
+ right: 15px;
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background-color: $grey;
+ }
+}
+
+.btn-bar {
+ background-color: white;
+}
+
+.site-nav-toggle {
+ left: 20px;
+ top: 50%;
+
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+
+ +tablet() {
+ display: block;
+ }
+}
diff --git a/source/css/_schemes/Pisces/_posts.styl b/source/css/_schemes/Pisces/_posts.styl
new file mode 100644
index 0000000000..498409d9ce
--- /dev/null
+++ b/source/css/_schemes/Pisces/_posts.styl
@@ -0,0 +1,5 @@
+.post-body {
+ +mobile() {
+ text-align: justify;
+ }
+}
diff --git a/source/css/_schemes/Pisces/_sidebar.styl b/source/css/_schemes/Pisces/_sidebar.styl
new file mode 100644
index 0000000000..9adfb55a25
--- /dev/null
+++ b/source/css/_schemes/Pisces/_sidebar.styl
@@ -0,0 +1,124 @@
+.use-motion .sidebar .motion-element { opacity: 1; }
+
+.sidebar {
+ margin-left: -100%;
+ right: auto;
+ bottom: auto;
+
+ // Do NOT delete this line
+ // or Affix (position: fixed) will not work in Google Chrome.
+ -webkit-transform: none;
+}
+
+
+.sidebar-inner {
+//padding: 20px 10px 0;
+ box-sizing: border-box;
+ width: 240px;
+ color: $text-color;
+ background: white;
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ if (hexo-config('motion.enable') and hexo-config('motion.transition.sidebar')) { opacity: 0; }
+
+ &.affix {
+ position: fixed;
+ top: $sidebar-offset;
+ }
+
+ &.affix-bottom {
+ position: absolute;
+ }
+
+}
+
+.site-overview {
+ //margin: 0 2px;
+ text-align: left;
+}
+
+.site-author {
+ clearfix();
+}
+
+.sidebar a {
+ color: $black-light;
+
+ &:hover { color: $black-deep; }
+}
+
+.site-state-item {
+ padding: 0 10px;
+}
+
+.links-of-author-item {
+ a:before { display: none; }
+ a {
+ border-bottom: none;
+ text-decoration: underline;
+ }
+}
+
+.feed-link {
+ border-top: 1px dotted $grey-light;
+ border-bottom: 1px dotted $grey-light;
+ text-align: center;
+}
+
+.feed-link a {
+ display: block;
+ color: $orange;
+ border: none;
+
+ &:hover {
+ background: none;
+ color: darken($orange, 20%);
+
+ i { color: darken($orange, 20%); }
+ }
+}
+
+.links-of-author {
+ //clearfix();
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+.links-of-author-item {
+ sidebar-inline-links-item();
+
+ a {
+ display: block;
+ text-decoration: none;
+
+ &:hover {
+ border-radius: 4px;
+ background: $gainsboro;
+ }
+ }
+
+ .fa {
+ margin-right: 2px;
+ font-size: 16px;
+ }
+ .fa-globe { font-size: 15px; }
+}
+
+
+.links-of-blogroll {
+ text-align: center;
+ margin-top: 20px;
+ padding: 3px 0 0;
+ border-top: 1px dotted $grey-light;
+}
+.links-of-blogroll-title { margin-top: 0; }
+.links-of-blogroll-item { padding: 0; }
+.links-of-blogroll-inline {
+ clearfix();
+
+ .links-of-blogroll-item {
+ sidebar-inline-links-item();
+ display: inline-block;
+ if !hexo-config('social_icons.icons_only') { width: unset; }
+ }
+}
diff --git a/source/css/_schemes/Pisces/index.styl b/source/css/_schemes/Pisces/index.styl
new file mode 100644
index 0000000000..cda4936e38
--- /dev/null
+++ b/source/css/_schemes/Pisces/index.styl
@@ -0,0 +1,5 @@
+@import "_layout";
+@import "_brand";
+@import "_menu";
+@import "_sidebar";
+@import "_posts";
diff --git a/source/css/_variables/Gemini.styl b/source/css/_variables/Gemini.styl
new file mode 100644
index 0000000000..4d6e7e01a3
--- /dev/null
+++ b/source/css/_variables/Gemini.styl
@@ -0,0 +1,21 @@
+// Variables of Gemini scheme
+// =================================================
+
+@import "Pisces.styl";
+
+// Settings for some of the most global styles.
+// --------------------------------------------------
+$body-bg-color = #eee
+$main-desktop = 75%
+$sidebar-desktop = 240px
+$content-desktop = calc(100% - 252px)
+
+// Borders.
+// --------------------------------------------------
+$box-shadow-inner = 0 2px 2px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.06), 0 1px 5px 0 rgba(0,0,0,.12)
+$box-shadow = 0 2px 2px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.06), 0 1px 5px 0 rgba(0,0,0,.12), 0 -1px .5px 0 rgba(0,0,0,.09)
+
+$border-radius-inner = initial
+$border-radius = initial
+//$border-radius-inner = 0 0 3px 3px;
+//$border-radius = 3px;
diff --git a/source/css/_variables/Mist.styl b/source/css/_variables/Mist.styl
new file mode 100644
index 0000000000..8ead36ee01
--- /dev/null
+++ b/source/css/_variables/Mist.styl
@@ -0,0 +1,13 @@
+// Variables of Mist scheme
+// =================================================
+
+$font-size-headings-base = 26px
+
+$brand-color = $black-deep
+$brand-hover-color = $brand-color
+
+$site-meta-text-align = left
+$posts-collapse-left = 0
+
+$btn-default-color = $link-color
+$btn-default-bg = transparent
diff --git a/source/css/_variables/Muse.styl b/source/css/_variables/Muse.styl
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/source/css/_variables/Pisces.styl b/source/css/_variables/Pisces.styl
new file mode 100644
index 0000000000..320aeb1d84
--- /dev/null
+++ b/source/css/_variables/Pisces.styl
@@ -0,0 +1,77 @@
+// Variables of Pisces scheme
+// =================================================
+
+// Settings for some of the most global styles.
+// --------------------------------------------------
+$body-bg-color = #f5f7f9
+
+
+// Borders
+// --------------------------------------------------
+$box-shadow-inner = initial;
+$box-shadow = initial;
+
+$border-radius-inner = initial;
+$border-radius = initial;
+
+
+// Header
+// --------------------------------------------------
+$subtitle-color = $gray-lighter
+
+// Sidebar
+// --------------------------------------------------
+$sidebar-offset = unit(hexo-config('sidebar.offset'), px) if hexo-config('sidebar.offset') is a 'unit'
+
+$sidebar-nav-hover-color = $orange
+$sidebar-highlight = $orange
+
+$site-author-image-width = 120px
+$site-author-image-border-width = 1px
+$site-author-image-border-color = $gainsboro
+
+$site-author-name-margin = 0
+$site-author-name-color = $black-deep
+$site-author-name-align = center
+$site-author-name-weight = $font-weight-bold
+
+$site-description-font-size = 13px
+$site-description-color = $grey-dark
+$site-description-margin-top = 0
+$site-description-align = center
+
+$site-state-item-count-font-size = 16px
+$site-state-item-name-font-size = 13px
+$site-state-item-name-color = $grey-dark
+$site-state-item-border-color = $gainsboro
+
+$toc-link-color = $grey-dim
+$toc-link-border-color = $grey-light
+$toc-link-hover-color = black
+$toc-link-hover-border-color = black
+$toc-link-active-color = $sidebar-highlight
+$toc-link-active-border-color = $sidebar-highlight
+$toc-link-active-current-color = $sidebar-highlight
+$toc-link-active-current-border-color = $sidebar-highlight
+
+
+// Components
+// --------------------------------------------------
+
+// Button
+$btn-default-radius = 2px
+$btn-default-bg = white
+$btn-default-color = $text-color
+$btn-default-border-color = $text-color
+$btn-default-hover-color = white
+$btn-default-hover-bg = $black-deep
+
+// Full Image Tag
+$full-image-width = 118%
+$full-image-margin-horizontal = -9%
+$full-image-margin-vertical = 0
+
+// Back to top
+$b2t-opacity = .6
+$b2t-position-bottom = -100px
+$b2t-position-bottom-on = 30px
diff --git a/source/css/_variables/base.styl b/source/css/_variables/base.styl
new file mode 100644
index 0000000000..fcd7830358
--- /dev/null
+++ b/source/css/_variables/base.styl
@@ -0,0 +1,416 @@
+//
+// Variables
+// =================================================
+
+
+
+// Colors
+// colors for use across theme.
+// --------------------------------------------------
+
+$whitesmoke = #f5f5f5
+$gainsboro = #eee
+$gray-lighter = #ddd
+$grey-light = #ccc
+$grey = #bbb
+$grey-dark = #999
+$grey-dim = #666
+$black-light = #555
+$black-dim = #333
+$black-deep = #222
+$red = #ff2a2a
+$blue-bright = #87daff
+$blue = #0684bd
+$blue-deep = #262a30
+$orange = #fc6423
+
+
+
+// Scaffolding
+// Settings for some of the most global styles.
+// --------------------------------------------------
+
+// Global text color on
+$text-color = $black-light
+
+// Global link color.
+$link-color = $black-light
+$link-hover-color = $black-deep
+$link-decoration-color = $grey-light
+$link-decoration-hover-color = $black-deep
+
+// Global border color.
+$border-color = $grey-light
+
+// Background color for
+$body-bg-color = white
+
+// Selection
+$selection-bg = $blue-deep
+$selection-color = white
+
+
+
+// Typography
+// Font, line-height, and elements colors.
+// --------------------------------------------------
+
+
+get_font_family(config) {
+ custom_family = hexo-config('font.' + config + '.family')
+ return custom_family is a 'string' ? custom_family : null
+}
+
+// Font families.
+$font-family-chinese = "PingFang SC", "Microsoft YaHei"
+
+$font-family-base = $font-family-chinese, sans-serif
+$font-family-base = get_font_family('global'), $font-family-chinese, sans-serif if get_font_family('global')
+
+$font-family-logo = $font-family-base
+$font-family-logo = get_font_family('logo'), $font-family-base if get_font_family('logo')
+
+$font-family-headings = $font-family-base
+$font-family-headings = get_font_family('headings'), $font-family-base if get_font_family('headings')
+
+$font-family-posts = $font-family-base
+$font-family-posts = get_font_family('posts'), $font-family-base if get_font_family('posts')
+
+$font-family-monospace = consolas, Menlo, $font-family-chinese, monospace
+$font-family-monospace = get_font_family('codes'), consolas, Menlo, $font-family-chinese, monospace if get_font_family('codes')
+
+$font-family-icons = 'FontAwesome'
+
+
+// Font Weight
+$font-weight-lighter = 200
+$font-weight-light = 300
+$font-weight-normal = 400
+$font-weight-bold = 600
+$font-weight-bolder = 700
+
+
+// Font size
+$font-size-base = 14px
+$font-size-base = unit(hexo-config('font.global.size'), px) if hexo-config('font.global.size') is a 'unit'
+$font-size-small = $font-size-base - 2px
+$font-size-smaller = $font-size-base - 4px
+$font-size-large = $font-size-base + 2px
+$font-size-larger = $font-size-base + 4px
+
+
+// Headings font size
+$font-size-headings-step = 2px
+$font-size-headings-base = 24px
+$font-size-headings-base = unit(hexo-config('font.headings.size'), px) if hexo-config('font.headings.size') is a 'unit'
+$font-size-headings-small = $font-size-headings-base - $font-size-headings-step
+$font-size-headings-smaller = $font-size-headings-small - $font-size-headings-step
+$font-size-headings-large = $font-size-headings-base + $font-size-headings-step
+$font-size-headings-larger = $font-size-headings-large + $font-size-headings-step
+
+// Global line height
+$line-height-base = 2
+$line-height-code-block = 1.6 // Can't be less than 1.3
+
+
+
+// Z-index master list
+// --------------------------------------------------
+$zindex-bottom = -1
+$zindex-1 = 1010
+$zindex-2 = 1020
+$zindex-3 = 1030
+$zindex-4 = 1040
+$zindex-5 = 1050
+
+
+
+// Table
+// --------------------------------------------------
+$table-width = 100%
+$table-border-color = $gray-lighter
+$table-font-size = 14px
+$table-content-alignment = left
+$table-content-vertical = middle
+$table-th-font-weight = 700
+$table-cell-padding = 8px
+$table-cell-border-right-color = $gainsboro
+$table-cell-border-bottom-color = $gray-lighter
+$table-row-odd-bg-color = #f9f9f9
+$table-row-hover-bg-color = $whitesmoke
+
+
+
+// Code & Code Blocks
+// --------------------------------------------------
+$code-font-family = $font-family-monospace
+$code-font-size = 13px
+$code-font-size = unit(hexo-config('font.codes.size'), px) if hexo-config('font.codes.size') is a 'unit'
+$code-border-radius = 3px
+$code-foreground = $black-light
+$code-background = $gainsboro
+
+
+
+// Buttons
+// --------------------------------------------------
+
+$btn-font-weight = normal
+
+$btn-default-radius = 0
+$btn-default-bg = $black-deep
+$btn-default-color = white
+$btn-default-font-size = 14px
+$btn-default-border-width = 2px
+$btn-default-border-color = $black-deep
+$btn-default-hover-bg = white
+$btn-default-hover-color = $black-deep
+$btn-default-hover-border-color = $black-deep
+
+
+
+// Pagination
+// --------------------------------------------------
+
+$pagination-border = $gainsboro
+
+$pagination-link-bg = transparent
+$pagination-link-color = $link-color
+$pagination-link-border = $gainsboro
+
+$pagination-link-hover-bg = transparent
+$pagination-link-hover-color = $link-color
+$pagination-link-hover-border = $black-deep
+
+$pagination-active-bg = $grey-light
+$pagination-active-color = white
+$pagination-active-border = $grey-light
+
+
+
+// Layout sizes
+// --------------------------------------------------
+
+$main-desktop = 960px
+$main-desktop-large = 1200px
+
+$content-desktop = 700px
+$content-desktop-large = 900px
+
+$content-desktop-padding = 40px
+$content-tablet-padding = 10px
+$content-mobile-padding = 8px
+
+$sidebar-desktop = 240px
+
+$footer-height = 50px
+
+$gap-between-main-and-footer = 100px
+
+
+
+// Headband
+// --------------------------------------------------
+$headband-height = 3px
+$headband-bg = $black-deep
+
+
+
+// Section Header
+// Variables for header section elements.
+// --------------------------------------------------
+
+$head-bg = transparent
+
+// Site Meta
+$site-meta-text-align = center
+$brand-color = white
+$brand-hover-color = white
+$brand-bg = $black-deep
+
+$logo-font-size = 20px
+$logo-font-size = unit(hexo-config('font.logo.size'), px) if hexo-config('font.logo.size') is a 'unit'
+
+$site-subtitle-color = $grey-dark
+$subtitle-font-size = 13px
+$subtitle-color = $grey-dark
+
+// Menu
+$menu-link-border = transparent
+$menu-link-hover-border = $black-deep
+
+
+
+// Posts Expand
+// --------------------------------------------------
+$posts-expand-title-font-weight = $font-weight-normal
+$post-copyright = {
+ margin: 2em 0 0,
+ padding: .5em 1em,
+ bg: #f9f9f9,
+ border: {
+ width: 3px,
+ style: solid,
+ color: #ff1700
+ }
+}
+
+
+// Posts Collpase
+// --------------------------------------------------
+$posts-collapse-left = 55px
+$posts-collapse-left-mobile = 5px
+
+
+// Sidebar
+// Variables for sidebar section elements.
+// --------------------------------------------------
+$sidebar-nav-color = $black-light
+$sidebar-nav-hover-color = $whitesmoke
+$sidebar-highlight = $blue-bright
+
+$site-author-image-padding = 2px
+$site-author-image-width = 96px
+$site-author-image-height = auto
+$site-author-image-border-width = 2px
+$site-author-image-border-color = $black-dim
+
+$site-author-name-margin = 5px 0 0
+$site-author-name-color = $whitesmoke
+$site-author-name-align = center
+$site-author-name-weight = normal
+
+$site-description-font-size = 14px
+$site-description-color = $grey-dark
+$site-description-margin-top = 5px
+$site-description-align = center
+
+$site-state-align = center
+$site-state-item-count-font-size = 18px
+$site-state-item-count-color = inherit
+$site-state-item-name-font-size = 13px
+$site-state-item-name-color = inherit
+$site-state-item-border-color = $black-dim
+
+$toc-link-color = $grey-dark
+$toc-link-border-color = $black-light
+$toc-link-hover-color = $grey-light
+$toc-link-hover-border-color = $grey-light
+$toc-link-active-color = $sidebar-highlight
+$toc-link-active-border-color = $sidebar-highlight
+$toc-link-active-current-color = $sidebar-highlight
+$toc-link-active-current-border-color = $sidebar-highlight
+
+
+// Components
+// --------------------------------------------------
+
+// Back to top
+$b2t-opacity = 1
+$b2t-position-bottom = -100px
+$b2t-position-bottom-on = 19px
+$b2t-position-right = 30px
+$b2t-font-size = 12px
+$b2t-color = white
+$b2t-bg-color = $black-deep
+
+// full-image
+$full-image-width = 110%
+$full-image-margin-horizontal = -5%
+$full-image-margin-vertical = 25px
+
+// .post-expand .post-eof
+// In Muse scheme, margin above and below the post separator
+$post-eof-margin-top = 80px // or 160px for more white space
+$post-eof-margin-bottom = 60px // or 120px for less white space
+
+
+// Iconography
+// Icons SVG Base64
+// --------------------------------------------------
+
+// blockquote-center icon
+$center-quote-left = '../images/quote-l.svg'
+$center-quote-right = '../images/quote-r.svg'
+
+
+// Note colors
+// --------------------------------------------------
+// Read note light_bg_offset from NexT config and set in "lbg%" to use it as string variable.
+hexo-config('note.light_bg_offset') is a 'unit' ? (lbg = unit(hexo-config('note.light_bg_offset'),"%")) : (lbg = 0)
+
+// Default
+$note-default-border = #777
+$note-default-bg = lighten(spin($note-default-border, 0), 94% + lbg)
+$note-default-text = $note-default-border
+$note-default-icon = "\f0a9"
+
+$note-modern-default-border = #e1e1e1
+$note-modern-default-bg = lighten(spin($note-modern-default-border, 10), 60% + (lbg * 4))
+$note-modern-default-text = $grey-dim
+$note-modern-default-hover = darken(spin($note-modern-default-text, -10), 32%)
+
+// Primary
+$note-primary-border = #6f42c1
+$note-primary-bg = lighten(spin($note-primary-border, 10), 92% + lbg)
+$note-primary-text = $note-primary-border
+$note-primary-icon = "\f055"
+
+$note-modern-primary-border = #e1c2ff
+$note-modern-primary-bg = lighten(spin($note-modern-primary-border, 10), 40% + (lbg * 4))
+$note-modern-primary-text = #6f42c1
+$note-modern-primary-hover = darken(spin($note-modern-primary-text, -10), 22%)
+
+// Info
+$note-info-border = #428bca
+$note-info-bg = lighten(spin($note-info-border, -10), 91% + lbg)
+$note-info-text = $note-info-border
+$note-info-icon = "\f05a"
+
+$note-modern-info-border = #b3e5ef
+$note-modern-info-bg = lighten(spin($note-modern-info-border, 10), 50% + (lbg * 4))
+$note-modern-info-text = #31708f
+$note-modern-info-hover = darken(spin($note-modern-info-text, -10), 32%)
+
+// Success
+$note-success-border = #5cb85c
+$note-success-bg = lighten(spin($note-success-border, 10), 90% + lbg)
+$note-success-text = $note-success-border
+$note-success-icon = "\f058"
+
+$note-modern-success-border = #d0e6be
+$note-modern-success-bg = lighten(spin($note-modern-success-border, 10), 40% + (lbg * 4))
+$note-modern-success-text = #3c763d
+$note-modern-success-hover = darken(spin($note-modern-success-text, -10), 27%)
+
+// Warning
+$note-warning-border = #f0ad4e
+$note-warning-bg = lighten(spin($note-warning-border, 10), 88% + lbg)
+$note-warning-text = $note-warning-border
+$note-warning-icon = "\f06a"
+
+$note-modern-warning-border = #fae4cd
+$note-modern-warning-bg = lighten(spin($note-modern-warning-border, 10), 43% + (lbg * 4))
+$note-modern-warning-text = #8a6d3b
+$note-modern-warning-hover = darken(spin($note-modern-warning-text, -10), 18%)
+
+// Danger
+$note-danger-border = #d9534f
+$note-danger-bg = lighten(spin($note-danger-border, -10), 92% + lbg)
+$note-danger-text = $note-danger-border
+$note-danger-icon = "\f056"
+
+$note-modern-danger-border = #ebcdd2
+$note-modern-danger-bg = lighten(spin($note-modern-danger-border, 10), 35% + (lbg * 4))
+$note-modern-danger-text = #a94442
+$note-modern-danger-hover = darken(spin($note-modern-danger-text, -10), 22%)
+
+
+// Label colors
+// --------------------------------------------------
+$label-default = lighten(spin($note-default-border, 0), 89% + lbg)
+$label-primary = lighten(spin($note-primary-border, 10), 87% + lbg)
+$label-info = lighten(spin($note-info-border, -10), 86% + lbg)
+$label-success = lighten(spin($note-success-border, 10), 85% + lbg)
+$label-warning = lighten(spin($note-warning-border, 10), 83% + lbg)
+$label-danger = lighten(spin($note-danger-border, -10), 87% + lbg)
diff --git a/source/css/_variables/custom.styl b/source/css/_variables/custom.styl
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/source/css/main.styl b/source/css/main.styl
new file mode 100644
index 0000000000..d46298de62
--- /dev/null
+++ b/source/css/main.styl
@@ -0,0 +1,45 @@
+// CSS Style Guide: http://codeguide.co/#css
+
+
+
+$scheme = hexo-config('scheme') ? hexo-config('scheme') : 'Muse';
+$variables = base $scheme custom;
+$mixins = base $scheme custom;
+
+
+
+// Variables Layer
+// --------------------------------------------------
+for $variable in $variables
+ @import "_variables/" + $variable
+
+
+// Mixins Layer
+// --------------------------------------------------
+for $mixin in $mixins
+ @import "_mixins/" + $mixin;
+
+
+
+// Common Layer
+// --------------------------------------------------
+
+// Scaffolding
+@import "_common/scaffolding";
+
+// Layout
+@import "_common/outline";
+
+// Components
+@import "_common/components";
+
+
+// Schemes Layer
+// --------------------------------------------------
+@import "_schemes/" + $scheme;
+
+
+
+// Custom Layer
+// --------------------------------------------------
+@import "_custom/custom";
diff --git a/source/fonts/.gitkeep b/source/fonts/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/source/images/algolia_logo.svg b/source/images/algolia_logo.svg
new file mode 100644
index 0000000000..470242341d
--- /dev/null
+++ b/source/images/algolia_logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/source/images/apple-touch-icon-next.png b/source/images/apple-touch-icon-next.png
new file mode 100644
index 0000000000..86a0d1d33b
Binary files /dev/null and b/source/images/apple-touch-icon-next.png differ
diff --git a/source/images/avatar.gif b/source/images/avatar.gif
new file mode 100644
index 0000000000..9899025743
Binary files /dev/null and b/source/images/avatar.gif differ
diff --git a/source/images/cc-by-nc-nd.svg b/source/images/cc-by-nc-nd.svg
new file mode 100644
index 0000000000..79a4f2e0d1
--- /dev/null
+++ b/source/images/cc-by-nc-nd.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/source/images/cc-by-nc-sa.svg b/source/images/cc-by-nc-sa.svg
new file mode 100644
index 0000000000..bf6bc26f54
--- /dev/null
+++ b/source/images/cc-by-nc-sa.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/source/images/cc-by-nc.svg b/source/images/cc-by-nc.svg
new file mode 100644
index 0000000000..36973490ad
--- /dev/null
+++ b/source/images/cc-by-nc.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/source/images/cc-by-nd.svg b/source/images/cc-by-nd.svg
new file mode 100644
index 0000000000..934c61e15e
--- /dev/null
+++ b/source/images/cc-by-nd.svg
@@ -0,0 +1,117 @@
+
+
+
diff --git a/source/images/cc-by-sa.svg b/source/images/cc-by-sa.svg
new file mode 100644
index 0000000000..463276a8cf
--- /dev/null
+++ b/source/images/cc-by-sa.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/source/images/cc-by.svg b/source/images/cc-by.svg
new file mode 100644
index 0000000000..4bccd14f6d
--- /dev/null
+++ b/source/images/cc-by.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/source/images/cc-zero.svg b/source/images/cc-zero.svg
new file mode 100644
index 0000000000..0f866392f1
--- /dev/null
+++ b/source/images/cc-zero.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/source/images/favicon-16x16-next.png b/source/images/favicon-16x16-next.png
new file mode 100644
index 0000000000..de8c5d3a5f
Binary files /dev/null and b/source/images/favicon-16x16-next.png differ
diff --git a/source/images/favicon-32x32-next.png b/source/images/favicon-32x32-next.png
new file mode 100644
index 0000000000..e02f5f4d5c
Binary files /dev/null and b/source/images/favicon-32x32-next.png differ
diff --git a/source/images/loading.gif b/source/images/loading.gif
new file mode 100644
index 0000000000..efb6768db9
Binary files /dev/null and b/source/images/loading.gif differ
diff --git a/source/images/logo.svg b/source/images/logo.svg
new file mode 100644
index 0000000000..cbb3937ecd
--- /dev/null
+++ b/source/images/logo.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/source/images/placeholder.gif b/source/images/placeholder.gif
new file mode 100644
index 0000000000..efb6768db9
Binary files /dev/null and b/source/images/placeholder.gif differ
diff --git a/source/images/quote-l.svg b/source/images/quote-l.svg
new file mode 100644
index 0000000000..6dd94a4a05
--- /dev/null
+++ b/source/images/quote-l.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/source/images/quote-r.svg b/source/images/quote-r.svg
new file mode 100644
index 0000000000..312b64d71d
--- /dev/null
+++ b/source/images/quote-r.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/source/images/searchicon.png b/source/images/searchicon.png
new file mode 100644
index 0000000000..14a16cad3e
Binary files /dev/null and b/source/images/searchicon.png differ
diff --git a/source/js/src/affix.js b/source/js/src/affix.js
new file mode 100644
index 0000000000..11a3d39a0d
--- /dev/null
+++ b/source/js/src/affix.js
@@ -0,0 +1,162 @@
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.5
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+
+ this.$target = $(this.options.target)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+
+ this.$element = $(element)
+ this.affixed = null
+ this.unpin = null
+ this.pinnedOffset = null
+
+ this.checkPosition()
+ }
+
+ Affix.VERSION = '3.3.5'
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0,
+ target: window
+ }
+
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ var targetHeight = this.$target.height()
+
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+ if (this.affixed == 'bottom') {
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+ }
+
+ var initializing = this.affixed == null
+ var colliderTop = initializing ? scrollTop : position.top
+ var colliderHeight = initializing ? targetHeight : height
+
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+ return false
+ }
+
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var height = this.$element.height()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+ var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+ if (this.affixed != affix) {
+ if (this.unpin != null) this.$element.css('top', '')
+
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+ }
+
+ if (affix == 'bottom') {
+ this.$element.offset({
+ top: scrollHeight - height - offsetBottom
+ })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.affix
+
+ $.fn.affix = Plugin
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
+
+ Plugin.call($spy, data)
+ })
+ })
+
+}(jQuery);
diff --git a/source/js/src/algolia-search.js b/source/js/src/algolia-search.js
new file mode 100644
index 0000000000..9787e2ac36
--- /dev/null
+++ b/source/js/src/algolia-search.js
@@ -0,0 +1,115 @@
+/* global instantsearch: true */
+/*jshint camelcase: false */
+
+$(document).ready(function () {
+ var algoliaSettings = CONFIG.algolia;
+ var isAlgoliaSettingsValid = algoliaSettings.applicationID &&
+ algoliaSettings.apiKey &&
+ algoliaSettings.indexName;
+
+ if (!isAlgoliaSettingsValid) {
+ window.console.error('Algolia Settings are invalid.');
+ return;
+ }
+
+ var search = instantsearch({
+ appId: algoliaSettings.applicationID,
+ apiKey: algoliaSettings.apiKey,
+ indexName: algoliaSettings.indexName,
+ searchFunction: function (helper) {
+ var searchInput = $('#algolia-search-input').find('input');
+
+ if (searchInput.val()) {
+ helper.search();
+ }
+ }
+ });
+
+ // Registering Widgets
+ [
+ instantsearch.widgets.searchBox({
+ container: '#algolia-search-input',
+ placeholder: algoliaSettings.labels.input_placeholder
+ }),
+
+ instantsearch.widgets.hits({
+ container: '#algolia-hits',
+ hitsPerPage: algoliaSettings.hits.per_page || 10,
+ templates: {
+ item: function (data) {
+ var link = data.permalink ? data.permalink : (CONFIG.root + data.path);
+ return (
+ '' +
+ data._highlightResult.title.value +
+ ''
+ );
+ },
+ empty: function (data) {
+ return (
+ '' +
+ algoliaSettings.labels.hits_empty.replace(/\$\{query}/, data.query) +
+ ''
+ );
+ }
+ },
+ cssClasses: {
+ item: 'algolia-hit-item'
+ }
+ }),
+
+ instantsearch.widgets.stats({
+ container: '#algolia-stats',
+ templates: {
+ body: function (data) {
+ var stats = algoliaSettings.labels.hits_stats
+ .replace(/\$\{hits}/, data.nbHits)
+ .replace(/\$\{time}/, data.processingTimeMS);
+ return (
+ stats +
+ '' +
+ ' ' +
+ '' +
+ '
'
+ );
+ }
+ }
+ }),
+
+ instantsearch.widgets.pagination({
+ container: '#algolia-pagination',
+ scrollTo: false,
+ showFirstLast: false,
+ labels: {
+ first: '',
+ last: '',
+ previous: '',
+ next: ''
+ },
+ cssClasses: {
+ root: 'pagination',
+ item: 'pagination-item',
+ link: 'page-number',
+ active: 'current',
+ disabled: 'disabled-item'
+ }
+ })
+ ].forEach(search.addWidget, search);
+
+ search.start();
+
+ $('.popup-trigger').on('click', function(e) {
+ e.stopPropagation();
+ $('body')
+ .append('')
+ .css('overflow', 'hidden');
+ $('.popup').toggle();
+ $('#algolia-search-input').find('input').focus();
+ });
+
+ $('.popup-btn-close').click(function(){
+ $('.popup').hide();
+ $('.algolia-pop-overlay').remove();
+ $('body').css('overflow', '');
+ });
+
+});
diff --git a/source/js/src/bootstrap.js b/source/js/src/bootstrap.js
new file mode 100644
index 0000000000..b8767b32ce
--- /dev/null
+++ b/source/js/src/bootstrap.js
@@ -0,0 +1,55 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+
+ $(document).trigger('bootstrap:before');
+
+ /**
+ * Register JS handlers by condition option.
+ * Need to add config option in Front-End at 'layout/_partials/head.swig' file.
+ */
+ CONFIG.fastclick && NexT.utils.isMobile() && window.FastClick.attach(document.body);
+ CONFIG.lazyload && NexT.utils.lazyLoadPostsImages();
+
+ NexT.utils.registerESCKeyEvent();
+
+ NexT.utils.registerBackToTop();
+
+ // Mobile top menu bar.
+ $('.site-nav-toggle button').on('click', function () {
+ var $siteNav = $('.site-nav');
+ var ON_CLASS_NAME = 'site-nav-on';
+ var isSiteNavOn = $siteNav.hasClass(ON_CLASS_NAME);
+ var animateAction = isSiteNavOn ? 'slideUp' : 'slideDown';
+ var animateCallback = isSiteNavOn ? 'removeClass' : 'addClass';
+
+ $siteNav.stop()[animateAction]('fast', function () {
+ $siteNav[animateCallback](ON_CLASS_NAME);
+ });
+ });
+
+ /**
+ * Register JS handlers by condition option.
+ * Need to add config option in Front-End at 'layout/_partials/head.swig' file.
+ */
+ CONFIG.fancybox && NexT.utils.wrapImageWithFancyBox();
+ CONFIG.tabs && NexT.utils.registerTabsTag();
+
+ NexT.utils.embeddedVideoTransformer();
+ NexT.utils.addActiveClassToMenuItem();
+
+
+ // Define Motion Sequence.
+ NexT.motion.integrator
+ .add(NexT.motion.middleWares.logo)
+ .add(NexT.motion.middleWares.menu)
+ .add(NexT.motion.middleWares.postList)
+ .add(NexT.motion.middleWares.sidebar);
+
+ $(document).trigger('motion:before');
+
+ // Bootstrap Motion.
+ CONFIG.motion.enable && NexT.motion.integrator.bootstrap();
+
+ $(document).trigger('bootstrap:after');
+});
diff --git a/source/js/src/exturl.js b/source/js/src/exturl.js
new file mode 100644
index 0000000000..b85062ad4d
--- /dev/null
+++ b/source/js/src/exturl.js
@@ -0,0 +1,15 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+
+ // Create Base64 Object
+ var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};
+
+ $('.exturl').on('click', function () {
+ var $exturl = $(this).attr('data-url');
+ var $decurl = Base64.decode($exturl);
+ window.open($decurl, '_blank');
+ return false;
+ });
+
+});
diff --git a/source/js/src/hook-duoshuo.js b/source/js/src/hook-duoshuo.js
new file mode 100644
index 0000000000..ca64dbd048
--- /dev/null
+++ b/source/js/src/hook-duoshuo.js
@@ -0,0 +1,115 @@
+/* global DUOSHUO: true */
+/* jshint camelcase: false */
+
+typeof DUOSHUO !== 'undefined' ?
+ hookTemplate() :
+ ($('#duoshuo-script')[0].onload = hookTemplate);
+
+
+function hookTemplate() {
+ var post = DUOSHUO.templates.post;
+
+ DUOSHUO.templates.post = function (e, t) {
+ var rs = post(e, t);
+ var agent = e.post.agent;
+ var userId = e.post.author.user_id;
+ var admin = '';
+
+ if (userId && (userId == CONFIG.duoshuo.userId)) {
+ admin = '' + CONFIG.duoshuo.author + '';
+ }
+
+ if (agent && /^Mozilla/.test(agent)) {
+ rs = rs.replace(/<\/div>/, admin + getAgentInfo(agent) + '
');
+ }
+
+ return rs;
+ };
+}
+
+function getAgentInfo(string) {
+ $.ua.set(string);
+
+ var UNKNOWN = 'Unknown';
+ var sua = $.ua;
+ var separator = isMobile() ? '
' : '';
+ var osName = sua.os.name || UNKNOWN;
+ var osVersion = sua.os.version || UNKNOWN;
+ var browserName = sua.browser.name || UNKNOWN;
+ var browserVersion = sua.browser.version || UNKNOWN;
+ var iconMapping = {
+ os: {
+ android : 'android',
+ linux : 'linux',
+ windows : 'windows',
+ ios : 'apple',
+ 'mac os': 'apple',
+ unknown : 'desktop'
+ },
+ browser: {
+ chrome : 'chrome',
+ chromium : 'chrome',
+ firefox : 'firefox',
+ opera : 'opera',
+ safari : 'safari',
+ ie : 'internet-explorer',
+ wechat : 'wechat',
+ qq : 'qq',
+ unknown : 'globe'
+ }
+ };
+ var osIcon = iconMapping.os[osName.toLowerCase()];
+ var browserIcon = iconMapping.browser[getBrowserKey()];
+
+ return separator +
+ '' +
+ '' +
+ osName + ' ' + osVersion +
+ '' + separator +
+ '' +
+ '' +
+ browserName + ' ' + browserVersion +
+ '';
+
+ function getBrowserKey () {
+ var key = browserName.toLowerCase();
+
+ if (key.match(/WeChat/i)) {
+ return 'wechat';
+ }
+
+ if (key.match(/QQBrowser/i)) {
+ return 'qq';
+ }
+
+ return key;
+ }
+
+ function isMobile() {
+ var userAgent = window.navigator.userAgent;
+
+ var isiPad = userAgent.match(/iPad/i) !== null;
+ var mobileUA = [
+ 'iphone', 'android', 'phone', 'mobile',
+ 'wap', 'netfront', 'x11', 'java', 'opera mobi',
+ 'opera mini', 'ucweb', 'windows ce', 'symbian',
+ 'symbianos', 'series', 'webos', 'sony',
+ 'blackberry', 'dopod', 'nokia', 'samsung',
+ 'palmsource', 'xda', 'pieplus', 'meizu',
+ 'midp' ,'cldc' , 'motorola', 'foma',
+ 'docomo', 'up.browser', 'up.link', 'blazer',
+ 'helio', 'hosin', 'huawei', 'novarra',
+ 'coolpad', 'webos', 'techfaith', 'palmsource',
+ 'alcatel', 'amoi', 'ktouch', 'nexian',
+ 'ericsson', 'philips', 'sagem', 'wellcom',
+ 'bunjalloo', 'maui', 'smartphone', 'iemobile',
+ 'spice', 'bird', 'zte-', 'longcos',
+ 'pantech', 'gionee', 'portalmmm', 'jig browser',
+ 'hiptop', 'benq', 'haier', '^lct',
+ '320x320', '240x320', '176x220'
+ ];
+ var pattern = new RegExp(mobileUA.join('|'), 'i');
+
+ return !isiPad && userAgent.match(pattern);
+ }
+}
diff --git a/source/js/src/js.cookie.js b/source/js/src/js.cookie.js
new file mode 100644
index 0000000000..c6c3975831
--- /dev/null
+++ b/source/js/src/js.cookie.js
@@ -0,0 +1,165 @@
+/*!
+ * JavaScript Cookie v2.1.4
+ * https://github.com/js-cookie/js-cookie
+ *
+ * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
+ * Released under the MIT license
+ */
+;(function (factory) {
+ var registeredInModuleLoader = false;
+ if (typeof define === 'function' && define.amd) {
+ define(factory);
+ registeredInModuleLoader = true;
+ }
+ if (typeof exports === 'object') {
+ module.exports = factory();
+ registeredInModuleLoader = true;
+ }
+ if (!registeredInModuleLoader) {
+ var OldCookies = window.Cookies;
+ var api = window.Cookies = factory();
+ api.noConflict = function () {
+ window.Cookies = OldCookies;
+ return api;
+ };
+ }
+}(function () {
+ function extend () {
+ var i = 0;
+ var result = {};
+ for (; i < arguments.length; i++) {
+ var attributes = arguments[ i ];
+ for (var key in attributes) {
+ result[key] = attributes[key];
+ }
+ }
+ return result;
+ }
+
+ function init (converter) {
+ function api (key, value, attributes) {
+ var result;
+ if (typeof document === 'undefined') {
+ return;
+ }
+
+ // Write
+
+ if (arguments.length > 1) {
+ attributes = extend({
+ path: '/'
+ }, api.defaults, attributes);
+
+ if (typeof attributes.expires === 'number') {
+ var expires = new Date();
+ expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
+ attributes.expires = expires;
+ }
+
+ // We're using "expires" because "max-age" is not supported by IE
+ attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';
+
+ try {
+ result = JSON.stringify(value);
+ if (/^[\{\[]/.test(result)) {
+ value = result;
+ }
+ } catch (e) {}
+
+ if (!converter.write) {
+ value = encodeURIComponent(String(value))
+ .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
+ } else {
+ value = converter.write(value, key);
+ }
+
+ key = encodeURIComponent(String(key));
+ key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
+ key = key.replace(/[\(\)]/g, escape);
+
+ var stringifiedAttributes = '';
+
+ for (var attributeName in attributes) {
+ if (!attributes[attributeName]) {
+ continue;
+ }
+ stringifiedAttributes += '; ' + attributeName;
+ if (attributes[attributeName] === true) {
+ continue;
+ }
+ stringifiedAttributes += '=' + attributes[attributeName];
+ }
+ return (document.cookie = key + '=' + value + stringifiedAttributes);
+ }
+
+ // Read
+
+ if (!key) {
+ result = {};
+ }
+
+ // To prevent the for loop in the first place assign an empty array
+ // in case there are no cookies at all. Also prevents odd result when
+ // calling "get()"
+ var cookies = document.cookie ? document.cookie.split('; ') : [];
+ var rdecode = /(%[0-9A-Z]{2})+/g;
+ var i = 0;
+
+ for (; i < cookies.length; i++) {
+ var parts = cookies[i].split('=');
+ var cookie = parts.slice(1).join('=');
+
+ if (cookie.charAt(0) === '"') {
+ cookie = cookie.slice(1, -1);
+ }
+
+ try {
+ var name = parts[0].replace(rdecode, decodeURIComponent);
+ cookie = converter.read ?
+ converter.read(cookie, name) : converter(cookie, name) ||
+ cookie.replace(rdecode, decodeURIComponent);
+
+ if (this.json) {
+ try {
+ cookie = JSON.parse(cookie);
+ } catch (e) {}
+ }
+
+ if (key === name) {
+ result = cookie;
+ break;
+ }
+
+ if (!key) {
+ result[name] = cookie;
+ }
+ } catch (e) {}
+ }
+
+ return result;
+ }
+
+ api.set = api;
+ api.get = function (key) {
+ return api.call(api, key);
+ };
+ api.getJSON = function () {
+ return api.apply({
+ json: true
+ }, [].slice.call(arguments));
+ };
+ api.defaults = {};
+
+ api.remove = function (key, attributes) {
+ api(key, '', extend(attributes, {
+ expires: -1
+ }));
+ };
+
+ api.withConverter = init;
+
+ return api;
+ }
+
+ return init(function () {});
+}));
diff --git a/source/js/src/motion.js b/source/js/src/motion.js
new file mode 100644
index 0000000000..112917917e
--- /dev/null
+++ b/source/js/src/motion.js
@@ -0,0 +1,352 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+ NexT.motion = {};
+
+ var sidebarToggleLines = {
+ lines: [],
+ push: function (line) {
+ this.lines.push(line);
+ },
+ init: function () {
+ this.lines.forEach(function (line) {
+ line.init();
+ });
+ },
+ arrow: function () {
+ this.lines.forEach(function (line) {
+ line.arrow();
+ });
+ },
+ close: function () {
+ this.lines.forEach(function (line) {
+ line.close();
+ });
+ }
+ };
+
+ function SidebarToggleLine(settings) {
+ this.el = $(settings.el);
+ this.status = $.extend({}, {
+ init: {
+ width: '100%',
+ opacity: 1,
+ left: 0,
+ rotateZ: 0,
+ top: 0
+ }
+ }, settings.status);
+ }
+
+ SidebarToggleLine.prototype.init = function () {
+ this.transform('init');
+ };
+ SidebarToggleLine.prototype.arrow = function () {
+ this.transform('arrow');
+ };
+ SidebarToggleLine.prototype.close = function () {
+ this.transform('close');
+ };
+ SidebarToggleLine.prototype.transform = function (status) {
+ this.el.velocity('stop').velocity(this.status[status]);
+ };
+
+ var sidebarToggleLine1st = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-first',
+ status: {
+ arrow: {width: '50%', rotateZ: '-45deg', top: '2px'},
+ close: {width: '100%', rotateZ: '-45deg', top: '5px'}
+ }
+ });
+ var sidebarToggleLine2nd = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-middle',
+ status: {
+ arrow: {width: '90%'},
+ close: {opacity: 0}
+ }
+ });
+ var sidebarToggleLine3rd = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-last',
+ status: {
+ arrow: {width: '50%', rotateZ: '45deg', top: '-2px'},
+ close: {width: '100%', rotateZ: '45deg', top: '-5px'}
+ }
+ });
+
+ sidebarToggleLines.push(sidebarToggleLine1st);
+ sidebarToggleLines.push(sidebarToggleLine2nd);
+ sidebarToggleLines.push(sidebarToggleLine3rd);
+
+ var SIDEBAR_WIDTH = '320px';
+ var SIDEBAR_DISPLAY_DURATION = 200;
+ var xPos, yPos;
+
+ var sidebarToggleMotion = {
+ toggleEl: $('.sidebar-toggle'),
+ dimmerEl: $('#sidebar-dimmer'),
+ sidebarEl: $('.sidebar'),
+ isSidebarVisible: false,
+ init: function () {
+ this.toggleEl.on('click', this.clickHandler.bind(this));
+ this.dimmerEl.on('click', this.clickHandler.bind(this));
+ this.toggleEl.on('mouseenter', this.mouseEnterHandler.bind(this));
+ this.toggleEl.on('mouseleave', this.mouseLeaveHandler.bind(this));
+ this.sidebarEl.on('touchstart', this.touchstartHandler.bind(this));
+ this.sidebarEl.on('touchend', this.touchendHandler.bind(this));
+ this.sidebarEl.on('touchmove', function(e){e.preventDefault();});
+
+ $(document)
+ .on('sidebar.isShowing', function () {
+ NexT.utils.isDesktop() && $('body').velocity('stop').velocity(
+ {paddingRight: SIDEBAR_WIDTH},
+ SIDEBAR_DISPLAY_DURATION
+ );
+ })
+ .on('sidebar.isHiding', function () {
+ });
+ },
+ clickHandler: function () {
+ this.isSidebarVisible ? this.hideSidebar() : this.showSidebar();
+ this.isSidebarVisible = !this.isSidebarVisible;
+ },
+ mouseEnterHandler: function () {
+ if (this.isSidebarVisible) {
+ return;
+ }
+ sidebarToggleLines.arrow();
+ },
+ mouseLeaveHandler: function () {
+ if (this.isSidebarVisible) {
+ return;
+ }
+ sidebarToggleLines.init();
+ },
+ touchstartHandler: function(e) {
+ xPos = e.originalEvent.touches[0].clientX;
+ yPos = e.originalEvent.touches[0].clientY;
+ },
+ touchendHandler: function(e) {
+ var _xPos = e.originalEvent.changedTouches[0].clientX;
+ var _yPos = e.originalEvent.changedTouches[0].clientY;
+ if (_xPos-xPos > 30 && Math.abs(_yPos-yPos) < 20) {
+ this.clickHandler();
+ }
+ },
+ showSidebar: function () {
+ var self = this;
+
+ sidebarToggleLines.close();
+
+ this.sidebarEl.velocity('stop').velocity({
+ width: SIDEBAR_WIDTH
+ }, {
+ display: 'block',
+ duration: SIDEBAR_DISPLAY_DURATION,
+ begin: function () {
+ $('.sidebar .motion-element').velocity(
+ 'transition.slideRightIn',
+ {
+ stagger: 50,
+ drag: true,
+ complete: function () {
+ self.sidebarEl.trigger('sidebar.motion.complete');
+ }
+ }
+ );
+ },
+ complete: function () {
+ self.sidebarEl.addClass('sidebar-active');
+ self.sidebarEl.trigger('sidebar.didShow');
+ }
+ }
+ );
+
+ this.sidebarEl.trigger('sidebar.isShowing');
+ },
+ hideSidebar: function () {
+ NexT.utils.isDesktop() && $('body').velocity('stop').velocity({paddingRight: 0});
+ this.sidebarEl.find('.motion-element').velocity('stop').css('display', 'none');
+ this.sidebarEl.velocity('stop').velocity({width: 0}, {display: 'none'});
+
+ sidebarToggleLines.init();
+
+ this.sidebarEl.removeClass('sidebar-active');
+ this.sidebarEl.trigger('sidebar.isHiding');
+
+ // Prevent adding TOC to Overview if Overview was selected when close & open sidebar.
+ if (!!$('.post-toc-wrap')) {
+ if ($('.site-overview-wrap').css('display') === 'block') {
+ $('.post-toc-wrap').removeClass('motion-element');
+ } else {
+ $('.post-toc-wrap').addClass('motion-element');
+ }
+ }
+ }
+ };
+ sidebarToggleMotion.init();
+
+ NexT.motion.integrator = {
+ queue: [],
+ cursor: -1,
+ add: function (fn) {
+ this.queue.push(fn);
+ return this;
+ },
+ next: function () {
+ this.cursor++;
+ var fn = this.queue[this.cursor];
+ $.isFunction(fn) && fn(NexT.motion.integrator);
+ },
+ bootstrap: function () {
+ this.next();
+ }
+ };
+
+ NexT.motion.middleWares = {
+ logo: function (integrator) {
+ var sequence = [];
+ var $brand = $('.brand');
+ var $title = $('.site-title');
+ var $subtitle = $('.site-subtitle');
+ var $logoLineTop = $('.logo-line-before i');
+ var $logoLineBottom = $('.logo-line-after i');
+
+ $brand.size() > 0 && sequence.push({
+ e: $brand,
+ p: {opacity: 1},
+ o: {duration: 200}
+ });
+
+ NexT.utils.isMist() && hasElement([$logoLineTop, $logoLineBottom]) &&
+ sequence.push(
+ getMistLineSettings($logoLineTop, '100%'),
+ getMistLineSettings($logoLineBottom, '-100%')
+ );
+
+ hasElement($title) && sequence.push({
+ e: $title,
+ p: {opacity: 1, top: 0},
+ o: { duration: 200 }
+ });
+
+ hasElement($subtitle) && sequence.push({
+ e: $subtitle,
+ p: {opacity: 1, top: 0},
+ o: {duration: 200}
+ });
+
+ if (CONFIG.motion.async) {
+ integrator.next();
+ }
+
+ if (sequence.length > 0) {
+ sequence[sequence.length - 1].o.complete = function () {
+ integrator.next();
+ };
+ $.Velocity.RunSequence(sequence);
+ } else {
+ integrator.next();
+ }
+
+
+ function getMistLineSettings (element, translateX) {
+ return {
+ e: $(element),
+ p: {translateX: translateX},
+ o: {
+ duration: 500,
+ sequenceQueue: false
+ }
+ };
+ }
+
+ /**
+ * Check if $elements exist.
+ * @param {jQuery|Array} $elements
+ * @returns {boolean}
+ */
+ function hasElement ($elements) {
+ $elements = Array.isArray($elements) ? $elements : [$elements];
+ return $elements.every(function ($element) {
+ return $.isFunction($element.size) && $element.size() > 0;
+ });
+ }
+ },
+
+ menu: function (integrator) {
+
+ if (CONFIG.motion.async) {
+ integrator.next();
+ }
+
+ $('.menu-item').velocity('transition.slideDownIn', {
+ display: null,
+ duration: 200,
+ complete: function () {
+ integrator.next();
+ }
+ });
+ },
+
+ postList: function (integrator) {
+ //var $post = $('.post');
+ var $postBlock = $('.post-block, .pagination, .comments');
+ var $postBlockTransition = CONFIG.motion.transition.post_block;
+ var $postHeader = $('.post-header');
+ var $postHeaderTransition = CONFIG.motion.transition.post_header;
+ var $postBody = $('.post-body');
+ var $postBodyTransition = CONFIG.motion.transition.post_body;
+ var $collHeader = $('.collection-title, .archive-year');
+ var $collHeaderTransition = CONFIG.motion.transition.coll_header;
+ var $sidebarAffix = $('.sidebar-inner');
+ var $sidebarAffixTransition = CONFIG.motion.transition.sidebar;
+ var hasPost = $postBlock.size() > 0;
+
+ hasPost ? postMotion() : integrator.next();
+
+ if (CONFIG.motion.async) {
+ integrator.next();
+ }
+
+ function postMotion () {
+ var postMotionOptions = window.postMotionOptions || {
+ stagger: 100,
+ drag: true
+ };
+ postMotionOptions.complete = function () {
+ // After motion complete need to remove transform from sidebar to let affix work on Pisces | Gemini.
+ if (CONFIG.motion.transition.sidebar && (NexT.utils.isPisces() || NexT.utils.isGemini())) {
+ $sidebarAffix.css({ 'transform': 'initial' });
+ }
+ integrator.next();
+ };
+
+ //$post.velocity('transition.slideDownIn', postMotionOptions);
+ if (CONFIG.motion.transition.post_block) {
+ $postBlock.velocity('transition.' + $postBlockTransition, postMotionOptions);
+ }
+ if (CONFIG.motion.transition.post_header) {
+ $postHeader.velocity('transition.' + $postHeaderTransition, postMotionOptions);
+ }
+ if (CONFIG.motion.transition.post_body) {
+ $postBody.velocity('transition.' + $postBodyTransition, postMotionOptions);
+ }
+ if (CONFIG.motion.transition.coll_header) {
+ $collHeader.velocity('transition.' + $collHeaderTransition, postMotionOptions);
+ }
+ // Only for Pisces | Gemini.
+ if (CONFIG.motion.transition.sidebar && (NexT.utils.isPisces() || NexT.utils.isGemini())) {
+ $sidebarAffix.velocity('transition.' + $sidebarAffixTransition, postMotionOptions);
+ }
+ }
+ },
+
+ sidebar: function (integrator) {
+ if (CONFIG.sidebar.display === 'always') {
+ NexT.utils.displaySidebar();
+ }
+ integrator.next();
+ }
+ };
+
+});
diff --git a/source/js/src/post-details.js b/source/js/src/post-details.js
new file mode 100644
index 0000000000..a82bcc2281
--- /dev/null
+++ b/source/js/src/post-details.js
@@ -0,0 +1,99 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+
+ initScrollSpy();
+
+ function initScrollSpy () {
+ var tocSelector = '.post-toc';
+ var $tocElement = $(tocSelector);
+ var activeCurrentSelector = '.active-current';
+
+ $tocElement
+ .on('activate.bs.scrollspy', function () {
+ var $currentActiveElement = $(tocSelector + ' .active').last();
+
+ removeCurrentActiveClass();
+ $currentActiveElement.addClass('active-current');
+
+ // Scrolling to center active TOC element if TOC content is taller then viewport.
+ $tocElement.scrollTop($currentActiveElement.offset().top - $tocElement.offset().top + $tocElement.scrollTop() - ($tocElement.height() / 2));
+ })
+ .on('clear.bs.scrollspy', removeCurrentActiveClass);
+
+ $('body').scrollspy({ target: tocSelector });
+
+ function removeCurrentActiveClass () {
+ $(tocSelector + ' ' + activeCurrentSelector)
+ .removeClass(activeCurrentSelector.substring(1));
+ }
+ }
+
+});
+
+$(document).ready(function () {
+ var html = $('html');
+ var TAB_ANIMATE_DURATION = 200;
+ var hasVelocity = $.isFunction(html.velocity);
+
+ $('.sidebar-nav li').on('click', function () {
+ var item = $(this);
+ var activeTabClassName = 'sidebar-nav-active';
+ var activePanelClassName = 'sidebar-panel-active';
+ if (item.hasClass(activeTabClassName)) {
+ return;
+ }
+
+ var currentTarget = $('.' + activePanelClassName);
+ var target = $('.' + item.data('target'));
+
+ hasVelocity ?
+ currentTarget.velocity('transition.slideUpOut', TAB_ANIMATE_DURATION, function () {
+ target
+ .velocity('stop')
+ .velocity('transition.slideDownIn', TAB_ANIMATE_DURATION)
+ .addClass(activePanelClassName);
+ }) :
+ currentTarget.animate({ opacity: 0 }, TAB_ANIMATE_DURATION, function () {
+ currentTarget.hide();
+ target
+ .stop()
+ .css({'opacity': 0, 'display': 'block'})
+ .animate({ opacity: 1 }, TAB_ANIMATE_DURATION, function () {
+ currentTarget.removeClass(activePanelClassName);
+ target.addClass(activePanelClassName);
+ });
+ });
+
+ item.siblings().removeClass(activeTabClassName);
+ item.addClass(activeTabClassName);
+ });
+
+ // TOC item animation navigate & prevent #item selector in adress bar.
+ $('.post-toc a').on('click', function (e) {
+ e.preventDefault();
+ var targetSelector = NexT.utils.escapeSelector(this.getAttribute('href'));
+ var offset = $(targetSelector).offset().top;
+
+ hasVelocity ?
+ html.velocity('stop').velocity('scroll', {
+ offset: offset + 'px',
+ mobileHA: false
+ }) :
+ $('html, body').stop().animate({
+ scrollTop: offset
+ }, 500);
+ });
+
+ // Expand sidebar on post detail page by default, when post has a toc.
+ var $tocContent = $('.post-toc-content');
+ var isSidebarCouldDisplay = CONFIG.sidebar.display === 'post' ||
+ CONFIG.sidebar.display === 'always';
+ var hasTOC = $tocContent.length > 0 && $tocContent.html().trim().length > 0;
+ if (isSidebarCouldDisplay && hasTOC) {
+ CONFIG.motion.enable ?
+ (NexT.motion.middleWares.sidebar = function () {
+ NexT.utils.displaySidebar();
+ }) : NexT.utils.displaySidebar();
+ }
+});
diff --git a/source/js/src/schemes/pisces.js b/source/js/src/schemes/pisces.js
new file mode 100644
index 0000000000..0e6e4267e1
--- /dev/null
+++ b/source/js/src/schemes/pisces.js
@@ -0,0 +1,57 @@
+$(document).ready(function () {
+
+ var sidebarInner = $('.sidebar-inner');
+
+ initAffix();
+ resizeListener();
+
+ function initAffix () {
+ var headerOffset = getHeaderOffset(),
+ footerOffset = getFooterOffset(),
+ sidebarHeight = $('#sidebar').height() + NexT.utils.getSidebarb2tHeight(),
+ contentHeight = $('#content').height();
+
+ // Not affix if sidebar taller then content (to prevent bottom jumping).
+ if (headerOffset + sidebarHeight < contentHeight) {
+ sidebarInner.affix({
+ offset: {
+ top: headerOffset - CONFIG.sidebar.offset,
+ bottom: footerOffset
+ }
+ });
+ }
+
+ setSidebarMarginTop(headerOffset).css({ 'margin-left': 'initial' });
+ }
+
+ function resizeListener () {
+ var mql = window.matchMedia('(min-width: 991px)');
+ mql.addListener(function(e){
+ if(e.matches){
+ recalculateAffixPosition();
+ }
+ });
+ }
+
+ function getHeaderOffset () {
+ return $('.header-inner').height() + CONFIG.sidebar.offset;
+ }
+
+ function getFooterOffset () {
+ var footerInner = $('.footer-inner'),
+ footerMargin = footerInner.outerHeight(true) - footerInner.outerHeight(),
+ footerOffset = footerInner.outerHeight(true) + footerMargin;
+ return footerOffset;
+ }
+
+ function setSidebarMarginTop (headerOffset) {
+ return $('#sidebar').css({ 'margin-top': headerOffset });
+ }
+
+ function recalculateAffixPosition () {
+ $(window).off('.affix');
+ sidebarInner.removeData('bs.affix').removeClass('affix affix-top affix-bottom');
+ initAffix();
+ }
+
+});
diff --git a/source/js/src/scroll-cookie.js b/source/js/src/scroll-cookie.js
new file mode 100644
index 0000000000..34ff200bdc
--- /dev/null
+++ b/source/js/src/scroll-cookie.js
@@ -0,0 +1,23 @@
+$(document).ready(function() {
+
+ // Set relative link path (without domain)
+ var rpath = window.location.href.replace(window.location.origin, "");
+
+ // Write position in cookie
+ var timeout;
+ $(window).on("scroll", function() {
+ clearTimeout(timeout);
+ timeout = setTimeout(function () {
+ Cookies.set("scroll-cookie", ($(window).scrollTop() + "|" + rpath), { expires: 365, path: '' });
+ }, 250);
+ });
+
+ // Read position from cookie
+ if (Cookies.get("scroll-cookie") !== undefined) {
+ var cvalues = Cookies.get("scroll-cookie").split('|');
+ if (cvalues[1] == rpath) {
+ $(window).scrollTop(cvalues[0]);
+ }
+ }
+
+});
diff --git a/source/js/src/scrollspy.js b/source/js/src/scrollspy.js
new file mode 100644
index 0000000000..f5c5c6cb8d
--- /dev/null
+++ b/source/js/src/scrollspy.js
@@ -0,0 +1,182 @@
+/* ========================================================================
+* Bootstrap: scrollspy.js v3.3.2
+* http://getbootstrap.com/javascript/#scrollspy
+* ========================================================================
+* Copyright 2011-2015 Twitter, Inc.
+* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+* ======================================================================== */
+
+/**
+ * Custom by iissnan
+ *
+ * - Add a `clear.bs.scrollspy` event.
+ * - Esacpe targets selector.
+ */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ this.$body = $(document.body)
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target || '') + ' .nav li > a'
+ this.offsets = []
+ this.targets = []
+ this.activeTarget = null
+ this.scrollHeight = 0
+
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.VERSION = '3.3.2'
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.getScrollHeight = function () {
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var that = this
+ var offsetMethod = 'offset'
+ var offsetBase = 0
+
+ this.offsets = []
+ this.targets = []
+ this.scrollHeight = this.getScrollHeight()
+
+ if (!$.isWindow(this.$scrollElement[0])) {
+ offsetMethod = 'position'
+ offsetBase = this.$scrollElement.scrollTop()
+ }
+
+ this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(NexT.utils.escapeSelector(href)) // Need to escape selector.
+
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ that.offsets.push(this[0])
+ that.targets.push(this[1])
+ })
+
+
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.getScrollHeight()
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (this.scrollHeight != scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+ }
+
+ if (activeTarget && scrollTop < offsets[0]) {
+ $(this.selector).trigger('clear.bs.scrollspy') // Add a custom event.
+ this.activeTarget = null
+ return this.clear()
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate(targets[i])
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ this.clear()
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+ ScrollSpy.prototype.clear = function () {
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = Plugin
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load.bs.scrollspy.data-api', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ Plugin.call($spy, $spy.data())
+ })
+ })
+
+}(jQuery);
diff --git a/source/js/src/utils.js b/source/js/src/utils.js
new file mode 100644
index 0000000000..c1621ef487
--- /dev/null
+++ b/source/js/src/utils.js
@@ -0,0 +1,339 @@
+/* global NexT: true */
+
+NexT.utils = NexT.$u = {
+ /**
+ * Wrap images with fancybox support.
+ */
+ wrapImageWithFancyBox: function () {
+ $('.content img')
+ .not('[hidden]')
+ .not('.group-picture img, .post-gallery img')
+ .each(function () {
+ var $image = $(this);
+ var imageTitle = $image.attr('title');
+ var $imageWrapLink = $image.parent('a');
+
+ if ($imageWrapLink.size() < 1) {
+ var imageLink = ($image.attr('data-original')) ? this.getAttribute('data-original') : this.getAttribute('src');
+ $imageWrapLink = $image.wrap('').parent('a');
+ }
+
+ $imageWrapLink.addClass('fancybox fancybox.image');
+ $imageWrapLink.attr('rel', 'group');
+
+ if (imageTitle) {
+ $imageWrapLink.append('
');
+
+ //make sure img title tag will show correctly in fancybox
+ $imageWrapLink.attr('title', imageTitle);
+ }
+ });
+
+ $('.fancybox').fancybox({
+ helpers: {
+ overlay: {
+ locked: false
+ }
+ }
+ });
+ },
+
+ lazyLoadPostsImages: function () {
+ $('#posts').find('img').lazyload({
+ //placeholder: '/images/loading.gif',
+ effect: 'fadeIn',
+ threshold : 0
+ });
+ },
+
+ /**
+ * Tabs tag listener (without twitter bootstrap).
+ */
+ registerTabsTag: function () {
+ var tNav = '.tabs ul.nav-tabs ';
+
+ // Binding `nav-tabs` & `tab-content` by real time permalink changing.
+ $(function() {
+ $(window).bind('hashchange', function() {
+ var tHash = location.hash;
+ if (tHash !== '') {
+ $(tNav + 'li:has(a[href="' + tHash + '"])').addClass('active').siblings().removeClass('active');
+ $(tHash).addClass('active').siblings().removeClass('active');
+ }
+ }).trigger('hashchange');
+ });
+
+ $(tNav + '.tab').on('click', function (href) {
+ href.preventDefault();
+ // Prevent selected tab to select again.
+ if(!$(this).hasClass('active')){
+
+ // Add & Remove active class on `nav-tabs` & `tab-content`.
+ $(this).addClass('active').siblings().removeClass('active');
+ var tActive = $(this).find('a').attr('href');
+ $(tActive).addClass('active').siblings().removeClass('active');
+
+ // Clear location hash in browser if #permalink exists.
+ if (location.hash !== '') {
+ history.pushState('', document.title, window.location.pathname + window.location.search);
+ }
+ }
+ });
+
+ },
+
+ registerESCKeyEvent: function () {
+ $(document).on('keyup', function (event) {
+ var shouldDismissSearchPopup = event.which === 27 &&
+ $('.search-popup').is(':visible');
+ if (shouldDismissSearchPopup) {
+ $('.search-popup').hide();
+ $('.search-popup-overlay').remove();
+ $('body').css('overflow', '');
+ }
+ });
+ },
+
+ registerBackToTop: function () {
+ var THRESHOLD = 50;
+ var $top = $('.back-to-top');
+
+ $(window).on('scroll', function () {
+ $top.toggleClass('back-to-top-on', window.pageYOffset > THRESHOLD);
+
+ var scrollTop = $(window).scrollTop();
+ var contentVisibilityHeight = NexT.utils.getContentVisibilityHeight();
+ var scrollPercent = (scrollTop) / (contentVisibilityHeight);
+ var scrollPercentRounded = Math.round(scrollPercent*100);
+ var scrollPercentMaxed = (scrollPercentRounded > 100) ? 100 : scrollPercentRounded;
+ $('#scrollpercent>span').html(scrollPercentMaxed);
+ });
+
+ $top.on('click', function () {
+ $('body').velocity('scroll');
+ });
+ },
+
+ /**
+ * Transform embedded video to support responsive layout.
+ * @see http://toddmotto.com/fluid-and-responsive-youtube-and-vimeo-videos-with-fluidvids-js/
+ */
+ embeddedVideoTransformer: function () {
+ var $iframes = $('iframe');
+
+ // Supported Players. Extend this if you need more players.
+ var SUPPORTED_PLAYERS = [
+ 'www.youtube.com',
+ 'player.vimeo.com',
+ 'player.youku.com',
+ 'music.163.com',
+ 'www.tudou.com'
+ ];
+ var pattern = new RegExp( SUPPORTED_PLAYERS.join('|') );
+
+ $iframes.each(function () {
+ var iframe = this;
+ var $iframe = $(this);
+ var oldDimension = getDimension($iframe);
+ var newDimension;
+
+ if (this.src.search(pattern) > 0) {
+
+ // Calculate the video ratio based on the iframe's w/h dimensions
+ var videoRatio = getAspectRadio(oldDimension.width, oldDimension.height);
+
+ // Replace the iframe's dimensions and position the iframe absolute
+ // This is the trick to emulate the video ratio
+ $iframe.width('100%').height('100%')
+ .css({
+ position: 'absolute',
+ top: '0',
+ left: '0'
+ });
+
+
+ // Wrap the iframe in a new which uses a dynamically fetched padding-top property
+ // based on the video's w/h dimensions
+ var wrap = document.createElement('div');
+ wrap.className = 'fluid-vids';
+ wrap.style.position = 'relative';
+ wrap.style.marginBottom = '20px';
+ wrap.style.width = '100%';
+ wrap.style.paddingTop = videoRatio + '%';
+ // Fix for appear inside tabs tag.
+ (wrap.style.paddingTop === '') && (wrap.style.paddingTop = '50%');
+
+ // Add the iframe inside our newly created
+ var iframeParent = iframe.parentNode;
+ iframeParent.insertBefore(wrap, iframe);
+ wrap.appendChild(iframe);
+
+ // Additional adjustments for 163 Music
+ if (this.src.search('music.163.com') > 0) {
+ newDimension = getDimension($iframe);
+ var shouldRecalculateAspect = newDimension.width > oldDimension.width ||
+ newDimension.height < oldDimension.height;
+
+ // 163 Music Player has a fixed height, so we need to reset the aspect radio
+ if (shouldRecalculateAspect) {
+ wrap.style.paddingTop = getAspectRadio(newDimension.width, oldDimension.height) + '%';
+ }
+ }
+ }
+ });
+
+ function getDimension($element) {
+ return {
+ width: $element.width(),
+ height: $element.height()
+ };
+ }
+
+ function getAspectRadio(width, height) {
+ return height / width * 100;
+ }
+ },
+
+ /**
+ * Add `menu-item-active` class name to menu item
+ * via comparing location.path with menu item's href.
+ */
+ addActiveClassToMenuItem: function () {
+ var path = window.location.pathname;
+ path = path === '/' ? path : path.substring(0, path.length - 1);
+ $('.menu-item a[href^="' + path + '"]:first').parent().addClass('menu-item-active');
+ },
+
+ hasMobileUA: function () {
+ var nav = window.navigator;
+ var ua = nav.userAgent;
+ var pa = /iPad|iPhone|Android|Opera Mini|BlackBerry|webOS|UCWEB|Blazer|PSP|IEMobile|Symbian/g;
+
+ return pa.test(ua);
+ },
+
+ isTablet: function () {
+ return window.screen.width < 992 && window.screen.width > 767 && this.hasMobileUA();
+ },
+
+ isMobile: function () {
+ return window.screen.width < 767 && this.hasMobileUA();
+ },
+
+ isDesktop: function () {
+ return !this.isTablet() && !this.isMobile();
+ },
+
+ /**
+ * Escape meta symbols in jQuery selectors.
+ *
+ * @param selector
+ * @returns {string|void|XML|*}
+ */
+ escapeSelector: function (selector) {
+ return selector.replace(/[!"$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, '\\$&');
+ },
+
+ displaySidebar: function () {
+ if (!this.isDesktop() || this.isPisces() || this.isGemini()) {
+ return;
+ }
+ $('.sidebar-toggle').trigger('click');
+ },
+
+ isMist: function () {
+ return CONFIG.scheme === 'Mist';
+ },
+
+ isPisces: function () {
+ return CONFIG.scheme === 'Pisces';
+ },
+
+ isGemini: function () {
+ return CONFIG.scheme === 'Gemini';
+ },
+
+ getScrollbarWidth: function () {
+ var $div = $('').addClass('scrollbar-measure').prependTo('body');
+ var div = $div[0];
+ var scrollbarWidth = div.offsetWidth - div.clientWidth;
+
+ $div.remove();
+
+ return scrollbarWidth;
+ },
+
+ getContentVisibilityHeight: function () {
+ var docHeight = $('#content').height(),
+ winHeight = $(window).height(),
+ contentVisibilityHeight = (docHeight > winHeight) ? (docHeight - winHeight) : ($(document).height() - winHeight);
+ return contentVisibilityHeight;
+ },
+
+ getSidebarb2tHeight: function () {
+ //var sidebarb2tHeight = (CONFIG.sidebar.b2t) ? document.getElementsByClassName('back-to-top')[0].clientHeight : 0;
+ var sidebarb2tHeight = (CONFIG.sidebar.b2t) ? $('.back-to-top').height() : 0;
+ //var sidebarb2tHeight = (CONFIG.sidebar.b2t) ? 24 : 0;
+ return sidebarb2tHeight;
+ },
+
+ getSidebarSchemePadding: function () {
+ var sidebarNavHeight = ($('.sidebar-nav').css('display') == 'block') ? $('.sidebar-nav').outerHeight(true) : 0,
+ sidebarInner = $('.sidebar-inner'),
+ sidebarPadding = sidebarInner.innerWidth() - sidebarInner.width(),
+ sidebarSchemePadding = this.isPisces() || this.isGemini() ?
+ ((sidebarPadding * 2) + sidebarNavHeight + (CONFIG.sidebar.offset * 2) + this.getSidebarb2tHeight()) :
+ ((sidebarPadding * 2) + (sidebarNavHeight / 2));
+ return sidebarSchemePadding;
+ }
+
+ /**
+ * Affix behaviour for Sidebar.
+ *
+ * @returns {Boolean}
+ */
+// needAffix: function () {
+// return this.isPisces() || this.isGemini();
+// }
+};
+
+$(document).ready(function () {
+
+ initSidebarDimension();
+
+ /**
+ * Init Sidebar & TOC inner dimensions on all pages and for all schemes.
+ * Need for Sidebar/TOC inner scrolling if content taller then viewport.
+ */
+ function initSidebarDimension () {
+ var updateSidebarHeightTimer;
+
+ $(window).on('resize', function () {
+ updateSidebarHeightTimer && clearTimeout(updateSidebarHeightTimer);
+
+ updateSidebarHeightTimer = setTimeout(function () {
+ var sidebarWrapperHeight = document.body.clientHeight - NexT.utils.getSidebarSchemePadding();
+
+ updateSidebarHeight(sidebarWrapperHeight);
+ }, 0);
+ });
+
+ // Initialize Sidebar & TOC Width.
+ var scrollbarWidth = NexT.utils.getScrollbarWidth();
+ if ($('.site-overview-wrap').height() > (document.body.clientHeight - NexT.utils.getSidebarSchemePadding())) {
+ $('.site-overview').css('width', 'calc(100% + ' + scrollbarWidth + 'px)');
+ }
+ if ($('.post-toc-wrap').height() > (document.body.clientHeight - NexT.utils.getSidebarSchemePadding())) {
+ $('.post-toc').css('width', 'calc(100% + ' + scrollbarWidth + 'px)');
+ }
+
+ // Initialize Sidebar & TOC Height.
+ updateSidebarHeight(document.body.clientHeight - NexT.utils.getSidebarSchemePadding());
+ }
+
+ function updateSidebarHeight (height) {
+ height = height || 'auto';
+ $('.site-overview, .post-toc').css('max-height', height);
+ }
+
+});
diff --git a/source/lib/font-awesome/.bower.json b/source/lib/font-awesome/.bower.json
new file mode 100644
index 0000000000..fb98b1d6d0
--- /dev/null
+++ b/source/lib/font-awesome/.bower.json
@@ -0,0 +1,36 @@
+{
+ "name": "font-awesome",
+ "description": "Font Awesome",
+ "keywords": [],
+ "homepage": "http://fontawesome.io",
+ "dependencies": {},
+ "devDependencies": {},
+ "license": [
+ "OFL-1.1",
+ "MIT",
+ "CC-BY-3.0"
+ ],
+ "main": [
+ "less/font-awesome.less",
+ "scss/font-awesome.scss"
+ ],
+ "ignore": [
+ "*/.*",
+ "*.json",
+ "src",
+ "*.yml",
+ "Gemfile",
+ "Gemfile.lock",
+ "*.md"
+ ],
+ "version": "4.7.0",
+ "_release": "4.7.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v4.7.0",
+ "commit": "a3fe90fa5f6fac55d197f9cbd18e3f57dafb716c"
+ },
+ "_source": "https://github.com/FortAwesome/Font-Awesome.git",
+ "_target": "*",
+ "_originalSource": "fontawesome"
+}
\ No newline at end of file
diff --git a/source/lib/font-awesome/.gitignore b/source/lib/font-awesome/.gitignore
new file mode 100644
index 0000000000..39c4f20b70
--- /dev/null
+++ b/source/lib/font-awesome/.gitignore
@@ -0,0 +1,33 @@
+*.pyc
+*.egg-info
+*.db
+*.db.old
+*.swp
+*.db-journal
+
+.coverage
+.DS_Store
+.installed.cfg
+_gh_pages/*
+
+.idea/*
+.svn/*
+src/website/static/*
+src/website/media/*
+
+bin
+cfcache
+develop-eggs
+dist
+downloads
+eggs
+parts
+tmp
+.sass-cache
+node_modules
+
+src/website/settingslocal.py
+stunnel.log
+
+.ruby-version
+.bundle
diff --git a/source/lib/font-awesome/.npmignore b/source/lib/font-awesome/.npmignore
new file mode 100644
index 0000000000..54a691f815
--- /dev/null
+++ b/source/lib/font-awesome/.npmignore
@@ -0,0 +1,42 @@
+*.pyc
+*.egg-info
+*.db
+*.db.old
+*.swp
+*.db-journal
+
+.coverage
+.DS_Store
+.installed.cfg
+_gh_pages/*
+
+.idea/*
+.svn/*
+src/website/static/*
+src/website/media/*
+
+bin
+cfcache
+develop-eggs
+dist
+downloads
+eggs
+parts
+tmp
+.sass-cache
+node_modules
+
+src/website/settingslocal.py
+stunnel.log
+
+.ruby-version
+
+# don't need these in the npm package.
+src/
+_config.yml
+bower.json
+component.json
+composer.json
+CONTRIBUTING.md
+Gemfile
+Gemfile.lock
diff --git a/source/lib/font-awesome/HELP-US-OUT.txt b/source/lib/font-awesome/HELP-US-OUT.txt
new file mode 100644
index 0000000000..83d083dd77
--- /dev/null
+++ b/source/lib/font-awesome/HELP-US-OUT.txt
@@ -0,0 +1,7 @@
+I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
+Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
+comprehensive icon sets or copy and paste your own.
+
+Please. Check it out.
+
+-Dave Gandy
diff --git a/source/lib/font-awesome/bower.json b/source/lib/font-awesome/bower.json
new file mode 100644
index 0000000000..9e2112659b
--- /dev/null
+++ b/source/lib/font-awesome/bower.json
@@ -0,0 +1,22 @@
+{
+ "name": "font-awesome",
+ "description": "Font Awesome",
+ "keywords": [],
+ "homepage": "http://fontawesome.io",
+ "dependencies": {},
+ "devDependencies": {},
+ "license": ["OFL-1.1", "MIT", "CC-BY-3.0"],
+ "main": [
+ "less/font-awesome.less",
+ "scss/font-awesome.scss"
+ ],
+ "ignore": [
+ "*/.*",
+ "*.json",
+ "src",
+ "*.yml",
+ "Gemfile",
+ "Gemfile.lock",
+ "*.md"
+ ]
+}
diff --git a/source/lib/font-awesome/css/font-awesome.css b/source/lib/font-awesome/css/font-awesome.css
new file mode 100644
index 0000000000..ee906a8196
--- /dev/null
+++ b/source/lib/font-awesome/css/font-awesome.css
@@ -0,0 +1,2337 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
+ src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.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;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: 0.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: 0.14285714em;
+ text-align: center;
+}
+.fa-li.fa-lg {
+ left: -1.85714286em;
+}
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eeeeee;
+ border-radius: .1em;
+}
+.fa-pull-left {
+ float: left;
+}
+.fa-pull-right {
+ float: right;
+}
+.fa.fa-pull-left {
+ margin-right: .3em;
+}
+.fa.fa-pull-right {
+ margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.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;
+}
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+@-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 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+ -ms-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 {
+ -ms-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: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.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-f:before,
+.fa-facebook:before {
+ content: "\f09a";
+}
+.fa-github:before {
+ content: "\f09b";
+}
+.fa-unlock:before {
+ content: "\f09c";
+}
+.fa-credit-card:before {
+ content: "\f09d";
+}
+.fa-feed:before,
+.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,
+.fa-gratipay: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-pp: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-resistance: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-y-combinator-square:before,
+.fa-yc-square:before,
+.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";
+}
+.fa-buysellads:before {
+ content: "\f20d";
+}
+.fa-connectdevelop:before {
+ content: "\f20e";
+}
+.fa-dashcube:before {
+ content: "\f210";
+}
+.fa-forumbee:before {
+ content: "\f211";
+}
+.fa-leanpub:before {
+ content: "\f212";
+}
+.fa-sellsy:before {
+ content: "\f213";
+}
+.fa-shirtsinbulk:before {
+ content: "\f214";
+}
+.fa-simplybuilt:before {
+ content: "\f215";
+}
+.fa-skyatlas:before {
+ content: "\f216";
+}
+.fa-cart-plus:before {
+ content: "\f217";
+}
+.fa-cart-arrow-down:before {
+ content: "\f218";
+}
+.fa-diamond:before {
+ content: "\f219";
+}
+.fa-ship:before {
+ content: "\f21a";
+}
+.fa-user-secret:before {
+ content: "\f21b";
+}
+.fa-motorcycle:before {
+ content: "\f21c";
+}
+.fa-street-view:before {
+ content: "\f21d";
+}
+.fa-heartbeat:before {
+ content: "\f21e";
+}
+.fa-venus:before {
+ content: "\f221";
+}
+.fa-mars:before {
+ content: "\f222";
+}
+.fa-mercury:before {
+ content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+ content: "\f224";
+}
+.fa-transgender-alt:before {
+ content: "\f225";
+}
+.fa-venus-double:before {
+ content: "\f226";
+}
+.fa-mars-double:before {
+ content: "\f227";
+}
+.fa-venus-mars:before {
+ content: "\f228";
+}
+.fa-mars-stroke:before {
+ content: "\f229";
+}
+.fa-mars-stroke-v:before {
+ content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+ content: "\f22b";
+}
+.fa-neuter:before {
+ content: "\f22c";
+}
+.fa-genderless:before {
+ content: "\f22d";
+}
+.fa-facebook-official:before {
+ content: "\f230";
+}
+.fa-pinterest-p:before {
+ content: "\f231";
+}
+.fa-whatsapp:before {
+ content: "\f232";
+}
+.fa-server:before {
+ content: "\f233";
+}
+.fa-user-plus:before {
+ content: "\f234";
+}
+.fa-user-times:before {
+ content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+ content: "\f236";
+}
+.fa-viacoin:before {
+ content: "\f237";
+}
+.fa-train:before {
+ content: "\f238";
+}
+.fa-subway:before {
+ content: "\f239";
+}
+.fa-medium:before {
+ content: "\f23a";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+ content: "\f23b";
+}
+.fa-optin-monster:before {
+ content: "\f23c";
+}
+.fa-opencart:before {
+ content: "\f23d";
+}
+.fa-expeditedssl:before {
+ content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+ content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+ content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+ content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+ content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+ content: "\f244";
+}
+.fa-mouse-pointer:before {
+ content: "\f245";
+}
+.fa-i-cursor:before {
+ content: "\f246";
+}
+.fa-object-group:before {
+ content: "\f247";
+}
+.fa-object-ungroup:before {
+ content: "\f248";
+}
+.fa-sticky-note:before {
+ content: "\f249";
+}
+.fa-sticky-note-o:before {
+ content: "\f24a";
+}
+.fa-cc-jcb:before {
+ content: "\f24b";
+}
+.fa-cc-diners-club:before {
+ content: "\f24c";
+}
+.fa-clone:before {
+ content: "\f24d";
+}
+.fa-balance-scale:before {
+ content: "\f24e";
+}
+.fa-hourglass-o:before {
+ content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+ content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+ content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+ content: "\f253";
+}
+.fa-hourglass:before {
+ content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+ content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+ content: "\f256";
+}
+.fa-hand-scissors-o:before {
+ content: "\f257";
+}
+.fa-hand-lizard-o:before {
+ content: "\f258";
+}
+.fa-hand-spock-o:before {
+ content: "\f259";
+}
+.fa-hand-pointer-o:before {
+ content: "\f25a";
+}
+.fa-hand-peace-o:before {
+ content: "\f25b";
+}
+.fa-trademark:before {
+ content: "\f25c";
+}
+.fa-registered:before {
+ content: "\f25d";
+}
+.fa-creative-commons:before {
+ content: "\f25e";
+}
+.fa-gg:before {
+ content: "\f260";
+}
+.fa-gg-circle:before {
+ content: "\f261";
+}
+.fa-tripadvisor:before {
+ content: "\f262";
+}
+.fa-odnoklassniki:before {
+ content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+ content: "\f264";
+}
+.fa-get-pocket:before {
+ content: "\f265";
+}
+.fa-wikipedia-w:before {
+ content: "\f266";
+}
+.fa-safari:before {
+ content: "\f267";
+}
+.fa-chrome:before {
+ content: "\f268";
+}
+.fa-firefox:before {
+ content: "\f269";
+}
+.fa-opera:before {
+ content: "\f26a";
+}
+.fa-internet-explorer:before {
+ content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+ content: "\f26c";
+}
+.fa-contao:before {
+ content: "\f26d";
+}
+.fa-500px:before {
+ content: "\f26e";
+}
+.fa-amazon:before {
+ content: "\f270";
+}
+.fa-calendar-plus-o:before {
+ content: "\f271";
+}
+.fa-calendar-minus-o:before {
+ content: "\f272";
+}
+.fa-calendar-times-o:before {
+ content: "\f273";
+}
+.fa-calendar-check-o:before {
+ content: "\f274";
+}
+.fa-industry:before {
+ content: "\f275";
+}
+.fa-map-pin:before {
+ content: "\f276";
+}
+.fa-map-signs:before {
+ content: "\f277";
+}
+.fa-map-o:before {
+ content: "\f278";
+}
+.fa-map:before {
+ content: "\f279";
+}
+.fa-commenting:before {
+ content: "\f27a";
+}
+.fa-commenting-o:before {
+ content: "\f27b";
+}
+.fa-houzz:before {
+ content: "\f27c";
+}
+.fa-vimeo:before {
+ content: "\f27d";
+}
+.fa-black-tie:before {
+ content: "\f27e";
+}
+.fa-fonticons:before {
+ content: "\f280";
+}
+.fa-reddit-alien:before {
+ content: "\f281";
+}
+.fa-edge:before {
+ content: "\f282";
+}
+.fa-credit-card-alt:before {
+ content: "\f283";
+}
+.fa-codiepie:before {
+ content: "\f284";
+}
+.fa-modx:before {
+ content: "\f285";
+}
+.fa-fort-awesome:before {
+ content: "\f286";
+}
+.fa-usb:before {
+ content: "\f287";
+}
+.fa-product-hunt:before {
+ content: "\f288";
+}
+.fa-mixcloud:before {
+ content: "\f289";
+}
+.fa-scribd:before {
+ content: "\f28a";
+}
+.fa-pause-circle:before {
+ content: "\f28b";
+}
+.fa-pause-circle-o:before {
+ content: "\f28c";
+}
+.fa-stop-circle:before {
+ content: "\f28d";
+}
+.fa-stop-circle-o:before {
+ content: "\f28e";
+}
+.fa-shopping-bag:before {
+ content: "\f290";
+}
+.fa-shopping-basket:before {
+ content: "\f291";
+}
+.fa-hashtag:before {
+ content: "\f292";
+}
+.fa-bluetooth:before {
+ content: "\f293";
+}
+.fa-bluetooth-b:before {
+ content: "\f294";
+}
+.fa-percent:before {
+ content: "\f295";
+}
+.fa-gitlab:before {
+ content: "\f296";
+}
+.fa-wpbeginner:before {
+ content: "\f297";
+}
+.fa-wpforms:before {
+ content: "\f298";
+}
+.fa-envira:before {
+ content: "\f299";
+}
+.fa-universal-access:before {
+ content: "\f29a";
+}
+.fa-wheelchair-alt:before {
+ content: "\f29b";
+}
+.fa-question-circle-o:before {
+ content: "\f29c";
+}
+.fa-blind:before {
+ content: "\f29d";
+}
+.fa-audio-description:before {
+ content: "\f29e";
+}
+.fa-volume-control-phone:before {
+ content: "\f2a0";
+}
+.fa-braille:before {
+ content: "\f2a1";
+}
+.fa-assistive-listening-systems:before {
+ content: "\f2a2";
+}
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+ content: "\f2a3";
+}
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+ content: "\f2a4";
+}
+.fa-glide:before {
+ content: "\f2a5";
+}
+.fa-glide-g:before {
+ content: "\f2a6";
+}
+.fa-signing:before,
+.fa-sign-language:before {
+ content: "\f2a7";
+}
+.fa-low-vision:before {
+ content: "\f2a8";
+}
+.fa-viadeo:before {
+ content: "\f2a9";
+}
+.fa-viadeo-square:before {
+ content: "\f2aa";
+}
+.fa-snapchat:before {
+ content: "\f2ab";
+}
+.fa-snapchat-ghost:before {
+ content: "\f2ac";
+}
+.fa-snapchat-square:before {
+ content: "\f2ad";
+}
+.fa-pied-piper:before {
+ content: "\f2ae";
+}
+.fa-first-order:before {
+ content: "\f2b0";
+}
+.fa-yoast:before {
+ content: "\f2b1";
+}
+.fa-themeisle:before {
+ content: "\f2b2";
+}
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+ content: "\f2b3";
+}
+.fa-fa:before,
+.fa-font-awesome:before {
+ content: "\f2b4";
+}
+.fa-handshake-o:before {
+ content: "\f2b5";
+}
+.fa-envelope-open:before {
+ content: "\f2b6";
+}
+.fa-envelope-open-o:before {
+ content: "\f2b7";
+}
+.fa-linode:before {
+ content: "\f2b8";
+}
+.fa-address-book:before {
+ content: "\f2b9";
+}
+.fa-address-book-o:before {
+ content: "\f2ba";
+}
+.fa-vcard:before,
+.fa-address-card:before {
+ content: "\f2bb";
+}
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+ content: "\f2bc";
+}
+.fa-user-circle:before {
+ content: "\f2bd";
+}
+.fa-user-circle-o:before {
+ content: "\f2be";
+}
+.fa-user-o:before {
+ content: "\f2c0";
+}
+.fa-id-badge:before {
+ content: "\f2c1";
+}
+.fa-drivers-license:before,
+.fa-id-card:before {
+ content: "\f2c2";
+}
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+ content: "\f2c3";
+}
+.fa-quora:before {
+ content: "\f2c4";
+}
+.fa-free-code-camp:before {
+ content: "\f2c5";
+}
+.fa-telegram:before {
+ content: "\f2c6";
+}
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+ content: "\f2c7";
+}
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+ content: "\f2c8";
+}
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+ content: "\f2c9";
+}
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+ content: "\f2ca";
+}
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+ content: "\f2cb";
+}
+.fa-shower:before {
+ content: "\f2cc";
+}
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+ content: "\f2cd";
+}
+.fa-podcast:before {
+ content: "\f2ce";
+}
+.fa-window-maximize:before {
+ content: "\f2d0";
+}
+.fa-window-minimize:before {
+ content: "\f2d1";
+}
+.fa-window-restore:before {
+ content: "\f2d2";
+}
+.fa-times-rectangle:before,
+.fa-window-close:before {
+ content: "\f2d3";
+}
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+ content: "\f2d4";
+}
+.fa-bandcamp:before {
+ content: "\f2d5";
+}
+.fa-grav:before {
+ content: "\f2d6";
+}
+.fa-etsy:before {
+ content: "\f2d7";
+}
+.fa-imdb:before {
+ content: "\f2d8";
+}
+.fa-ravelry:before {
+ content: "\f2d9";
+}
+.fa-eercast:before {
+ content: "\f2da";
+}
+.fa-microchip:before {
+ content: "\f2db";
+}
+.fa-snowflake-o:before {
+ content: "\f2dc";
+}
+.fa-superpowers:before {
+ content: "\f2dd";
+}
+.fa-wpexplorer:before {
+ content: "\f2de";
+}
+.fa-meetup:before {
+ content: "\f2e0";
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
diff --git a/source/lib/font-awesome/css/font-awesome.css.map b/source/lib/font-awesome/css/font-awesome.css.map
new file mode 100644
index 0000000000..60763a8640
--- /dev/null
+++ b/source/lib/font-awesome/css/font-awesome.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": ";;;;;;;AAGA,UAUC;EATC,WAAW,EAAE,aAAa;EAC1B,GAAG,EAAE,+CAAgE;EACrE,GAAG,EAAE,ySAAmG;EAKxG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;ACTpB,GAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,uCAAwD;EAC9D,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EAClC,SAAS,EAAE,eAAe;;;ACN5B,MAAsB;EACpB,SAAS,EAAE,SAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;ACVtC,MAAsB;EACpB,KAAK,EAAE,SAAW;EAClB,UAAU,EAAE,MAAM;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECKU,SAAS;EDJ9B,eAAe,EAAE,IAAI;EACrB,WAAK;IAAE,QAAQ,EAAE,QAAQ;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,UAAa;EACnB,KAAK,ECFgB,SAAS;EDG9B,GAAG,EAAE,SAAU;EACf,UAAU,EAAE,MAAM;EAClB,YAAuB;IACrB,IAAI,EAAE,UAA0B;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;AAGrB,WAAY;EAAE,KAAK,EAAE,KAAK;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;AAGtB,aAAY;EAAE,YAAY,EAAE,IAAI;AAChC,cAAa;EAAE,WAAW,EAAE,IAAI;;ACXlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AC5BrC,aAA8B;ECY5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;ADdrC,cAA8B;ECW5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADbrC,cAA8B;ECU5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADXrC,mBAAmC;ECejC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADjBzC,iBAAmC;ECcjC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADZzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;AAC5C,WAA2B;EAAE,KAAK,ELVZ,IAAI;;;;AMN1B,gBAAgC;EAAE,OAAO,ENoQ1B,GAAO;;AMnQtB,gBAAgC;EAAE,OAAO,EN0W1B,GAAO;;AMzWtB,iBAAiC;EAAE,OAAO,ENmb1B,GAAO;;AMlbvB,qBAAqC;EAAE,OAAO,ENmL1B,GAAO;;AMlL3B,gBAAgC;EAAE,OAAO,ENkR1B,GAAO;;AMjRtB,eAA+B;EAAE,OAAO,ENke1B,GAAO;;AMjerB,iBAAiC;EAAE,OAAO,ENse1B,GAAO;;AMrevB,eAA+B;EAAE,OAAO,EN+iB1B,GAAO;;AM9iBrB,eAA+B;EAAE,OAAO,ENyN1B,GAAO;;AMxNrB,mBAAmC;EAAE,OAAO,ENggB1B,GAAO;;AM/fzB,aAA6B;EAAE,OAAO,EN8f1B,GAAO;;AM7fnB,kBAAkC;EAAE,OAAO,EN+f1B,GAAO;;AM9fxB,gBAAgC;EAAE,OAAO,ENoG1B,GAAO;;AMnGtB;;gBAEgC;EAAE,OAAO,ENkgB1B,GAAO;;AMjgBtB,sBAAsC;EAAE,OAAO,ENua1B,GAAO;;AMta5B,uBAAuC;EAAE,OAAO,ENqa1B,GAAO;;AMpa7B,oBAAoC;EAAE,OAAO,EN+X1B,GAAO;;AM9X1B,iBAAiC;EAAE,OAAO,ENsb1B,GAAO;;AMrbvB;cAC8B;EAAE,OAAO,ENwH1B,GAAO;;AMvHpB,kBAAkC;EAAE,OAAO,ENygB1B,GAAO;;AMxgBxB,eAA+B;EAAE,OAAO,ENmQ1B,GAAO;;AMlQrB,iBAAiC;EAAE,OAAO,EN6L1B,GAAO;;AM5LvB,kBAAkC;EAAE,OAAO,EN0G1B,GAAO;;AMzGxB,eAA+B;EAAE,OAAO,EN+Y1B,GAAO;;AM9YrB,mBAAmC;EAAE,OAAO,ENiJ1B,GAAO;;AMhJzB,8BAA8C;EAAE,OAAO,ENI1B,GAAO;;AMHpC,4BAA4C;EAAE,OAAO,ENM1B,GAAO;;AMLlC,gBAAgC;EAAE,OAAO,ENkQ1B,GAAO;;AMjQtB,wBAAwC;EAAE,OAAO,EN4W1B,GAAO;;AM3W9B;iBACiC;EAAE,OAAO,ENmY1B,GAAO;;AMlYvB,kBAAkC;EAAE,OAAO,EN8X1B,GAAO;;AM7XxB,mBAAmC;EAAE,OAAO,ENiS1B,GAAO;;AMhSzB,eAA+B;EAAE,OAAO,ENoS1B,GAAO;;AMnSrB,eAA+B;EAAE,OAAO,ENgM1B,GAAO;;AM/LrB,qBAAqC;EAAE,OAAO,EN+O1B,GAAO;;AM9O3B,qBAAqC;EAAE,OAAO,EN8hB1B,GAAO;;AM7hB3B,sBAAsC;EAAE,OAAO,EN4hB1B,GAAO;;AM3hB5B,oBAAoC;EAAE,OAAO,EN6hB1B,GAAO;;AM5hB1B,iBAAiC;EAAE,OAAO,EN2W1B,GAAO;;AM1WvB,kBAAkC;EAAE,OAAO,ENW1B,GAAO;;AMVxB,cAA8B;EAAE,OAAO,ENod1B,GAAO;;AMndpB,eAA+B;EAAE,OAAO,ENod1B,GAAO;;AMndrB,eAA+B;EAAE,OAAO,EN2B1B,GAAO;;AM1BrB,mBAAmC;EAAE,OAAO,EN2B1B,GAAO;;AM1BzB,gBAAgC;EAAE,OAAO,ENkW1B,GAAO;;AMjWtB,iBAAiC;EAAE,OAAO,ENwC1B,GAAO;;AMvCvB,eAA+B;EAAE,OAAO,EN8L1B,GAAO;;AM7LrB,eAA+B;EAAE,OAAO,ENmB1B,GAAO;;AMlBrB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB,sBAAsC;EAAE,OAAO,ENid1B,GAAO;;AMhd5B,qBAAqC;EAAE,OAAO,ENid1B,GAAO;;AMhd3B,qBAAqC;EAAE,OAAO,EN1C1B,GAAO;;AM2C3B,uBAAuC;EAAE,OAAO,EN7C1B,GAAO;;AM8C7B,sBAAsC;EAAE,OAAO,EN3C1B,GAAO;;AM4C5B,wBAAwC;EAAE,OAAO,EN9C1B,GAAO;;AM+C9B,eAA+B;EAAE,OAAO,ENwQ1B,GAAO;;AMvQrB;kBACkC;EAAE,OAAO,ENmT1B,GAAO;;AMlTxB,iBAAiC;EAAE,OAAO,ENmO1B,GAAO;;AMlOvB,uBAAuC;EAAE,OAAO,ENigB1B,GAAO;;AMhgB7B;;oBAEoC;EAAE,OAAO,EN+T1B,GAAO;;AM9T1B,iBAAiC;EAAE,OAAO,ENwT1B,GAAO;;AMvTvB,qBAAqC;EAAE,OAAO,EN+Q1B,GAAO;;AM9Q3B,iBAAiC;EAAE,OAAO,EN5D1B,GAAO;;AM6DvB,eAA+B;EAAE,OAAO,EN8c1B,GAAO;;AM7crB;0BAC0C;EAAE,OAAO,ENqT1B,GAAO;;AMpThC,yBAAyC;EAAE,OAAO,ENuX1B,GAAO;;AMtX/B,yBAAyC;EAAE,OAAO,EN0C1B,GAAO;;AMzC/B,iBAAiC;EAAE,OAAO,ENjC1B,GAAO;;AMkCvB,wBAAwC;EAAE,OAAO,ENma1B,GAAO;;AMla9B,wBAAwC;EAAE,OAAO,EN4H1B,GAAO;;AM3H9B,mBAAmC;EAAE,OAAO,EN7B1B,GAAO;;AM8BzB,eAA+B;EAAE,OAAO,EN0T1B,GAAO;;AMzTrB,gBAAgC;EAAE,OAAO,ENwS1B,GAAO;;AMvStB,eAA+B;EAAE,OAAO,ENia1B,GAAO;;AMharB,kBAAkC;EAAE,OAAO,ENgK1B,GAAO;;AM/JxB,uBAAuC;EAAE,OAAO,ENuH1B,GAAO;;AMtH7B,uBAAuC;EAAE,OAAO,EN4Z1B,GAAO;;AM3Z7B,gBAAgC;EAAE,OAAO,EN4F1B,GAAO;;AM3FtB,uBAAuC;EAAE,OAAO,ENoC1B,GAAO;;AMnC7B,wBAAwC;EAAE,OAAO,ENoC1B,GAAO;;AMnC9B,sBAAsC;EAAE,OAAO,ENsT1B,GAAO;;AMrT5B,uBAAuC;EAAE,OAAO,ENyQ1B,GAAO;;AMxQ7B,uBAAuC;EAAE,OAAO,ENwb1B,GAAO;;AMvb7B,uBAAuC;EAAE,OAAO,ENsB1B,GAAO;;AMrB7B,0BAA0C;EAAE,OAAO,EN2T1B,GAAO;;AM1ThC,sBAAsC;EAAE,OAAO,ENsM1B,GAAO;;AMrM5B,qBAAqC;EAAE,OAAO,EN6D1B,GAAO;;AM5D3B,yBAAyC;EAAE,OAAO,ENob1B,GAAO;;AMnb/B,yBAAyC;EAAE,OAAO,ENkB1B,GAAO;;AMjB/B,cAA8B;EAAE,OAAO,EN/C1B,GAAO;;AMgDpB,qBAAqC;EAAE,OAAO,EN3D1B,GAAO;;AM4D3B,sBAAsC;EAAE,OAAO,EN3D1B,GAAO;;AM4D5B,mBAAmC;EAAE,OAAO,EN3D1B,GAAO;;AM4DzB,qBAAqC;EAAE,OAAO,EN/D1B,GAAO;;AMgE3B;gBACgC;EAAE,OAAO,ENqV1B,GAAO;;AMpVtB,iBAAiC;EAAE,OAAO,ENuF1B,GAAO;;AMtFvB,mBAAmC;EAAE,OAAO,EN4C1B,GAAO;;AM3CzB,eAA+B;EAAE,OAAO,ENmS1B,GAAO;;AMlSrB,gBAAgC;EAAE,OAAO,ENsP1B,GAAO;;AMrPtB,mBAAmC;EAAE,OAAO,EN9D1B,GAAO;;AM+DzB,6BAA6C;EAAE,OAAO,ENgF1B,GAAO;;AM/EnC,eAA+B;EAAE,OAAO,EN+I1B,GAAO;;AM9IrB,eAA+B;EAAE,OAAO,ENoM1B,GAAO;;AMnMrB,eAA+B;EAAE,OAAO,ENmH1B,GAAO;;AMlHrB,cAA8B;EAAE,OAAO,ENiF1B,GAAO;;AMhFpB,oBAAoC;EAAE,OAAO,ENiF1B,GAAO;;AMhF1B;+BAC+C;EAAE,OAAO,EN0E1B,GAAO;;AMzErC,gBAAgC;EAAE,OAAO,ENmR1B,GAAO;;AMlRtB,mBAAmC;EAAE,OAAO,EN/B1B,GAAO;;AMgCzB,iBAAiC;EAAE,OAAO,ENoS1B,GAAO;;AMnSvB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,iBAAiC;EAAE,OAAO,ENqN1B,GAAO;;AMpNvB,qBAAqC;EAAE,OAAO,ENE1B,GAAO;;AMD3B,uBAAuC;EAAE,OAAO,ENF1B,GAAO;;AMG7B,kBAAkC;EAAE,OAAO,EN2S1B,GAAO;;AM1SxB,wBAAwC;EAAE,OAAO,ENyU1B,GAAO;;AMxU9B,iBAAiC;EAAE,OAAO,EN8G1B,GAAO;;AM7GvB,sBAAsC;EAAE,OAAO,EN+G1B,GAAO;;AM9G5B,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,mBAAmC;EAAE,OAAO,ENrF1B,GAAO;;AMsFzB;oBACoC;EAAE,OAAO,EN/E1B,GAAO;;AMgF1B,yBAAyC;EAAE,OAAO,ENua1B,GAAO;;AMta/B,0BAA0C;EAAE,OAAO,ENmE1B,GAAO;;AMlEhC,uBAAuC;EAAE,OAAO,EN5C1B,GAAO;;AM6C7B,cAA8B;EAAE,OAAO,ENqK1B,GAAO;;AMpKpB;eAC+B;EAAE,OAAO,ENK1B,GAAO;;AMJrB,mBAAmC;EAAE,OAAO,ENQ1B,GAAO;;AMPzB,sBAAsC;EAAE,OAAO,ENmY1B,GAAO;;AMlY5B,wBAAwC;EAAE,OAAO,ENiY1B,GAAO;;AMhY9B,oBAAoC;EAAE,OAAO,EN2V1B,GAAO;;AM1V1B,kBAAkC;EAAE,OAAO,ENyI1B,GAAO;;AMxIxB,mBAAmC;EAAE,OAAO,ENyT1B,GAAO;;AMxTzB,0BAA0C;EAAE,OAAO,ENiL1B,GAAO;;AMhLhC,qBAAqC;EAAE,OAAO,EN0X1B,GAAO;;AMzX3B,wBAAwC;EAAE,OAAO,EN8C1B,GAAO;;AM7C9B,kBAAkC;EAAE,OAAO,ENoT1B,GAAO;;AMnTxB,iBAAiC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YvB,wBAAwC;EAAE,OAAO,EN6G1B,GAAO;;AM5G9B,iBAAiC;EAAE,OAAO,EN8Z1B,GAAO;;AM7ZvB,kBAAkC;EAAE,OAAO,EN+J1B,GAAO;;AM9JxB,gBAAgC;EAAE,OAAO,ENsO1B,GAAO;;AMrOtB,mBAAmC;EAAE,OAAO,EN2U1B,GAAO;;AM1UzB,qBAAqC;EAAE,OAAO,EN/E1B,GAAO;;AMgF3B,uBAAuC;EAAE,OAAO,ENoO1B,GAAO;;AMnO7B,kBAAkC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YxB;mBACmC;EAAE,OAAO,ENuC1B,GAAO;;AMtCzB,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,iBAAiC;EAAE,OAAO,ENiZ1B,GAAO;;AMhZvB,sBAAsC;EAAE,OAAO,ENR1B,GAAO;;AMS5B,cAA8B;EAAE,OAAO,EN4Q1B,GAAO;;AM3QpB,gBAAgC;EAAE,OAAO,ENgH1B,GAAO;;AM/GtB,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,eAA+B;EAAE,OAAO,ENzG1B,GAAO;;AM0GrB,sBAAsC;EAAE,OAAO,ENzD1B,GAAO;;AM0D5B,uBAAuC;EAAE,OAAO,EN0G1B,GAAO;;AMzG7B,sBAAsC;EAAE,OAAO,ENwG1B,GAAO;;AMvG5B,oBAAoC;EAAE,OAAO,ENyG1B,GAAO;;AMxG1B,sBAAsC;EAAE,OAAO,ENqG1B,GAAO;;AMpG5B,4BAA4C;EAAE,OAAO,EN5I1B,GAAO;;AM6IlC,6BAA6C;EAAE,OAAO,ENxI1B,GAAO;;AMyInC,0BAA0C;EAAE,OAAO,ENxI1B,GAAO;;AMyIhC,4BAA4C;EAAE,OAAO,ENhJ1B,GAAO;;AMiJlC,gBAAgC;EAAE,OAAO,ENsF1B,GAAO;;AMrFtB,iBAAiC;EAAE,OAAO,ENia1B,GAAO;;AMhavB,gBAAgC;EAAE,OAAO,ENiV1B,GAAO;;AMhVtB,iBAAiC;EAAE,OAAO,ENgD1B,GAAO;;AM/CvB,oBAAoC;EAAE,OAAO,ENvG1B,GAAO;;AMwG1B,qBAAqC;EAAE,OAAO,ENzI1B,GAAO;;AM0I3B;gBACgC;EAAE,OAAO,ENqY1B,GAAO;;AMpYtB;eAC+B;EAAE,OAAO,ENuI1B,GAAO;;AMtIrB,gBAAgC;EAAE,OAAO,ENpD1B,GAAO;;AMqDtB,gBAAgC;EAAE,OAAO,EN+C1B,GAAO;;AM9CtB;mBACmC;EAAE,OAAO,ENwP1B,GAAO;;AMvPzB;kBACkC;EAAE,OAAO,ENkC1B,GAAO;;AMjCxB,oBAAoC;EAAE,OAAO,ENsL1B,GAAO;;AMrL1B;mBACmC;EAAE,OAAO,EN0C1B,GAAO;;AMzCzB,iBAAiC;EAAE,OAAO,ENiS1B,GAAO;;AMhSvB;;eAE+B;EAAE,OAAO,EN9I1B,GAAO;;AM+IrB,kBAAkC;EAAE,OAAO,ENgI1B,GAAO;;AM/HxB,kBAAkC;EAAE,OAAO,EN8H1B,GAAO;;AM7HxB,wBAAwC;EAAE,OAAO,EN4S1B,GAAO;;AM3S9B,oBAAoC;EAAE,OAAO,ENoW1B,GAAO;;AMnW1B,gBAAgC;EAAE,OAAO,ENmT1B,GAAO;;AMlTtB,gBAAgC;EAAE,OAAO,ENkI1B,GAAO;;AMjItB,gBAAgC;EAAE,OAAO,ENuV1B,GAAO;;AMtVtB,oBAAoC;EAAE,OAAO,ENwL1B,GAAO;;AMvL1B,2BAA2C;EAAE,OAAO,ENyL1B,GAAO;;AMxLjC,6BAA6C;EAAE,OAAO,ENyD1B,GAAO;;AMxDnC,sBAAsC;EAAE,OAAO,ENuD1B,GAAO;;AMtD5B,gBAAgC;EAAE,OAAO,ENsJ1B,GAAO;;AMrJtB,qBAAqC;EAAE,OAAO,ENtH1B,GAAO;;AMuH3B,mBAAmC;EAAE,OAAO,ENhH1B,GAAO;;AMiHzB,qBAAqC;EAAE,OAAO,ENvH1B,GAAO;;AMwH3B,sBAAsC;EAAE,OAAO,ENvH1B,GAAO;;AMwH5B,kBAAkC;EAAE,OAAO,ENvE1B,GAAO;;AMwExB;eAC+B;EAAE,OAAO,EN2P1B,GAAO;;AM1PrB;oBACoC;EAAE,OAAO,EN+P1B,GAAO;;AM9P1B;mBACmC;EAAE,OAAO,EN4P1B,GAAO;;AM3PzB,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,mBAAmC;EAAE,OAAO,ENkG1B,GAAO;;AMjGzB;eAC+B;EAAE,OAAO,EN8U1B,GAAO;;AM7UrB;gBACgC;EAAE,OAAO,ENqB1B,GAAO;;AMpBtB;qBACqC;EAAE,OAAO,EN2R1B,GAAO;;AM1R3B,oBAAoC;EAAE,OAAO,ENpF1B,GAAO;;AMqF1B,qBAAqC;EAAE,OAAO,ENnF1B,GAAO;;AMoF3B;eAC+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,kBAAkC;EAAE,OAAO,ENkO1B,GAAO;;AMjOxB,mBAAmC;EAAE,OAAO,ENkU1B,GAAO;;AMjUzB;oBACoC;EAAE,OAAO,EN1G1B,GAAO;;AM2G1B,sBAAsC;EAAE,OAAO,ENgF1B,GAAO;;AM/E5B,mBAAmC;EAAE,OAAO,ENnD1B,GAAO;;AMoDzB,yBAAyC;EAAE,OAAO,ENzG1B,GAAO;;AM0G/B,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,kBAAkC;EAAE,OAAO,ENsU1B,GAAO;;AMrUxB,sBAAsC;EAAE,OAAO,EN+P1B,GAAO;;AM9P5B,mBAAmC;EAAE,OAAO,ENsQ1B,GAAO;;AMrQzB,iBAAiC;EAAE,OAAO,ENvL1B,GAAO;;AMwLvB,iBAAiC;EAAE,OAAO,ENzG1B,GAAO;;AM0GvB,kBAAkC;EAAE,OAAO,ENtF1B,GAAO;;AMuFxB,sBAAsC;EAAE,OAAO,EN3B1B,GAAO;;AM4B5B,qBAAqC;EAAE,OAAO,ENxK1B,GAAO;;AMyK3B,qBAAqC;EAAE,OAAO,ENkC1B,GAAO;;AMjC3B,oBAAoC;EAAE,OAAO,EN3O1B,GAAO;;AM4O1B,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,sBAAsC;EAAE,OAAO,EN/C1B,GAAO;;AMgD5B,eAA+B;EAAE,OAAO,ENpM1B,GAAO;;AMqMrB,mBAAmC;EAAE,OAAO,ENe1B,GAAO;;AMdzB,sBAAsC;EAAE,OAAO,ENgJ1B,GAAO;;AM/I5B,4BAA4C;EAAE,OAAO,EN5O1B,GAAO;;AM6OlC,6BAA6C;EAAE,OAAO,EN5O1B,GAAO;;AM6OnC,0BAA0C;EAAE,OAAO,EN5O1B,GAAO;;AM6OhC,4BAA4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC,qBAAqC;EAAE,OAAO,EN5O1B,GAAO;;AM6O3B,sBAAsC;EAAE,OAAO,EN5O1B,GAAO;;AM6O5B,mBAAmC;EAAE,OAAO,EN5O1B,GAAO;;AM6OzB,qBAAqC;EAAE,OAAO,ENhP1B,GAAO;;AMiP3B,kBAAkC;EAAE,OAAO,ENlG1B,GAAO;;AMmGxB,iBAAiC;EAAE,OAAO,ENuC1B,GAAO;;AMtCvB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB;iBACiC;EAAE,OAAO,ENyF1B,GAAO;;AMxFvB,mBAAmC;EAAE,OAAO,EN9I1B,GAAO;;AM+IzB,qBAAqC;EAAE,OAAO,EN0I1B,GAAO;;AMzI3B,sBAAsC;EAAE,OAAO,EN0I1B,GAAO;;AMzI5B,kBAAkC;EAAE,OAAO,ENgN1B,GAAO;;AM/MxB,iBAAiC;EAAE,OAAO,ENnJ1B,GAAO;;AMoJvB;gBACgC;EAAE,OAAO,ENkJ1B,GAAO;;AMjJtB,qBAAqC;EAAE,OAAO,ENnB1B,GAAO;;AMoB3B,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,wBAAwC;EAAE,OAAO,ENvC1B,GAAO;;AMwC9B,kBAAkC;EAAE,OAAO,EN0L1B,GAAO;;AMzLxB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,gBAAgC;EAAE,OAAO,ENoE1B,GAAO;;AMnEtB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,iBAAiC;EAAE,OAAO,ENrD1B,GAAO;;AMsDvB,yBAAyC;EAAE,OAAO,ENvD1B,GAAO;;AMwD/B,mBAAmC;EAAE,OAAO,ENuO1B,GAAO;;AMtOzB,eAA+B;EAAE,OAAO,ENtJ1B,GAAO;;AMuJrB;oBACoC;EAAE,OAAO,ENqI1B,GAAO;;AMpI1B;;sBAEsC;EAAE,OAAO,ENuM1B,GAAO;;AMtM5B,yBAAyC;EAAE,OAAO,ENkC1B,GAAO;;AMjC/B,eAA+B;EAAE,OAAO,EN5I1B,GAAO;;AM6IrB,oBAAoC;EAAE,OAAO,EN7J1B,GAAO;;AM8J1B;uBACuC;EAAE,OAAO,EN1L1B,GAAO;;AM2L7B,mBAAmC;EAAE,OAAO,EN4G1B,GAAO;;AM3GzB,eAA+B;EAAE,OAAO,ENT1B,GAAO;;AMUrB,sBAAsC;EAAE,OAAO,ENhH1B,GAAO;;AMiH5B,sBAAsC;EAAE,OAAO,EN8M1B,GAAO;;AM7M5B,oBAAoC;EAAE,OAAO,ENyM1B,GAAO;;AMxM1B,iBAAiC;EAAE,OAAO,ENvH1B,GAAO;;AMwHvB,uBAAuC;EAAE,OAAO,ENmG1B,GAAO;;AMlG7B,qBAAqC;EAAE,OAAO,EN8C1B,GAAO;;AM7C3B,2BAA2C;EAAE,OAAO,EN8C1B,GAAO;;AM7CjC,iBAAiC;EAAE,OAAO,ENgJ1B,GAAO;;AM/IvB,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,4BAA4C;EAAE,OAAO,ENjF1B,GAAO;;AMkFlC,iBAAiC;EAAE,OAAO,ENoH1B,GAAO;;AMnHvB,iBAAiC;EAAE,OAAO,ENkC1B,GAAO;;AMjCvB,8BAA8C;EAAE,OAAO,ENlM1B,GAAO;;AMmMpC,+BAA+C;EAAE,OAAO,ENlM1B,GAAO;;AMmMrC,4BAA4C;EAAE,OAAO,ENlM1B,GAAO;;AMmMlC,8BAA8C;EAAE,OAAO,ENtM1B,GAAO;;AMuMpC,gBAAgC;EAAE,OAAO,EN/B1B,GAAO;;AMgCtB,eAA+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,iBAAiC;EAAE,OAAO,EN9S1B,GAAO;;AM+SvB,qBAAqC;EAAE,OAAO,ENmP1B,GAAO;;AMlP3B,mBAAmC;EAAE,OAAO,EN9O1B,GAAO;;AM+OzB,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN4G1B,GAAO;;AM3G3B,sBAAsC;EAAE,OAAO,ENsE1B,GAAO;;AMrE5B,iBAAiC;EAAE,OAAO,EN2M1B,GAAO;;AM1MvB,uBAAuC;EAAE,OAAO,EN6B1B,GAAO;;AM5B7B,yBAAyC;EAAE,OAAO,EN6B1B,GAAO;;AM5B/B,mBAAmC;EAAE,OAAO,ENhB1B,GAAO;;AMiBzB,qBAAqC;EAAE,OAAO,ENlB1B,GAAO;;AMmB3B,uBAAuC;EAAE,OAAO,ENvN1B,GAAO;;AMwN7B,wBAAwC;EAAE,OAAO,ENiD1B,GAAO;;AMhD9B,+BAA+C;EAAE,OAAO,EN3I1B,GAAO;;AM4IrC,uBAAuC;EAAE,OAAO,ENkH1B,GAAO;;AMjH7B,kBAAkC;EAAE,OAAO,EN1L1B,GAAO;;AM2LxB;8BAC8C;EAAE,OAAO,ENjP1B,GAAO;;AMkPpC;4BAC4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC;+BAC+C;EAAE,OAAO,ENnP1B,GAAO;;AMoPrC;cAC8B;EAAE,OAAO,EN7J1B,GAAO;;AM8JpB,cAA8B;EAAE,OAAO,EN/F1B,GAAO;;AMgGpB;cAC8B;EAAE,OAAO,EN4N1B,GAAO;;AM3NpB;cAC8B;EAAE,OAAO,ENvD1B,GAAO;;AMwDpB;;;cAG8B;EAAE,OAAO,ENrD1B,GAAO;;AMsDpB;;cAE8B;EAAE,OAAO,EN8E1B,GAAO;;AM7EpB;cAC8B;EAAE,OAAO,ENtD1B,GAAO;;AMuDpB;cAC8B;EAAE,OAAO,ENzR1B,GAAO;;AM0RpB,eAA+B;EAAE,OAAO,ENzJ1B,GAAO;;AM0JrB,oBAAoC;EAAE,OAAO,EN7I1B,GAAO;;AM8I1B,yBAAyC;EAAE,OAAO,EN2G1B,GAAO;;AM1G/B,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,2BAA2C;EAAE,OAAO,EN2G1B,GAAO;;AM1GjC,2BAA2C;EAAE,OAAO,EN8G1B,GAAO;;AM7GjC,4BAA4C;EAAE,OAAO,EN8G1B,GAAO;;AM7GlC,oBAAoC;EAAE,OAAO,ENgK1B,GAAO;;AM/J1B,sBAAsC;EAAE,OAAO,EN4J1B,GAAO;;AM3J5B,yBAAyC;EAAE,OAAO,ENwO1B,GAAO;;AMvO/B,kBAAkC;EAAE,OAAO,ENqO1B,GAAO;;AMpOxB,eAA+B;EAAE,OAAO,EN+N1B,GAAO;;AM9NrB,sBAAsC;EAAE,OAAO,EN+N1B,GAAO;;AM9N5B,uBAAuC;EAAE,OAAO,ENmO1B,GAAO;;AMlO7B,kBAAkC;EAAE,OAAO,ENxM1B,GAAO;;AMyMxB,yBAAyC;EAAE,OAAO,EN+G1B,GAAO;;AM9G/B,oBAAoC;EAAE,OAAO,ENnF1B,GAAO;;AMoF1B,iBAAiC;EAAE,OAAO,EN/I1B,GAAO;;AMgJvB,cAA8B;EAAE,OAAO,ENhX1B,GAAO;;AMiXpB,oBAAoC;EAAE,OAAO,ENxT1B,GAAO;;AMyT1B,2BAA2C;EAAE,OAAO,ENxT1B,GAAO;;AMyTjC,iBAAiC;EAAE,OAAO,ENyK1B,GAAO;;AMxKvB,wBAAwC;EAAE,OAAO,ENyK1B,GAAO;;AMxK9B,0BAA0C;EAAE,OAAO,ENtD1B,GAAO;;AMuDhC,wBAAwC;EAAE,OAAO,ENpD1B,GAAO;;AMqD9B,0BAA0C;EAAE,OAAO,ENvD1B,GAAO;;AMwDhC,2BAA2C;EAAE,OAAO,ENvD1B,GAAO;;AMwDjC,gBAAgC;EAAE,OAAO,ENxW1B,GAAO;;AMyWtB,kBAAkC;EAAE,OAAO,EN0M1B,GAAO;;AMzMxB,kBAAkC;EAAE,OAAO,ENpX1B,GAAO;;AMqXxB,gBAAgC;EAAE,OAAO,ENpE1B,GAAO;;AMqEtB,mBAAmC;EAAE,OAAO,EN1N1B,GAAO;;AM2NzB,gBAAgC;EAAE,OAAO,ENqE1B,GAAO;;AMpEtB,qBAAqC;EAAE,OAAO,ENtJ1B,GAAO;;AMuJ3B,iBAAiC;EAAE,OAAO,ENuJ1B,GAAO;;AMtJvB,iBAAiC;EAAE,OAAO,EN/L1B,GAAO;;AMgMvB,eAA+B;EAAE,OAAO,EN1D1B,GAAO;;AM2DrB;mBACmC;EAAE,OAAO,ENnI1B,GAAO;;AMoIzB,gBAAgC;EAAE,OAAO,EN2G1B,GAAO;;AM1GtB,iBAAiC;EAAE,OAAO,ENxC1B,GAAO;;AMyCvB,kBAAkC;EAAE,OAAO,ENrX1B,GAAO;;AMsXxB,cAA8B;EAAE,OAAO,ENpU1B,GAAO;;AMqUpB,aAA6B;EAAE,OAAO,ENgL1B,GAAO;;AM/KnB,gBAAgC;EAAE,OAAO,ENqL1B,GAAO;;AMpLtB,iBAAiC;EAAE,OAAO,ENa1B,GAAO;;AMZvB,oBAAoC;EAAE,OAAO,ENrC1B,GAAO;;AMsC1B,yBAAyC;EAAE,OAAO,EN8E1B,GAAO;;AM7E/B,+BAA+C;EAAE,OAAO,ENtX1B,GAAO;;AMuXrC,8BAA8C;EAAE,OAAO,ENxX1B,GAAO;;AMyXpC;8BAC8C;EAAE,OAAO,EN3T1B,GAAO;;AM4TpC,uBAAuC;EAAE,OAAO,ENjP1B,GAAO;;AMkP7B,qBAAqC;EAAE,OAAO,EN+K1B,GAAO;;AM9K3B,uBAAuC;EAAE,OAAO,ENmK1B,GAAO;;AMlK7B;cAC8B;EAAE,OAAO,ENoI1B,GAAO;;AMnIpB,wBAAwC;EAAE,OAAO,ENjB1B,GAAO;;AMkB9B,wBAAwC;EAAE,OAAO,EN6D1B,GAAO;;AM5D9B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,0BAA0C;EAAE,OAAO,EN7O1B,GAAO;;AM8OhC,oBAAoC;EAAE,OAAO,EN2K1B,GAAO;;AM1K1B,iBAAiC;EAAE,OAAO,ENvD1B,GAAO;;AMwDvB;;qBAEqC;EAAE,OAAO,ENsI1B,GAAO;;AMrI3B;yBACyC;EAAE,OAAO,ENjK1B,GAAO;;AMkK/B,gBAAgC;EAAE,OAAO,ENwK1B,GAAO;;AMvKtB,iBAAiC;EAAE,OAAO,ENvK1B,GAAO;;AMwKvB,iBAAiC;EAAE,OAAO,ENhB1B,GAAO;;AMiBvB,wBAAwC;EAAE,OAAO,ENhB1B,GAAO;;AMiB9B,6BAA6C;EAAE,OAAO,ENsE1B,GAAO;;AMrEnC,sBAAsC;EAAE,OAAO,ENoE1B,GAAO;;AMnE5B,oBAAoC;EAAE,OAAO,EN7Q1B,GAAO;;AM8Q1B,eAA+B;EAAE,OAAO,EN1Q1B,GAAO;;AM2QrB,qBAAqC;EAAE,OAAO,ENjD1B,GAAO;;AMkD3B,yBAAyC;EAAE,OAAO,ENjD1B,GAAO;;AMkD/B,iBAAiC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQvB,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,mBAAmC;EAAE,OAAO,ENzI1B,GAAO;;AM0IzB,cAA8B;EAAE,OAAO,EN9O1B,GAAO;;AM+OpB,mBAAmC;EAAE,OAAO,EN3W1B,GAAO;;AM4WzB,gBAAgC;EAAE,OAAO,EN9T1B,GAAO;;AM+TtB,cAA8B;EAAE,OAAO,ENnE1B,GAAO;;AMoEpB,gBAAgC;EAAE,OAAO,ENoC1B,GAAO;;AMnCtB,eAA+B;EAAE,OAAO,ENjS1B,GAAO;;AMkSrB,gBAAgC;EAAE,OAAO,ENjS1B,GAAO;;AMkStB,kBAAkC;EAAE,OAAO,ENtY1B,GAAO;;AMuYxB,yBAAyC;EAAE,OAAO,ENtY1B,GAAO;;AMuY/B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,uBAAuC;EAAE,OAAO,EN2C1B,GAAO;;AM1C7B,kBAAkC;EAAE,OAAO,ENvC1B,GAAO;;AMwCxB;cAC8B;EAAE,OAAO,EN3W1B,GAAO;;AM4WpB;eAC+B;EAAE,OAAO,EN2D1B,GAAO;;AM1DrB,eAA+B;EAAE,OAAO,ENuF1B,GAAO;;AMtFrB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,qBAAqC;EAAE,OAAO,ENpS1B,GAAO;;AMqS3B,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,mBAAmC;EAAE,OAAO,EN1S1B,GAAO;;AM2SzB,qBAAqC;EAAE,OAAO,ENxP1B,GAAO;;AMyP3B,sBAAsC;EAAE,OAAO,ENjP1B,GAAO;;AMkP5B,uBAAuC;EAAE,OAAO,EN9P1B,GAAO;;AM+P7B,4BAA4C;EAAE,OAAO,ENxP1B,GAAO;;AMyPlC;;uBAEuC;EAAE,OAAO,ENjQ1B,GAAO;;AMkQ7B;yBACyC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQ/B;uBACuC;EAAE,OAAO,ENxQ1B,GAAO;;AMyQ7B;uBACuC;EAAE,OAAO,EN7P1B,GAAO;;AM8P7B,sBAAsC;EAAE,OAAO,EN1Q1B,GAAO;;AM2Q5B,eAA+B;EAAE,OAAO,ENsG1B,GAAO;;AMrGrB,kBAAkC;EAAE,OAAO,ENlV1B,GAAO;;AMmVxB,mBAAmC;EAAE,OAAO,ENnL1B,GAAO;;AMoLzB;;;;oBAIoC;EAAE,OAAO,ENxK1B,GAAO;;AMyK1B,yBAAyC;EAAE,OAAO,ENpW1B,GAAO;;AMqW/B;gBACgC;EAAE,OAAO,EN1E1B,GAAO;;AM2EtB;iBACiC;EAAE,OAAO,ENpT1B,GAAO;;AMqTvB,qBAAqC;EAAE,OAAO,EN1O1B,GAAO;;AM2O3B,cAA8B;EAAE,OAAO,EN5O1B,GAAO;;AM6OpB,sBAAsC;EAAE,OAAO,EN7N1B,GAAO;;AM8N5B,wBAAwC;EAAE,OAAO,ENwB1B,GAAO;;AMvB9B,aAA6B;EAAE,OAAO,ENzF1B,GAAO;;AM0FnB;iBACiC;EAAE,OAAO,EN2F1B,GAAO;;AM1FvB;sBACsC;EAAE,OAAO,EN9H1B,GAAO;;AM+H5B;wBACwC;EAAE,OAAO,EN/H1B,GAAO;;AMgI9B,kBAAkC;EAAE,OAAO,EN3N1B,GAAO;;AM4NxB;sBACsC;EAAE,OAAO,ENrX1B,GAAO;;AMsX5B,iBAAiC;EAAE,OAAO,ENnO1B,GAAO;;AMoOvB,oBAAoC;EAAE,OAAO,ENlI1B,GAAO;;AMmI1B,kBAAkC;EAAE,OAAO,EN1C1B,GAAO;;AM2CxB,oBAAoC;EAAE,OAAO,EN7D1B,GAAO;;AM8D1B,2BAA2C;EAAE,OAAO,EN7D1B,GAAO;;AM8DjC,eAA+B;EAAE,OAAO,ENpb1B,GAAO;;AMqbrB;mBACmC;EAAE,OAAO,ENzQ1B,GAAO;;AM0QzB,cAA8B;EAAE,OAAO,ENsC1B,GAAO;;AMrCpB,qBAAqC;EAAE,OAAO,EN/b1B,GAAO;;AMgc3B,eAA+B;EAAE,OAAO,ENrH1B,GAAO;;AMsHrB,qBAAqC;EAAE,OAAO,ENlD1B,GAAO;;AMmD3B,iBAAiC;EAAE,OAAO,ENsC1B,GAAO;;AMrCvB,eAA+B;EAAE,OAAO,ENiF1B,GAAO;;AMhFrB,sBAAsC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ5B,eAA+B;EAAE,OAAO,ENuE1B,GAAO;;AMtErB,qBAAqC;EAAE,OAAO,ENjb1B,GAAO;;AMkb3B,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,wBAAwC;EAAE,OAAO,ENhQ1B,GAAO;;AMiQ9B,kBAAkC;EAAE,OAAO,EN9Z1B,GAAO;;AM+ZxB,wBAAwC;EAAE,OAAO,ENla1B,GAAO;;AMma9B,sBAAsC;EAAE,OAAO,ENpa1B,GAAO;;AMqa5B,kBAAkC;EAAE,OAAO,ENta1B,GAAO;;AMuaxB,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,qBAAqC;EAAE,OAAO,ENld1B,GAAO;;AMmd3B,uBAAuC;EAAE,OAAO,ENld1B,GAAO;;AMmd7B,gBAAgC;EAAE,OAAO,ENY1B,GAAO;;AMXtB,oBAAoC;EAAE,OAAO,EN3X1B,GAAO;;AM4X1B,aAA6B;EAAE,OAAO,ENre1B,GAAO;;AMsenB,qBAAqC;EAAE,OAAO,ENjV1B,GAAO;;AMkV3B,sBAAsC;EAAE,OAAO,ENpK1B,GAAO;;AMqK5B,wBAAwC;EAAE,OAAO,ENrd1B,GAAO;;AMsd9B,qBAAqC;EAAE,OAAO,EN3f1B,GAAO;;AM4f3B,oBAAoC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ1B,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,iBAAiC;EAAE,OAAO,EN1O1B,GAAO;;AM2OvB,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,qBAAqC;EAAE,OAAO,ENN1B,GAAO;;AMO3B,oBAAoC;EAAE,OAAO,ENN1B,GAAO;;AMO1B,kBAAkC;EAAE,OAAO,EN/d1B,GAAO;;AMgexB,cAA8B;EAAE,OAAO,EN7c1B,GAAO;;AM8cpB,kBAAkC;EAAE,OAAO,EN1P1B,GAAO;;AM2PxB,oBAAoC;EAAE,OAAO,ENhhB1B,GAAO;;AMihB1B,aAA6B;EAAE,OAAO,EN7b1B,GAAO;;AM8bnB;;cAE8B;EAAE,OAAO,ENxQ1B,GAAO;;AMyQpB,mBAAmC;EAAE,OAAO,EN7M1B,GAAO;;AM8MzB,qBAAqC;EAAE,OAAO,ENpd1B,GAAO;;AMqd3B,yBAAyC;EAAE,OAAO,ENnZ1B,GAAO;;AMoZ/B,mBAAmC;EAAE,OAAO,ENxY1B,GAAO;;AMyYzB,mBAAmC;EAAE,OAAO,EN1T1B,GAAO;;AM2TzB,kBAAkC;EAAE,OAAO,ENxP1B,GAAO;;AMyPxB,iBAAiC;EAAE,OAAO,ENrH1B,GAAO;;AMsHvB,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,sBAAsC;EAAE,OAAO,ENrG1B,GAAO;;AMsG5B,mBAAmC;EAAE,OAAO,ENpG1B,GAAO;;AMqGzB,oBAAoC;EAAE,OAAO,EN5c1B,GAAO;;AM6c1B,0BAA0C;EAAE,OAAO,EN9c1B,GAAO;;AM+chC,kBAAkC;EAAE,OAAO,EN3Y1B,GAAO;;AM4YxB,eAA+B;EAAE,OAAO,ENhH1B,GAAO;;AMiHrB,sBAAsC;EAAE,OAAO,ENI1B,GAAO;;AMH5B,qBAAqC;EAAE,OAAO,EN5M1B,GAAO;;AM6M3B,sBAAsC;EAAE,OAAO,ENpE1B,GAAO;;AMqE5B,oBAAoC;EAAE,OAAO,ENhS1B,GAAO;;AMiS1B,gBAAgC;EAAE,OAAO,ENG1B,GAAO;;AMFtB,eAA+B;EAAE,OAAO,ENtO1B,GAAO;;AMuOrB,kBAAkC;EAAE,OAAO,EN7N1B,GAAO;;AM8NxB,sBAAsC;EAAE,OAAO,ENhC1B,GAAO;;AMiC5B,0BAA0C;EAAE,OAAO,ENhC1B,GAAO;;AMiChC,uBAAuC;EAAE,OAAO,END1B,GAAO;;AME7B,sBAAsC;EAAE,OAAO,EN1O1B,GAAO;;AM2O5B,qBAAqC;EAAE,OAAO,ENF1B,GAAO;;AMG3B,sBAAsC;EAAE,OAAO,EN3O1B,GAAO;;AM4O5B,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,wBAAwC;EAAE,OAAO,EN5O1B,GAAO;;AM6O9B,iBAAiC;EAAE,OAAO,ENvN1B,GAAO;;AMwNvB,4BAA4C;EAAE,OAAO,EN9X1B,GAAO;;AM+XlC,sBAAsC;EAAE,OAAO,ENhM1B,GAAO;;AMiM5B,mBAAmC;EAAE,OAAO,ENI1B,GAAO;;AMHzB,iBAAiC;EAAE,OAAO,EN7I1B,GAAO;;AM8IvB,oBAAoC;EAAE,OAAO,ENjB1B,GAAO;;AMkB1B,qBAAqC;EAAE,OAAO,ENhB1B,GAAO;;AMiB3B;cAC8B;EAAE,OAAO,ENphB1B,GAAO;;AMqhBpB,kBAAkC;EAAE,OAAO,ENd1B,GAAO;;AMexB,gBAAgC;EAAE,OAAO,ENnD1B,GAAO;;AMoDtB,iBAAiC;EAAE,OAAO,ENvF1B,GAAO;;AMwFvB,iBAAiC;EAAE,OAAO,ENrP1B,GAAO",
+"sources": ["../scss/_path.scss","../scss/_core.scss","../scss/_larger.scss","../scss/_fixed-width.scss","../scss/_list.scss","../scss/_variables.scss","../scss/_bordered-pulled.scss","../scss/_animated.scss","../scss/_rotated-flipped.scss","../scss/_mixins.scss","../scss/_stacked.scss","../scss/_icons.scss"],
+"names": [],
+"file": "font-awesome.css"
+}
diff --git a/source/lib/font-awesome/css/font-awesome.min.css b/source/lib/font-awesome/css/font-awesome.min.css
new file mode 100644
index 0000000000..540440ce89
--- /dev/null
+++ b/source/lib/font-awesome/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.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}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.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}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-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{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-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{-ms-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-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.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,.fa-gratipay: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-pp: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-resistance: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-y-combinator-square:before,.fa-yc-square:before,.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"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/source/lib/font-awesome/fonts/fontawesome-webfont.eot b/source/lib/font-awesome/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000000..e9f60ca953
Binary files /dev/null and b/source/lib/font-awesome/fonts/fontawesome-webfont.eot differ
diff --git a/source/lib/font-awesome/fonts/fontawesome-webfont.woff b/source/lib/font-awesome/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000000..400014a4b0
Binary files /dev/null and b/source/lib/font-awesome/fonts/fontawesome-webfont.woff differ
diff --git a/source/lib/font-awesome/fonts/fontawesome-webfont.woff2 b/source/lib/font-awesome/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000000..4d13fc6040
Binary files /dev/null and b/source/lib/font-awesome/fonts/fontawesome-webfont.woff2 differ
diff --git a/source/lib/jquery/index.js b/source/lib/jquery/index.js
new file mode 100644
index 0000000000..25714ed29a
--- /dev/null
+++ b/source/lib/jquery/index.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},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},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)
+},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec=/#.*$/,fc=/([?&])_=[^&]*/,gc=/^(.*?):[ \t]*([^\r\n]*)$/gm,hc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ic=/^(?:GET|HEAD)$/,jc=/^\/\//,kc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lc={},mc={},nc="*/".concat("*"),oc=a.location.href,pc=kc.exec(oc.toLowerCase())||[];function qc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rc(a,b,c,d){var e={},f=a===mc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function uc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:oc,type:"GET",isLocal:hc.test(pc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sc(sc(a,n.ajaxSettings),b):sc(n.ajaxSettings,a)},ajaxPrefilter:qc(lc),ajaxTransport:qc(mc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gc.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||oc)+"").replace(ec,"").replace(jc,pc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pc[1]&&h[2]===pc[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pc[3]||("http:"===pc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rc(lc,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ic.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fc.test(d)?d.replace(fc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rc(mc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tc(k,v,f)),u=uc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vc=/%20/g,wc=/\[\]$/,xc=/\r?\n/g,yc=/^(?:submit|button|image|reset|file)$/i,zc=/^(?:input|select|textarea|keygen)/i;function Ac(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wc.test(a)?d(a,e):Ac(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ac(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ac(c,a[c],b,e);return d.join("&").replace(vc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zc.test(this.nodeName)&&!yc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xc,"\r\n")}}):{name:b.name,value:c.replace(xc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bc=0,Cc={},Dc={0:200,1223:204},Ec=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cc)Cc[a]()}),k.cors=!!Ec&&"withCredentials"in Ec,k.ajax=Ec=!!Ec,n.ajaxTransport(function(a){var b;return k.cors||Ec&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Dc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("