diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 b/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910
index 5b5beb4..2c4fcaf 100644
--- a/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910
+++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910
@@ -1 +1 @@
-I"{"source"=>"/home/pengzhan/Github/CoderSherlock.github.io", "destination"=>"/home/pengzhan/Github/CoderSherlock.github.io/_site", "collections_dir"=>"", "cache_dir"=>".jekyll-cache", "plugins_dir"=>"_plugins", "layouts_dir"=>"_layouts", "data_dir"=>"_data", "includes_dir"=>"_includes", "collections"=>{"posts"=>{"output"=>true, "permalink"=>"/archivers/:title"}}, "safe"=>false, "include"=>[".htaccess"], "exclude"=>[".sass-cache", ".jekyll-cache", "gemfiles", "Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"], "keep_files"=>[".git", ".svn"], "encoding"=>"utf-8", "markdown_ext"=>"markdown,mkdown,mkdn,mkd,md", "strict_front_matter"=>false, "show_drafts"=>nil, "limit_posts"=>0, "future"=>false, "unpublished"=>false, "whitelist"=>[], "plugins"=>[], "markdown"=>"kramdown", "highlighter"=>"rouge", "lsi"=>false, "excerpt_separator"=>"\n\n", "incremental"=>false, "detach"=>false, "port"=>"4000", "host"=>"127.0.0.1", "baseurl"=>"", "show_dir_listing"=>false, "permalink"=>"/archivers/:title", "paginate_path"=>"page:num", "timezone"=>nil, "quiet"=>false, "verbose"=>false, "defaults"=>[], "liquid"=>{"error_mode"=>"warn", "strict_filters"=>false, "strict_variables"=>false}, "kramdown"=>{"auto_ids"=>true, "toc_levels"=>[1, 2, 3, 4, 5, 6], "entity_output"=>"as_char", "smart_quotes"=>"lsquo,rsquo,ldquo,rdquo", "input"=>"GFM", "hard_wrap"=>false, "guess_lang"=>true, "footnote_nr"=>1, "show_warnings"=>false, "syntax_highlighter"=>"rouge"}, "title"=>"Stop Talking, Start Doing", "author"=>"Pengzhan Hao", "avatar"=>"/static/avatar.jpg", "email"=>"haopengzhan@gmail.com", "description"=>"My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.\n", "url"=>"https://codersherlock.github.com/", "github_username"=>"codersherlock", "disqus_shortname"=>"codersherlockblog", "gems"=>["jekyll-paginate", "jekyll-gist", "jemoji", "jekyll-sitemap"], "paginate"=>5, "serving"=>false}:ET
\ No newline at end of file
+I"�{"source"=>"/home/pengzhan/Github/CoderSherlock.github.io", "destination"=>"/home/pengzhan/Github/CoderSherlock.github.io/_site", "collections_dir"=>"", "cache_dir"=>".jekyll-cache", "plugins_dir"=>"_plugins", "layouts_dir"=>"_layouts", "data_dir"=>"_data", "includes_dir"=>"_includes", "collections"=>{"posts"=>{"output"=>true, "permalink"=>"/posts/:title"}}, "safe"=>false, "include"=>[".htaccess"], "exclude"=>["CHANGELOG.md", "HOW_TO_RELEASE.md", "Gemfile", "Gemfile.lock", "LICENSE", "README-*.md", "README.md", "gulpfile.js", "jekyll-text-theme.gemspec", "package-lock.json", "package.json", "/docs", "/node_modules", "/screenshots", "/test", "/vendor", ".sass-cache", ".jekyll-cache", "gemfiles", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"], "keep_files"=>[".git", ".svn"], "encoding"=>"utf-8", "markdown_ext"=>"markdown,mkdown,mkdn,mkd,md", "strict_front_matter"=>false, "show_drafts"=>nil, "limit_posts"=>0, "future"=>false, "unpublished"=>false, "whitelist"=>[], "plugins"=>["jekyll-feed", "jekyll-paginate", "jekyll-sitemap", "jemoji"], "markdown"=>"kramdown", "highlighter"=>"rouge", "lsi"=>false, "excerpt_separator"=>"<!--more-->", "incremental"=>false, "detach"=>false, "port"=>"4000", "host"=>"127.0.0.1", "baseurl"=>"", "show_dir_listing"=>false, "permalink"=>"/posts/:title", "paginate_path"=>"/page:num", "timezone"=>"America/New_York", "quiet"=>false, "verbose"=>false, "defaults"=>[{"scope"=>{"path"=>"", "type"=>"posts"}, "values"=>{"layout"=>"article", "sharing"=>true, "license"=>true, "aside"=>{"toc"=>true}, "show_edit_on_github"=>true, "show_subscribe"=>true, "pageview"=>true}}], "liquid"=>{"error_mode"=>"warn", "strict_filters"=>false, "strict_variables"=>false}, "kramdown"=>{"auto_ids"=>true, "toc_levels"=>[1, 2, 3, 4, 5, 6], "entity_output"=>"as_char", "smart_quotes"=>"lsquo,rsquo,ldquo,rdquo", "input"=>"GFM", "hard_wrap"=>false, "guess_lang"=>true, "footnote_nr"=>1, "show_warnings"=>false, "syntax_highlighter"=>"rouge", "syntax_highlighter_opts"=>{:default_lang=>"plaintext", :guess_lang=>true}, "coderay"=>{}}, "text_skin"=>"default", "highlight_theme"=>"default", "url"=>"http://localhost:4000", "title"=>"Stop Talking, Start Doing", "description"=>"My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.\n", "lang"=>"en", "author"=>{"type"=>nil, "name"=>"Pengzhan Hao", "url"=>nil, "avatar"=>"/static/avatar.jpg", "bio"=>nil, "email"=>"haopengzhan@gmail.com", "facebook"=>nil, "twitter"=>nil, "weibo"=>nil, "googleplus"=>nil, "telegram"=>nil, "medium"=>nil, "zhihu"=>nil, "douban"=>nil, "linkedin"=>nil, "github"=>"codersherlock", "npm"=>nil}, "repository"=>"CoderSherlock/CoderSherlock.github.io", "repository_tree"=>"master", "paths"=>{"root"=>nil, "home"=>nil, "archive"=>nil, "rss"=>nil}, "license"=>nil, "toc"=>{"selectors"=>nil}, "mathjax"=>nil, "mathjax_autoNumber"=>nil, "mermaid"=>nil, "chart"=>nil, "paginate"=>8, "sources"=>nil, "sharing"=>{"provider"=>false, "addthis"=>{"id"=>nil}}, "comments"=>{"provider"=>"disqus", "disqus"=>{"shortname"=>"codersherlockblog"}, "gitalk"=>{"clientID"=>nil, "clientSecret"=>nil, "repository"=>nil, "owner"=>nil, "admin"=>nil}, "valine"=>{"app_id"=>nil, "app_key"=>nil, "placeholder"=>nil, "visitor"=>nil, "meta"=>nil}}, "pageview"=>{"provider"=>false, "leancloud"=>{"app_id"=>nil, "app_key"=>nil, "app_class"=>nil}}, "search"=>{"provider"=>"default", "google"=>{"custom_search_engine_id"=>nil}}, "analytics"=>{"provider"=>"google", "google"=>{"tracking_id"=>"UA-82637164-1", "anonymize_ip"=>false}}, "livereload_port"=>35729, "serving"=>true, "watch"=>true}:ET
\ No newline at end of file
diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/06/c9ce82bc8fac09480ab9d4d80c47971ff7c697b5b39b8d3861fad21ed2257c b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/06/c9ce82bc8fac09480ab9d4d80c47971ff7c697b5b39b8d3861fad21ed2257c
deleted file mode 100644
index 5091015..0000000
--- a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/06/c9ce82bc8fac09480ab9d4d80c47971ff7c697b5b39b8d3861fad21ed2257c
+++ /dev/null
@@ -1,104 +0,0 @@
-I")<div class="timeline">
-
-<div class="timeline__group">
-	<span class="timeline__year">Now</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">21</span>
-			<span clas="timeline__month">Aug</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<p>Look up at the Starry Sky</p>
-			<audio controls=""><source src="/static/2018-09/beihang.mp3" type="audio/mpeg" /></audio>
-			<img src="http://www.fsaona.com/images/imagesbigimg.jpg" height="auto" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2011</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">10</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Transfered to another high school</p> -->
-			<img src="http://school.zhongkao.com/style/school/pictures/school/734/73421/logo.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2010</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened high school</p> -->
-			<img src="http://www.fuzhong.sd.cn/uploadfile/2015/0704/20150704044140866.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2008</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened middle school</p> -->
-			<img src="https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike72%2C5%2C5%2C72%2C24/sign=5bc3fe5949540923be646b2cf331ba6c/3812b31bb051f819506a0330dab44aed2e73e779.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2005</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened primary school</p> -->
-			<img src="http://www.sdsdfx.com:85/fxjylm/u/cms/www/201510/27194804xvgc.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">1999</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">26</span>
-			<span class="timeline__month">Aug</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<p> Borned in <a href="https://en.wikipedia.org/wiki/Jinan">Jinan</a>, <a href="https://en.wikipedia.org/wiki/Shandong">Shandong Province</a>, China </p>
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">1993</span>
-</div>
-
-</div>
-:ET
\ No newline at end of file
diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0e/a06c1a63bef4f67f10f12e509739b28b31c03079197fe1b2c79a69a7374f5a b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0e/a06c1a63bef4f67f10f12e509739b28b31c03079197fe1b2c79a69a7374f5a
deleted file mode 100644
index f7d7d3b..0000000
--- a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0e/a06c1a63bef4f67f10f12e509739b28b31c03079197fe1b2c79a69a7374f5a
+++ /dev/null
@@ -1,2 +0,0 @@
-I"�<p>This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.</p>
-:ET
\ No newline at end of file
diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/61/2cc00e9190ed44be6967cefcdb15b35e1dfc51666b9ae9c2d7448177f50863 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/61/2cc00e9190ed44be6967cefcdb15b35e1dfc51666b9ae9c2d7448177f50863
deleted file mode 100644
index 2b44381..0000000
--- a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/61/2cc00e9190ed44be6967cefcdb15b35e1dfc51666b9ae9c2d7448177f50863
+++ /dev/null
@@ -1,3 +0,0 @@
-I"�<p>In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.<br />
-My current solution is using AP to forward all SSL traffic to a proxy, <a href="https://www.charlesproxy.com/">charles proxy</a> is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.</p>
-:ET
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
index 227bfad..7a68f5a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,10 +1,4 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
 
-gem 'jekyll'
-
-group :jekyll_plugins do
-	gem 'jekyll-paginate'
-    gem 'jekyll-gist'
-    gem 'jemoji'
-    gem 'jekyll-sitemap'
-end
+# gem "github-pages", group: :jekyll_plugins
+gemspec
diff --git a/Gemfile.lock b/Gemfile.lock
index df7faf2..51d2b5a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,48 +1,56 @@
+PATH
+  remote: .
+  specs:
+    jekyll-text-theme (2.2.6)
+      jekyll (>= 3.6, < 5.0)
+      jekyll-feed (~> 0.1)
+      jekyll-paginate (~> 1.1)
+      jekyll-sitemap (~> 1.0)
+      jemoji (~> 0.8)
+
 GEM
   remote: https://rubygems.org/
   specs:
-    activesupport (6.0.3.3)
+    activesupport (6.1.4.1)
       concurrent-ruby (~> 1.0, >= 1.0.2)
-      i18n (>= 0.7, < 2)
-      minitest (~> 5.1)
-      tzinfo (~> 1.1)
-      zeitwerk (~> 2.2, >= 2.2.2)
+      i18n (>= 1.6, < 2)
+      minitest (>= 5.1)
+      tzinfo (~> 2.0)
+      zeitwerk (~> 2.3)
     addressable (2.8.0)
       public_suffix (>= 2.0.2, < 5.0)
     colorator (1.1.0)
-    concurrent-ruby (1.1.7)
-    em-websocket (0.5.1)
+    concurrent-ruby (1.1.9)
+    em-websocket (0.5.2)
       eventmachine (>= 0.12.9)
       http_parser.rb (~> 0.6.0)
     eventmachine (1.2.7)
-    faraday (1.0.1)
-      multipart-post (>= 1.2, < 3)
-    ffi (1.13.1)
+    ffi (1.15.4)
     forwardable-extended (2.6.0)
     gemoji (3.0.1)
     html-pipeline (2.14.0)
       activesupport (>= 2)
       nokogiri (>= 1.4)
     http_parser.rb (0.6.0)
-    i18n (1.8.5)
+    i18n (1.8.10)
       concurrent-ruby (~> 1.0)
-    jekyll (4.1.1)
+    jekyll (4.2.1)
       addressable (~> 2.4)
       colorator (~> 1.0)
       em-websocket (~> 0.5)
       i18n (~> 1.0)
       jekyll-sass-converter (~> 2.0)
       jekyll-watch (~> 2.0)
-      kramdown (~> 2.1)
+      kramdown (~> 2.3)
       kramdown-parser-gfm (~> 1.0)
       liquid (~> 4.0)
       mercenary (~> 0.4.0)
       pathutil (~> 0.9)
       rouge (~> 3.0)
       safe_yaml (~> 1.0)
-      terminal-table (~> 1.8)
-    jekyll-gist (1.5.0)
-      octokit (~> 4.2)
+      terminal-table (~> 2.0)
+    jekyll-feed (0.15.1)
+      jekyll (>= 3.7, < 5.0)
     jekyll-paginate (1.1.0)
     jekyll-sass-converter (2.1.0)
       sassc (> 2.0.1, < 3.0)
@@ -59,51 +67,42 @@ GEM
     kramdown-parser-gfm (1.1.0)
       kramdown (~> 2.0)
     liquid (4.0.3)
-    listen (3.2.1)
+    listen (3.7.0)
       rb-fsevent (~> 0.10, >= 0.10.3)
       rb-inotify (~> 0.9, >= 0.9.10)
     mercenary (0.4.0)
     mini_portile2 (2.6.1)
-    minitest (5.14.2)
-    multipart-post (2.1.1)
+    minitest (5.14.4)
     nokogiri (1.12.5)
       mini_portile2 (~> 2.6.1)
       racc (~> 1.4)
-    octokit (4.18.0)
-      faraday (>= 0.9)
-      sawyer (~> 0.8.0, >= 0.5.3)
     pathutil (0.16.2)
       forwardable-extended (~> 2.6)
     public_suffix (4.0.6)
-    racc (1.5.2)
-    rb-fsevent (0.10.4)
+    racc (1.6.0)
+    rake (10.5.0)
+    rb-fsevent (0.11.0)
     rb-inotify (0.10.1)
       ffi (~> 1.0)
     rexml (3.2.5)
-    rouge (3.23.0)
+    rouge (3.26.1)
     safe_yaml (1.0.5)
     sassc (2.4.0)
       ffi (~> 1.9)
-    sawyer (0.8.2)
-      addressable (>= 2.3.5)
-      faraday (> 0.8, < 2.0)
-    terminal-table (1.8.0)
+    terminal-table (2.0.0)
       unicode-display_width (~> 1.1, >= 1.1.1)
-    thread_safe (0.3.6)
-    tzinfo (1.2.7)
-      thread_safe (~> 0.1)
-    unicode-display_width (1.7.0)
-    zeitwerk (2.4.0)
+    tzinfo (2.0.4)
+      concurrent-ruby (~> 1.0)
+    unicode-display_width (1.8.0)
+    zeitwerk (2.5.1)
 
 PLATFORMS
   ruby
 
 DEPENDENCIES
-  jekyll
-  jekyll-gist
-  jekyll-paginate
-  jekyll-sitemap
-  jemoji
+  bundler
+  jekyll-text-theme!
+  rake (~> 10.0)
 
 BUNDLED WITH
    2.1.4
diff --git a/_config.yml b/_config.yml
index 550d490..1f26924 100644
--- a/_config.yml
+++ b/_config.yml
@@ -4,35 +4,224 @@
 # which you are expected to set up once and rarely need to edit after that.
 # For technical reasons, this file is *NOT* reloaded automatically when you use
 # 'jekyll serve'. If you change this file, please restart the server process.
+#
+# ,--------.      ,--.   ,--. ,--.
+# '--.  .--',---.  \  `.'  /,-'  '-.
+#    |  |  | .-. :  .'    \ '-.  .-'
+#    |  |  \   --. /  .'.  \  |  |
+#    `--'   `----''--'   '--' `--'
 
-# Site settings
-title: Stop Talking, Start Doing
-author: Pengzhan Hao
-avatar: "/static/avatar.jpg"
-email: haopengzhan@gmail.com 
-description: > # this means to ignore newlines until "baseurl:"
+
+
+
+## => Site Settings
+##############################
+text_skin: default # "default" (default), "dark", "forest", "ocean", "chocolate", "orange"
+highlight_theme: default # "default" (default), "tomorrow", "tomorrow-night", "tomorrow-night-eighties", "tomorrow-night-blue", "tomorrow-night-bright"
+url     : "https://codersherlock.github.com/"  
+baseurl : ""
+title   : Stop Talking, Start Doing
+description: > # this means to ignore newlines until "Language & timezone"
     My personal blog, with some boring research staff and some tricks I was fancy to.
     I'll try my best to make this blog fun and useful. Not just a place I complain about
     all happens in my Lab.
-baseurl: "" # the subpath of your site, e.g. /blog
-url: "https://codersherlock.github.com/" # the base hostname & protocol for your site
-# twitter_username: haopengzhan
-github_username:  codersherlock
-disqus_shortname: codersherlockblog
 
-permalink: /archivers/:title
-gems:
-    - jekyll-paginate
-    - jekyll-gist
-    - jemoji
-    - jekyll-sitemap
-# Build settings
-paginate: 5
-paginate_path: "page:num"
 
-highlighter: rouge
-markdown: kramdown
+## => Language and Timezone
+##############################
+lang: en
+timezone: America/New_York
 
-kramdown:
-    input: GFM
-    syntax_highlighter: rouge
+
+## => Author and Social
+##############################
+author:
+  type      : # "person" (default), "organization"
+  name      : Pengzhan Hao
+  url       :
+  avatar    : "/static/avatar.jpg"
+  bio       : 
+  email     : haopengzhan@gmail.com
+  facebook  : # "user_name" the last part of your profile url, e.g. https://www.facebook.com/user_name
+  twitter   : # "user_name" the last part of your profile url, e.g. https://twitter.com/user_name
+  weibo     : # "user_id"   the last part of your profile url, e.g. https://www.weibo.com/user_id/profile?...
+  googleplus: # "user_id"   the last part of your profile url, e.g. https://plus.google.com/u/0/user_id
+  telegram  : # "user_name" the last part of your profile url, e.g. https://t.me/user_name
+  medium    : # "user_name" the last part of your profile url, e.g. https://medium.com/user_name
+  zhihu     : # "user_name" the last part of your profile url, e.g. https://www.zhihu.com/people/user_name
+  douban    : # "user_name" the last part of your profile url, e.g. https://www.douban.com/people/user_name
+  linkedin  : # "user_name" the last part of your profile url, e.g. https://www.linkedin.com/in/user_name
+  github    : codersherlock
+  npm       : # "user_name" the last part of your profile url, e.g. https://www.npmjs.com/~user_name
+
+
+## => GitHub Repository (if the site is hosted by GitHub)
+##############################
+repository: CoderSherlock/CoderSherlock.github.io
+repository_tree: master
+
+
+## => Paths
+##############################
+paths:
+  root    : # title link url, "/" (default)
+  home    : # home layout url, "/" (default)
+  archive : # "/archive.html" (default)
+  rss     : # "/feed.xml" (default)
+
+
+## => Post
+##############################
+## excerpt
+excerpt_separator: <!--more-->
+
+## license
+license: # CC-BY-NC-4.0 # "CC-BY-4.0", "CC-BY-SA-4.0", "CC-BY-NC-4.0", "CC-BY-ND-4.0"
+
+## TOC
+toc:
+  selectors: # "h1,h2,h3" (default)
+
+
+## => Markdown Enhancements
+##############################
+## Mathjax
+mathjax: # false (default), true
+mathjax_autoNumber: # false (default), true
+
+## Mermaid
+mermaid: # false (default), true
+
+## Chart
+chart: # false (default), true
+
+
+## => Paginate
+##############################
+paginate: 8
+paginate_path: /page:num # don't change this unless for special need
+
+
+## => Sources
+##############################
+sources: # bootcdn (default), unpkg
+
+
+## => Sharing
+##############################
+sharing:
+  provider: false # false (default), "addtoany", "addthis", "custom"
+
+  ## AddThis
+  addthis:
+    id: # AddThis pubid, e.g. ra-5xxxxxxxxxxx
+
+
+## => Comments
+##############################
+comments:
+  provider: disqus # false (default), "disqus", "gitalk", "valine", "custom"
+
+  ## Disqus
+  disqus:
+    shortname: codersherlockblog # the Disqus shortname for the site
+
+  ## Gitalk
+  # please refer to https://github.com/gitalk/gitalk for more info.
+  gitalk:
+    clientID    : # GitHub Application Client ID
+    clientSecret: # GitHub Application Client Secret
+    repository  : # GitHub repo
+    owner       : # GitHub repo owner
+    admin: # GitHub repo owner and collaborators, only these guys can initialize GitHub issues, IT IS A LIST.
+      # - your GitHub Id
+
+  ## Valine
+  # please refer to https://valine.js.org/en/ for more info.
+  valine:
+    app_id      : # LeanCloud App id
+    app_key     : # LeanCloud App key
+    placeholder : # Prompt information
+    visitor     : # false (default)
+    meta        : # "[nick, mail, link]" (default) nickname, E-mail, Personal-site
+
+
+## => Pageview
+##############################
+pageview:
+  provider: false # false (default), "leancloud", "custom"
+
+  ## Leancloud
+  leancloud:
+    app_id    : # LeanCloud App id
+    app_key   : # LeanCloud App key
+    app_class : # LeanCloud App class
+
+
+## => Search
+##############################
+search:
+  provider: default # "default" (default), false, "google", "custom"
+
+  ## Google Custom Search Engine
+  google:
+    custom_search_engine_id: # Google Custom Search Engine ID
+
+
+## => Analytics
+##############################
+analytics:
+  provider: google # false (default), "google", "custom"
+
+  ## Google Analytics
+  google:
+    tracking_id : UA-82637164-1 # Google Analytics id for the site
+    anonymize_ip: false # Anonymize IP tracking for Analytics
+
+
+## => Build
+##############################
+markdown    : kramdown
+highlighter : rouge
+permalink   : /posts/:title
+
+exclude:
+  - CHANGELOG.md
+  - HOW_TO_RELEASE.md
+  - Gemfile
+  - Gemfile.lock
+  - LICENSE
+  - README-*.md
+  - README.md
+  - gulpfile.js
+  - jekyll-text-theme.gemspec
+  - package-lock.json
+  - package.json
+  - /docs
+  - /node_modules
+  - /screenshots
+  - /test
+  - /vendor
+
+defaults:
+  - scope:
+      path: ""
+      type: posts
+    values:
+      layout: article
+      sharing: true
+      license: true
+      aside:
+        toc: true
+      show_edit_on_github: true
+      show_subscribe: true
+      pageview: true
+
+
+## => Plugins
+##############################
+plugins:
+  - jekyll-feed
+  - jekyll-paginate
+  - jekyll-sitemap
+  - jemoji
diff --git a/_config.yml.old b/_config.yml.old
new file mode 100644
index 0000000..74ddd4e
--- /dev/null
+++ b/_config.yml.old
@@ -0,0 +1,38 @@
+# Welcome to Jekyll!
+#
+# This config file is meant for settings that affect your whole blog, values
+# which you are expected to set up once and rarely need to edit after that.
+# For technical reasons, this file is *NOT* reloaded automatically when you use
+# 'jekyll serve'. If you change this file, please restart the server process.
+
+# Site settings
+title: Stop Talking, Start Doing
+author: Pengzhan Hao
+avatar: "/static/avatar.jpg"
+email: haopengzhan@gmail.com 
+description: > # this means to ignore newlines until "baseurl:"
+    My personal blog, with some boring research staff and some tricks I was fancy to.
+    I'll try my best to make this blog fun and useful. Not just a place I complain about
+    all happens in my Lab.
+baseurl: "" # the subpath of your site, e.g. /blog
+url: "https://codersherlock.github.com/" # the base hostname & protocol for your site
+github_username:  codersherlock
+disqus_shortname: codersherlockblog
+
+permalink: /archivers/:title
+gems:
+    - jekyll-paginate
+    - jekyll-gist
+    - jemoji
+    - jekyll-sitemap
+# Build settings
+paginate: 5
+paginate_path: "page:num"
+
+highlighter: rouge
+markdown: kramdown
+
+kramdown:
+    input: GFM
+    syntax_highlighter: rouge
+
diff --git a/_data/authors.yml b/_data/authors.yml
new file mode 100644
index 0000000..e69de29
diff --git a/_data/licenses.yml b/_data/licenses.yml
new file mode 100644
index 0000000..6729af5
--- /dev/null
+++ b/_data/licenses.yml
@@ -0,0 +1,16 @@
+CC-BY-4.0:
+  name: Attribution 4.0 International
+  url: https://creativecommons.org/licenses/by/4.0/
+  image: https://i.creativecommons.org/l/by/4.0/88x31.png
+CC-BY-SA-4.0:
+  name: Attribution-ShareAlike 4.0 International
+  url: https://creativecommons.org/licenses/by-sa/4.0/
+  image: https://i.creativecommons.org/l/by-sa/4.0/88x31.png
+CC-BY-NC-4.0:
+  name: Attribution-NonCommercial 4.0 International
+  url: https://creativecommons.org/licenses/by-nc/4.0/
+  image: https://i.creativecommons.org/l/by-nc/4.0/88x31.png
+CC-BY-ND-4.0:
+  name: Attribution-NoDerivatives 4.0 International
+  url: https://creativecommons.org/licenses/by-nd/4.0/
+  image: https://i.creativecommons.org/l/by-nd/4.0/88x31.png
diff --git a/_data/locale.yml b/_data/locale.yml
new file mode 100644
index 0000000..558fbfd
--- /dev/null
+++ b/_data/locale.yml
@@ -0,0 +1,147 @@
+# @start locale config
+## => English
+########################
+en: &EN
+  SUBSCRIBE               : "Subscribe"
+  READMORE                : "Read more"
+  SEARCH                  : "Search"
+  CANCEL                  : "Cancel"
+  VIEWS                   : "views"
+  LAST_UPDATED            : "Last updated"
+  PREVIOUS                : "PREVIOUS"
+  NEXT                    : "NEXT"
+  ARTICLE_DATE_FORMAT     : "%b %d, %Y"
+  ARTICLE_LIST_DATE_FORMAT: "%b %d"
+  STATISTICS              : "[POST_COUNT] post articles, [PAGE_COUNT] pages."
+  LICENSE_ANNOUNCE        : "This work is licensed under a [LICENSE] license."
+  POST_ON_GITHUB          : "Edit on Github"
+  FOLLOW_ME               : "Follow me on [NAME]."
+  FOLLOW_US               : "Follow us on [NAME]."
+  EMAIL_ME                : "Send me an Email."
+  EMAIL_US                : "Send us an Email."
+  COPYRIGHT_DATES         : "2021"
+
+en-GB:
+  <<: *EN
+en-US:
+  <<: *EN
+en-CA:
+  <<: *EN
+en-AU:
+  <<: *EN
+
+## => Simplified Chinese
+########################
+zh-Hans: &ZH_HANS
+  SUBSCRIBE               : "订阅"
+  READMORE                : "阅读更多"
+  SEARCH                  : "搜索"
+  CANCEL                  : "取消"
+  VIEWS                   : "阅读"
+  LAST_UPDATED            : "更新于"
+  PREVIOUS                : "上篇"
+  NEXT                    : "下篇"
+  ARTICLE_DATE_FORMAT     : "%Y年 %m月%d日"
+  ARTICLE_LIST_DATE_FORMAT: "%m月%d日"
+  STATISTICS              : "共计 [POST_COUNT] 篇文章，[PAGE_COUNT] 页。"
+  LICENSE_ANNOUNCE        : "本文遵守 [LICENSE] 许可协议。"
+  POST_ON_GITHUB          : "在 Github 上修改"
+  FOLLOW_ME               : "在 [NAME] 上关注我。"
+  FOLLOW_US               : "在 [NAME] 上关注我们。"
+  EMAIL_ME                : "给我发邮件。"
+  EMAIL_US                : "给我们发邮件。"
+  COPYRIGHT_DATES         : "2021"
+
+zh:
+  <<: *ZH_HANS
+zh-CN:
+  <<: *ZH_HANS
+zh-SG:
+  <<: *ZH_HANS
+
+## => Traditional Chinese
+########################
+zh-Hant: &ZH_HANT
+  SUBSCRIBE               : "訂閱"
+  READMORE                : "閱讀更多"
+  SEARCH                  : "搜索"
+  CANCEL                  : "取消"
+  VIEWS                   : "閱讀"
+  LAST_UPDATED            : "更新於"
+  PREVIOUS                : "上篇"
+  NEXT                    : "下篇"
+  ARTICLE_DATE_FORMAT     : "%Y年 %m月%d日"
+  ARTICLE_LIST_DATE_FORMAT: "%m月%d日"
+  STATISTICS              : "共計 [POST_COUNT] 篇文章，[PAGE_COUNT] 頁。"
+  LICENSE_ANNOUNCE        : "本文遵守 [LICENSE] 許可協議。"
+  POST_ON_GITHUB          : "在 Github 上修改"
+  FOLLOW_ME               : "在 [NAME] 上關注我。"
+  FOLLOW_US               : "在 [NAME] 上關注我們。"
+  EMAIL_ME                : "給我發郵件。"
+  EMAIL_US                : "給我們發郵件。"
+  COPYRIGHT_DATES         : "2021"
+
+zh-TW:
+  <<: *ZH_HANT
+zh-HK:
+  <<: *ZH_HANT
+
+## => Korean
+########################
+ko: &KO
+  SUBSCRIBE               : "구독하기"
+  READMORE                : "더보기"
+  SEARCH                  : "검색"
+  CANCEL                  : "취소"
+  VIEWS                   : "조회"
+  LAST_UPDATED            : "마지막 수정"
+  PREVIOUS                : "이전"
+  NEXT                    : "다음"
+  ARTICLE_DATE_FORMAT     : "%Y년 %m월 %d일"
+  ARTICLE_LIST_DATE_FORMAT: "%m월 %d일"
+  STATISTICS              : "전체 글 [POST_COUNT]개, [PAGE_COUNT] 페이지"
+  LICENSE_ANNOUNCE        : "이 글의 저작권은 [LICENSE] 라이센스를 따릅니다."
+  POST_ON_GITHUB          : "Github에서 확인하기"
+  FOLLOW_ME               : "[NAME]에서 팔로우하기"
+  FOLLOW_US               : "[NAME]에서 팔로우하기"
+  EMAIL_ME                : "이메일 보내기"
+  EMAIL_US                : "이메일 보내기"
+  COPYRIGHT_DATES         : "2021"
+
+ko-KR:
+  <<: *KO
+
+## => French
+########################
+fr: &FR
+  SUBSCRIBE               : "S'abonner"
+  READMORE                : "Plus"
+  SEARCH                  : "Recherche"
+  CANCEL                  : "Annuler"
+  VIEWS                   : "vues"
+  LAST_UPDATED            : "Dernière modification"
+  PREVIOUS                : "PRÉCÉDENT"
+  NEXT                    : "SUIVANT"
+  ARTICLE_DATE_FORMAT     : "%d %b, %Y"
+  ARTICLE_LIST_DATE_FORMAT: "%d %b"
+  STATISTICS              : "[POST_COUNT] articles, [PAGE_COUNT] pages."
+  LICENSE_ANNOUNCE        : "Ce travail est sous licence [LICENSE]."
+  POST_ON_GITHUB          : "Modifier sur Github"
+  FOLLOW_ME               : "Suivez-moi sur [NAME]."
+  FOLLOW_US               : "Suivez-nous sur [NAME]."
+  EMAIL_ME                : "Envoyez-moi un courriel."
+  EMAIL_US                : "Envoyez-nous un courriel"
+  COPYRIGHT_DATES         : "2021"
+  DONATE                  : "Faites un don de [NAME]."
+
+fr-BE:
+  <<: *FR
+fr-CA:
+  <<: *FR
+fr-CH:
+  <<: *FR
+fr-FR:
+  <<: *FR
+fr-LU:
+  <<: *FR
+# @end locale config
diff --git a/_data/navigation.yml b/_data/navigation.yml
new file mode 100644
index 0000000..9a2b8a9
--- /dev/null
+++ b/_data/navigation.yml
@@ -0,0 +1,50 @@
+header:
+  - titles:
+      # @start locale config
+      en      : &EN       Archive
+      en-GB   : *EN
+      en-US   : *EN
+      en-CA   : *EN
+      en-AU   : *EN
+      zh-Hans : &ZH_HANS  归档
+      zh      : *ZH_HANS
+      zh-CN   : *ZH_HANS
+      zh-SG   : *ZH_HANS
+      zh-Hant : &ZH_HANT  歸檔
+      zh-TW   : *ZH_HANT
+      zh-HK   : *ZH_HANT
+      ko      : &KO       아카이브
+      ko-KR   : *KO
+      fr      : &FR       Archives
+      fr-BE   : *FR
+      fr-CA   : *FR
+      fr-CH   : *FR
+      fr-FR   : *FR
+      fr-LU   : *FR
+      # @end locale config
+    url: /archive.html
+
+  - titles:
+      # @start locale config
+      en      : &EN       About
+      en-GB   : *EN
+      en-US   : *EN
+      en-CA   : *EN
+      en-AU   : *EN
+      zh-Hans : &ZH_HANS  关于
+      zh      : *ZH_HANS
+      zh-CN   : *ZH_HANS
+      zh-SG   : *ZH_HANS
+      zh-Hant : &ZH_HANT  關於
+      zh-TW   : *ZH_HANT
+      zh-HK   : *ZH_HANT
+      ko      : &KO       소개
+      ko-KR   : *KO
+      fr      : &FR       À propos
+      fr-BE   : *FR
+      fr-CA   : *FR
+      fr-CH   : *FR
+      fr-FR   : *FR
+      fr-LU   : *FR
+      # @end locale config
+    url: /about.html
diff --git a/_data/variables.yml b/_data/variables.yml
new file mode 100644
index 0000000..43aa3aa
--- /dev/null
+++ b/_data/variables.yml
@@ -0,0 +1,64 @@
+default:
+  text_skin: default
+  highlight_theme: default
+  lang: en
+  paths:
+    root: /
+    home: /
+    archive:  /archive.html
+    rss:  /feed.xml
+  mathjax: false
+  mathjax_autoNumber: false
+  mermaid: false
+  chart: false
+  toc:
+    selectors: 'h1,h2,h3'
+  sources: bootcdn
+
+  page:
+    mode: normal
+    type: webpage
+    article_header:
+      align: left
+      theme: light
+    articles:
+      show_cover: true
+      show_excerpt: false
+      show_readmore: false
+      show_info: false
+    show_title: true
+    show_edit_on_github: false
+    show_date: true
+    show_tags: true
+    show_author_profile: false
+    show_subscribe: false
+    full_width: false
+    sharing: false
+    comment: true
+    license: false
+    pageview: false
+    search: default
+
+sources:
+  bootcdn:
+    font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css'
+    jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js'
+    leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js'
+    chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js'
+    gitalk:
+      js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js'
+      css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+    valine: 'https://unpkg.com/valine/dist/Valine.min.js' # bootcdn not available
+    mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML'
+    mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+  unpkg:
+    font_awesome: 'https://use.fontawesome.com/releases/v5.15.1/css/all.css'
+    jquery: 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js'
+    leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js'
+    chart: 'https://unpkg.com/chart.js@2.7.2/dist/Chart.min.js'
+    gitalk:
+      js: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.min.js'
+      css: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.css'
+    valine: 'https//unpkg.com/valine/dist/Valine.min.js'
+    mathjax: 'https://unpkg.com/mathjax@2.7.4/unpacked/MathJax.js?config=TeX-MML-AM_CHTML'
+    mermaid: 'https://unpkg.com/mermaid@8.0.0-rc.8/dist/mermaid.min.js'
diff --git a/_includes/_site/comment.html b/_includes/_site/comment.html
deleted file mode 100644
index 8536de7..0000000
--- a/_includes/_site/comment.html
+++ /dev/null
@@ -1,36 +0,0 @@
-{% if page.nocomments %}
-{% else %}
-{% if site.disqus_shortname %}
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = '{{ site.disqus_shortname }}'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-{% endif %}
-{% if site.duoshuo_shortname %}
-<div class="post-comments">
-    <!-- 多说评论框 start -->
-    <div class="ds-thread" data-thread-key="{{ page.id }}" data-title="{{ page.title }}" data-url="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}"></div>
-    <!-- 多说评论框 end -->
-    <!-- 多说公共JS代码 start (一个网页只需插入一次) -->
-    <script type="text/javascript">
-    var duoshuoQuery = {short_name:"{{ site.duoshuo_shortname }}"};
-      (function() {
-      	var ds = document.createElement('script');
-      	ds.type = 'text/javascript';ds.async = true;
-      	ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
-      	ds.charset = 'UTF-8';
-      	(document.getElementsByTagName('head')[0] 
-      	 || document.getElementsByTagName('body')[0]).appendChild(ds);
-      })();
-      </script>
-    <!-- 多说公共JS代码 end -->
-</div>
-{% endif %}
-{% endif %}
\ No newline at end of file
diff --git a/_includes/_site/footer.html b/_includes/_site/footer.html
deleted file mode 100644
index c400e8f..0000000
--- a/_includes/_site/footer.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<footer class="footer">
-<div class="wrapper">
-&copy; 2016 {{ site.author }}
-</div>
-</footer>
-
-<script src="{{ "/js/easybook.js" | prepend: site.baseurl }}"></script>
\ No newline at end of file
diff --git a/_includes/_site/head.html b/_includes/_site/head.html
deleted file mode 100644
index ca89ea8..0000000
--- a/_includes/_site/head.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>{% if page.title %}{{ page.title }} « {{ site.title }}{% else %}{{ site.title }}{% endif %}</title>
-  <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
-
-  <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
-  <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
-  <link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-  (adsbygoogle = window.adsbygoogle || []).push({
-          google_ad_client: "ca-pub-6651321038908478",
-              enable_page_level_ads: true
-                    });
-  </script>
-</head>
diff --git a/_includes/_site/header.html b/_includes/_site/header.html
deleted file mode 100644
index 78de311..0000000
--- a/_includes/_site/header.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
-    <nav class="site-nav">
-      {% for page in site.pages %}
-        {% if page.title and page.public %}
-        <a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
-        {% endif %}
-      {% endfor %}
-    </nav>
-  </div>
-</header>
\ No newline at end of file
diff --git a/_includes/_site/icon-github.html b/_includes/_site/icon-github.html
deleted file mode 100644
index e501a16..0000000
--- a/_includes/_site/icon-github.html
+++ /dev/null
@@ -1 +0,0 @@
-<a href="https://github.com/{{ include.username }}"><span class="icon icon--github">{% include icon-github.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/_includes/_site/icon-github.svg b/_includes/_site/icon-github.svg
deleted file mode 100644
index 4422c4f..0000000
--- a/_includes/_site/icon-github.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg viewBox="0 0 16 16"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg>
diff --git a/_includes/_site/icon-twitter.html b/_includes/_site/icon-twitter.html
deleted file mode 100644
index e623dbd..0000000
--- a/_includes/_site/icon-twitter.html
+++ /dev/null
@@ -1 +0,0 @@
-<a href="https://twitter.com/{{ include.username }}"><span class="icon icon--twitter">{% include icon-twitter.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/_includes/_site/icon-twitter.svg b/_includes/_site/icon-twitter.svg
deleted file mode 100644
index dcf660e..0000000
--- a/_includes/_site/icon-twitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg viewBox="0 0 16 16"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg>
diff --git a/_includes/_site/sidebar.html b/_includes/_site/sidebar.html
deleted file mode 100644
index c7c729f..0000000
--- a/_includes/_site/sidebar.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="col-box col-box-author">
-  <img class="avatar" src="{{ site.avatar }}" alt="{{ site.author }}">
-  <div class="col-box-title name">{{ site.author }}</div>
-  <p>{{ site.profile }}</p>
-  <p class="contact">
-    {% if site.github_username %}
-    <a href="https://github.com/{{ site.github_username }}">GitHub</a>
-    {% endif %}
-    {% if site.twitter_username %}
-    <a href="https://twitter.com/{{ site.twitter_username }}">Twitter</a>
-    {% endif %}
-    {% if site.email %}
-    <a href="mailto:{{ site.email }}">Email</a>
-    {% endif %}
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    {% for post in site.posts limit:5 %}
-      <li><a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a></li>
-    {% endfor %}
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">TOC</div>
-</div>
\ No newline at end of file
diff --git a/_includes/analytics-providers/custom.html b/_includes/analytics-providers/custom.html
new file mode 100644
index 0000000..58448f7
--- /dev/null
+++ b/_includes/analytics-providers/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom analytics snippet -->
+
+<!-- end custom analytics snippet -->
diff --git a/_includes/analytics-providers/google.html b/_includes/analytics-providers/google.html
new file mode 100644
index 0000000..5fbd17d
--- /dev/null
+++ b/_includes/analytics-providers/google.html
@@ -0,0 +1,14 @@
+{%- if site.analytics.google.tracking_id -%}
+	<!-- Global site tag (gtag.js) - Google Analytics -->
+	<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.analytics.google.tracking_id }}"></script>
+	<script>
+		window.dataLayer = window.dataLayer || [];
+		function gtag(){dataLayer.push(arguments);}
+		gtag('js', new Date());
+
+		gtag('config', '{{ site.analytics.google.tracking_id }}');
+		{% if site.analytics.google.anonymize_ip == true %}
+			gtag('config', '{{ site.analytics.google.tracking_id }}', { 'anonymize_ip': true });
+		{% endif %}
+	</script>
+{%- endif -%}
diff --git a/_includes/analytics.html b/_includes/analytics.html
new file mode 100644
index 0000000..46ba91d
--- /dev/null
+++ b/_includes/analytics.html
@@ -0,0 +1,7 @@
+{%- if jekyll.environment != 'development' -%}
+  {%- if site.analytics.provider == 'google' -%}
+    {%- include analytics-providers/google.html -%}
+  {%- elsif site.analytics.provider == 'custom' -%}
+    {%- include analytics-providers/custom.html -%}
+  {%- endif -%}
+{%- endif -%}
diff --git a/_includes/article-footer.html b/_includes/article-footer.html
new file mode 100644
index 0000000..33c3742
--- /dev/null
+++ b/_includes/article-footer.html
@@ -0,0 +1,55 @@
+{%- include snippets/assign.html
+  target=site.data.variables.default.page.show_author_profile
+  source0=layout.show_author_profile source1=page.show_author_profile -%}
+{%- assign _show_author_profile = __return -%}
+
+{%- include snippets/assign.html
+  target=site.data.variables.default.page.show_subscribe
+  source0=layout.show_subscribe source1=page.show_subscribe -%}
+{%- assign _show_subscribe = __return -%}
+
+{%- include snippets/assign.html
+  target=site.data.variables.default.page.license
+  source0=layout.license source1=page.license -%}
+{%- assign _license = __return -%}
+
+<footer class="article__footer">
+  {%- if page.modify_date -%}
+    {%- include snippets/get-locale-string.html key='ARTICLE_DATE_FORMAT' -%}
+    {%- assign _locale_date_format = __return -%}
+
+    {%- include snippets/get-locale-string.html key='LAST_UPDATED' -%}
+    {%- assign _locale_last_update = __return -%}
+    <span>{{ _locale_last_update }}
+      <time itemprop="dateModified" datetime="{{ page.modify_date | date_to_xmlschema }}">{{ page.modify_date | date: _locale_date_format }}</time>
+    </span>
+  {%- elsif page.date -%}
+    <meta itemprop="dateModified" content="{{ page.date | date_to_xmlschema }}">
+  {%- endif -%}
+
+  {%- include article/footer/custom.html -%}
+
+  {%- if _show_author_profile -%}
+    {%- if page.author -%}
+      {%- assign _author = site.data.authors[page.author] -%}
+    {%- else -%}
+      {%- assign _author = site.author -%}
+    {%- endif -%}
+    {%- include article/footer/author-profile.html author=_author -%}
+  {%- endif -%}
+
+  {%- if _show_subscribe -%}
+    <div class="article__subscribe">{%- include article/footer/subscribe.html -%}</div>
+  {%- endif -%}
+
+  {%- if _license != false -%}
+    {%- assign _data_license = site.data.licenses-%}
+    {%- if site.license -%}
+      {%- assign _license_data = _data_license[site.license] -%}
+    {%- endif -%}
+    {%- if _license != true -%}
+      {%- assign _license_data = _data_license[_license] -%}
+    {%- endif -%}
+    <div class="article__license">{%- include article/footer/license.html license=_license_data -%}</div>
+  {%- endif -%}
+</footer>
diff --git a/_includes/article-header.html b/_includes/article-header.html
new file mode 100644
index 0000000..748b24c
--- /dev/null
+++ b/_includes/article-header.html
@@ -0,0 +1,49 @@
+{%- include snippets/get-article-title.html article=include.article-%}
+{%- assign _article_title = __return -%}
+
+{%- if include.html != false -%}
+
+  {%- include snippets/assign.html
+    target=site.data.variables.default.page.show_title
+    source0=layout.show_title source1=include.article.show_title -%}
+  {%- assign _show_title = __return -%}
+
+  {%- include snippets/assign.html
+    target=site.data.variables.default.page.show_edit_on_github
+    source0=layout.show_edit_on_github source1=include.article.show_edit_on_github -%}
+  {%- assign _show_edit_on_github = __return -%}
+
+  {%- if _show_title or _show_edit_on_github -%}
+    <div class="article__header">
+      {%- if _show_title -%}
+        <header><h1>{{ _article_title }}</h1></header>
+      {%- endif -%}
+      {%- if _show_edit_on_github -%}
+        {%- if site.repository and site.repository_tree -%}
+          {%- include snippets/is_collection.html page=include.article -%}
+          {%- assign _is_article_collection = __return -%}
+          {%- include snippets/get-locale-string.html key='POST_ON_GITHUB' -%}
+          {%- assign _locale_post_on_github = __return -%}
+          {%- if _is_article_collection -%}
+            {%- include snippets/prepend-path.html path=include.article.path prepend_path=site.collections_dir -%}
+            {%- assign _article_path = __return -%}
+          {%- else -%}
+            {%- assign _article_path = include.article.path -%}
+          {%- endif -%}
+          {%- assign _github_path = site.repository | append: '/tree/' | append: site.repository_tree | append: '/' | append: _article_path | replace:'//','/' -%}
+          <span class="split-space">&nbsp;</span>
+          <a class="edit-on-github"
+            title="{{ _locale_post_on_github }}"
+            href="https://github.com/{{ _github_path }}">
+            <i class="far fa-edit"></i></a>
+        {%- endif -%}
+      {%- endif -%}
+    </div>
+  {%- else -%}
+    <header style="display:none;"><h1>{{ _article_title }}</h1></header>
+  {%- endif -%}
+{%- endif -%}
+
+{%- if include.semantic != false -%}
+  <meta itemprop="headline" content="{{ _article_title }}">
+{%- endif -%}
diff --git a/_includes/article-info.html b/_includes/article-info.html
new file mode 100644
index 0000000..c97fac9
--- /dev/null
+++ b/_includes/article-info.html
@@ -0,0 +1,96 @@
+{%- assign _author = site.data.authors[include.article.author] | default: site.author -%}
+
+{%- if include.html != false -%}
+
+  {%- include snippets/assign.html
+    target=site.data.variables.default.page.show_date
+    source0=layout.show_date source1=include.article.show_date -%}
+  {%- assign _show_date = __return -%}
+  {%- if _show_date and include.article.date -%}
+    {%- assign _show_date = true -%}
+  {%- else -%}
+    {%- assign _show_date = false -%}
+  {%- endif -%}
+
+  {%- include snippets/assign.html
+    target=site.data.variables.default.page.show_tags
+    source0=layout.show_tags source1=include.article.show_tags -%}
+  {%- assign _show_tags = __return -%}
+  {%- if _show_tags and include.article.tags[0] -%}
+    {%- assign _show_tags = true -%}
+  {%- else -%}
+    {%- assign _show_tags = false -%}
+  {%- endif -%}
+
+  {%- assign _show_author = include.article.author -%}
+
+  {%- include snippets/assign.html target=site.data.variables.default.page.pageview
+    source0=layout.pageview source1=page.pageview -%}
+  {%- assign _pageview = __return -%}
+  {%- if _pageview or include.show_pageview -%}
+    {%- assign _pageview = true -%}
+  {%- else -%}
+    {%- assign _pageview = false -%}
+  {%- endif -%}
+
+  {%- assign _paths_archive = site.paths.archive | default: site.data.variables.default.paths.archive -%}
+
+  {%- if _show_tags or _show_author or _show_date or _pageview -%}
+    <div class="article__info clearfix">
+      {%- if _show_tags -%}
+
+        <ul class="left-col menu">
+          {%- assign _tag_path = _paths_archive | append: '?tag=' -%}
+          {%- include snippets/prepend-baseurl.html path=_tag_path -%}
+
+          {%- for _tag in include.article.tags -%}
+            {%- assign _tag_path = __return -%}
+            {%- assign _tag_encode = _tag | strip | url_encode } -%}
+            <li>
+              <a class="button button--secondary button--pill button--sm"
+                href="{{ _tag_path | append: _tag_encode | replace: '//', '/' }}">{{ _tag }}</a>
+            </li>
+          {%- endfor -%}
+        </ul>
+      {%- endif -%}
+
+      {%- if _show_author or _show_date or _pageview -%}
+        <ul class="right-col menu">
+          {%- if _show_author  -%}
+            <li><i class="fas fa-user"></i> <span>{{ _author.name }}</span></li>
+          {%- endif -%}
+
+          {%- if _show_date -%}
+            <li>
+              {%- include snippets/get-locale-string.html key='ARTICLE_DATE_FORMAT' -%}
+              <i class="far fa-calendar-alt"></i> <span>{{ include.article.date | date: __return }}</span>
+            </li>
+          {%- endif -%}
+
+          {%- if _pageview -%}
+            {%- if site.pageview.provider -%}
+              {%- include snippets/get-locale-string.html key='VIEWS' -%}
+              {%- assign _locale_views = __return -%}
+              <li><i class="far fa-eye"></i> <span class="js-pageview" data-page-key="{{ include.article.key }}">0</span> {{ _locale_views }}</li>
+            {%- endif -%}
+          {%- endif -%}
+        </ul>
+      {%- endif -%}
+
+    </div>
+  {%- endif -%}
+{%- endif -%}
+
+
+{%- if include.semantic != false -%}
+  {%- if _author -%}
+    <meta itemprop="author" content="{{ _author.name }}"/>
+  {%- endif -%}
+  {%- if include.article.date -%}
+    <meta itemprop="datePublished" content="{{ include.article.date | date_to_xmlschema }}">
+  {%- endif -%}
+  {%- if include.article.tags[0] -%}
+    {%- assign _keywords = include.article.tags | join: ',' %}
+    <meta itemprop="keywords" content="{{ _keywords }}">
+  {%- endif -%}
+{%- endif -%}
diff --git a/_includes/article-list.html b/_includes/article-list.html
new file mode 100644
index 0000000..dfe0c85
--- /dev/null
+++ b/_includes/article-list.html
@@ -0,0 +1,144 @@
+{%- assign _excerpt_truncate = include.excerpt_truncate | default: 350 -%}
+
+{%- assign _excerpt_type = include.excerpt_type -%}
+
+{%- include snippets/get-locale-string.html key='READMORE' -%}
+{%- assign _locale_readmore = __return -%}
+
+{%- assign _sorted_list = include.articles -%}
+{%- if include.group_by == 'year' -%}
+  {%- assign _sorted_list = _sorted_list | sort: 'date' -%}
+{%- endif -%}
+{%- if include.reverse -%}
+  {%- assign _sorted_list = _sorted_list | reverse -%}
+{%- endif -%}
+
+{%- if include.type == 'item' -%}
+<div class="article-list items items--divided">
+{%- elsif include.type == 'brief' -%}
+<div class="article-list items">
+{%- elsif include.type == 'grid' -%}
+  {%- if include.size == 'sm' -%}
+  <div class="article-list grid grid--sm grid--p-3">
+  {%- else -%}
+  <div class="article-list grid grid--p-3">
+  {%- endif -%}
+{%- endif -%}
+
+  {%- for _article in _sorted_list -%}
+
+    {%- include snippets/prepend-baseurl.html path=_article.url -%}
+    {%- assign _article_url = __return -%}
+
+    {%- if _article.cover -%}
+      {%- include snippets/get-nav-url.html path=_article.cover -%}
+      {%- assign _article_cover = __return -%}
+    {%- endif -%}
+
+    {%- if include.type == 'item' -%}
+      {%- if include.article_type == 'BlogPosting' -%}
+        <article class="item" itemscope itemtype="http://schema.org/BlogPosting">
+      {%- else -%}
+        <article class="item">
+      {%- endif -%}
+        {%- if _article.cover and include.show_cover-%}
+          {%- include snippets/get-nav-url.html path=_article.cover -%}
+          {%- assign _article_cover = __return -%}
+          <div class="item__image">
+          {%- if include.cover_size == 'lg' -%}
+            <img class="image image--lg" src="{{ _article_cover }}" />
+          {%- elsif include.cover_size == 'sm' -%}
+            <img class="image image--sm" src="{{ _article_cover }}" />
+          {%- else -%}
+            <img class="image" src="{{ _article_cover }}" />
+          {%- endif -%}
+          </div>
+        {%- endif -%}
+        <div class="item__content">
+          <header><a href="{{ _article_url }}"><h2 itemprop="headline" class="item__header">{{ _article.title }}</h2></a></header>
+          <div class="item__description">
+            {%- if _article.excerpt and include.show_excerpt -%}
+              <div class="article__content" itemprop="description articleBody">
+                {%- if _excerpt_type == 'html' -%}
+                  {{ _article.excerpt }}
+                {%- else -%}
+                  {{ _article.excerpt | strip_html | strip | truncate: _excerpt_truncate }}
+                {%- endif -%}
+              </div>
+            {%- endif -%}
+            {%- if include.show_readmore -%}
+              <p><a href="{{ _article_url }}">{{ _locale_readmore }}</a></p>
+            {%- endif -%}
+          </div>
+          {%- if include.show_info -%}
+            {%- include snippets/assign.html target=site.data.variables.default.page.pageview
+              source0=_article.pageview -%}
+            {%- assign _show_pageview = __return -%}
+            {%- include article-info.html article=_article show_pageview=_show_pageview -%}
+          {%- endif -%}
+        </div>
+      </article>
+
+
+    {%- elsif include.type == 'brief' -%}
+      {%- assign _tags = '' -%}
+      {%- for _tag in _article.tags -%}
+        {%- assign _tag_encode = _tag | strip | url_encode -%}
+        {%- if forloop.last -%}
+          {%- assign _tags = _tags | append: _tag_encode -%}
+        {%- else -%}
+          {%- assign _tags = _tags | append: _tag_encode | append: ',' -%}
+        {%- endif -%}
+      {%- endfor -%}
+      {%- if include.group_by == 'year' -%}
+        {%- assign _currentdate = _article.date | date: '%Y' -%}
+        {%- if _currentdate != _date -%}
+          {%- unless forloop.first -%}</ul></section>{%- endunless -%}
+          <section><h2 class="article-list__group-header">{{ _currentdate }}</h2><ul class="items">
+          {%- assign _date = _currentdate -%}
+        {%- endif -%}
+      {%- endif -%}
+      {%- include snippets/get-locale-string.html key='ARTICLE_LIST_DATE_FORMAT' -%}
+      <li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="{{ _tags }}">
+        <div class="item__content">
+          {%- if include.show_info -%}
+            <span class="item__meta">{{ _article.date | date: __return }}</span>
+          {%- endif -%}
+          <a itemprop="headline" class="item__header" href="{{ _article_url }}">{{ _article.title }}</a></div>
+      </li>
+
+    {%- elsif include.type == 'grid' -%}
+      {%- if include.size == 'sm' -%}
+        <div class="cell cell--12 cell--md-4 cell--lg-3">
+          <div class="card card--flat">
+            {%- if _article.cover -%}
+              <div class="card__image">
+                <img class="image" src="{{ _article_cover }}" />
+                <div class="overlay overlay--bottom">
+                  <header>
+                    <a href="{{ _article_url }}"><h2 class="card__header">{{ _article.title }}</h2></a>
+                  </header>
+                </div>
+              </div>
+            {%- endif -%}
+            </div>
+        </div>
+      {%- else -%}
+
+        <div class="cell cell--12 cell--md-6 cell--lg-4">
+          <div class="card card--flat">
+            {%- if _article.cover -%}
+              <div class="card__image"><img src="{{ _article_cover }}" /></div>
+            {%- endif -%}
+              <div class="card__content">
+                <header>
+                  <a href="{{ _article_url }}"><h2 class="card__header">{{ _article.title }}</h2></a>
+                </header>
+              </div>
+          </div>
+        </div>
+      {%- endif -%}
+    {%- endif -%}
+  {%- endfor -%}
+
+</div>
diff --git a/_includes/article-section-navigator.html b/_includes/article-section-navigator.html
new file mode 100644
index 0000000..a88aaf9
--- /dev/null
+++ b/_includes/article-section-navigator.html
@@ -0,0 +1,54 @@
+{%- if page.sidebar.nav -%}
+  {%- assign _sidebar_nav = site.data.navigation[page.sidebar.nav] -%}
+  {%- if _sidebar_nav -%}
+    {%- assign _find_cur = false -%}
+    {%- assign _find_next = false -%}
+
+    {%- for _item in _sidebar_nav -%}
+      {%- if _find_next -%} {%- break -%} {%- endif -%}
+      {%- if _item.children -%}
+
+        {%- for _child in _item.children -%}
+          {%- include snippets/get-nav-url.html path=_child.url -%}
+          {%- assign _nav_url = __return -%}
+          {%- include snippets/get-nav-url.html path=page.url -%}
+          {%- assign _page_url = __return -%}
+
+          {%- if _nav_url == _page_url -%}
+            {%- assign _find_cur = true -%}
+          {%- elsif _find_cur and _find_next != true -%}
+            {%- assign _find_next = true -%}
+            {%- assign _next = _child -%}
+            {%- break -%}
+          {%- else -%}
+            {%- assign _previous = _child -%}
+          {%- endif -%}
+        {%- endfor -%}
+
+      {%- endif -%}
+    {%- endfor -%}
+  {%- endif -%}
+
+{%- else -%}
+  {%- assign _previous = page.previous -%}
+  {%- assign _next = page.next -%}
+{%- endif -%}
+
+{%- if _next or _previous -%}
+  <div class="article__section-navigator clearfix">
+    {%- if _previous -%}
+      {%- include snippets/prepend-baseurl.html path=_previous.url -%}
+      {%- assign _href = __return -%}
+      {%- include snippets/get-locale-string.html key='PREVIOUS' -%}
+      {%- assign _locale_previous = __return -%}
+      <div class="previous"><span>{{ _locale_previous }}</span><a href="{{ _href }}">{{ _previous.title }}</a></div>
+    {%- endif -%}
+    {%- if _next -%}
+      {%- include snippets/prepend-baseurl.html path=_next.url -%}
+      {%- assign _href = __return -%}
+      {%- include snippets/get-locale-string.html key='NEXT' -%}
+      {%- assign _locale_next = __return -%}
+      <div class="next"><span>{{ _locale_next }}</span><a href="{{ _href }}">{{ _next.title }}</a></div>
+    {%- endif -%}
+  </div>
+{%- endif -%}
diff --git a/_includes/article/footer/author-profile.html b/_includes/article/footer/author-profile.html
new file mode 100644
index 0000000..8b0d72d
--- /dev/null
+++ b/_includes/article/footer/author-profile.html
@@ -0,0 +1,47 @@
+{%- assign _author = include.author -%}
+
+{%- if _author.type == 'organization' -%}
+  {%- assign _author_itemtype = 'http://schema.org/Organization' -%}
+{%- else -%}
+  {%- assign _author_itemtype = 'http://schema.org/Person' -%}
+{%- endif -%}
+
+<div itemscope itemtype="{{ _author_itemtype }}" class="author-profile card card--flat item">
+  {%- if _author.avatar -%}
+    {%- if _author.url -%}
+    <a href="{{ _author.url }}" class="item__image">
+    {%- endif -%}
+      {%- include snippets/get-nav-url.html path=_author.avatar -%}
+      {%- assign _author_avatar = __return -%}
+      <img class="author-profile__avatar" itemprop="image" src="{{ _author_avatar }}" />
+    {%- if _author.url -%}
+    </a>
+    {%- endif -%}
+  {%- endif -%}
+
+
+    <div class="item__content">
+
+      {%- if _author.name -%}
+        <meta itemprop="name" content="{{ _author.name }}">
+        <p class="author-profile__name">
+          {%- if _author.url -%}
+            <meta itemprop="url" content="{{ _author.url }}">
+            <a href="{{ _author.url }}">
+          {%- endif -%}
+              {{ _author.name }}
+          {%- if _author.url -%}
+            </a>
+          {%- endif -%}
+        </p>
+      {%- endif -%}
+
+      {%- if _author.bio -%}
+        <p itemprop="description">{{ _author.bio }}</p>
+      {%- endif -%}
+      <div class="author-profile__links">
+        {%- include author-links.html author=_author -%}
+      </div>
+
+    </div>
+</div>
diff --git a/_includes/article/footer/custom.html b/_includes/article/footer/custom.html
new file mode 100644
index 0000000..edcd06d
--- /dev/null
+++ b/_includes/article/footer/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
diff --git a/_includes/article/footer/license.html b/_includes/article/footer/license.html
new file mode 100644
index 0000000..a2c1535
--- /dev/null
+++ b/_includes/article/footer/license.html
@@ -0,0 +1,14 @@
+{%- include snippets/get-locale-string.html key='LICENSE_ANNOUNCE' -%}
+{%- assign _license_announce = __return -%}
+
+{%- if include.license -%}
+
+  {%-assign _license_name = '<a itemprop="license" rel="license" href="[URL]">[NAME]</a>' | replace: "[URL]", include.license.url | replace: "[NAME]", include.license.name -%}
+  <div class="license">
+    <p>{{ _license_announce | replace: "[LICENSE]", _license_name }}
+      <a rel="license" href="{{ include.license.url }}">
+        <img alt="{{ include.license.name }}" src="{{ include.license.image }}" />
+      </a>
+    </p>
+  </div>
+{%- endif -%}
diff --git a/_includes/article/footer/subscribe.html b/_includes/article/footer/subscribe.html
new file mode 100644
index 0000000..cb9a169
--- /dev/null
+++ b/_includes/article/footer/subscribe.html
@@ -0,0 +1,6 @@
+{%- assign _paths_rss = site.paths.rss | default: site.data.variables.default.paths.rss -%}
+{%- include snippets/get-nav-url.html path=_paths_rss -%}
+{%- assign _paths_rss = __return -%}
+{%- include snippets/get-locale-string.html key='SUBSCRIBE' -%}
+{%- assign _locale_nav_subscribe = __return -%}
+<div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="{{ _paths_rss }}">{{ _locale_nav_subscribe }}</a></div>
diff --git a/_includes/article/top/custom.html b/_includes/article/top/custom.html
new file mode 100644
index 0000000..12f393d
--- /dev/null
+++ b/_includes/article/top/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
diff --git a/_includes/aside/toc.html b/_includes/aside/toc.html
new file mode 100644
index 0000000..1d19e6a
--- /dev/null
+++ b/_includes/aside/toc.html
@@ -0,0 +1 @@
+<div class="toc-aside js-toc-root"></div>
diff --git a/_includes/author-links.html b/_includes/author-links.html
new file mode 100644
index 0000000..5ddc78a
--- /dev/null
+++ b/_includes/author-links.html
@@ -0,0 +1,120 @@
+{%- assign _author = include.author -%}
+
+<div class="author-links">
+  <ul class="menu menu--nowrap menu--inline">
+
+    {%- if _author.url -%}
+      <link itemprop="url" href="{{ _author.url }}">
+    {%- endif -%}
+
+    {%- if _author.type == 'organization' -%}
+      {%- include snippets/get-locale-string.html key='EMAIL_US' -%}
+      {%- assign _locale_string_email = __return -%}
+      {%- include snippets/get-locale-string.html key='FOLLOW_US' -%}
+      {%- assign _locale_string_follow = __return -%}
+    {%- else -%}
+      {%- include snippets/get-locale-string.html key='EMAIL_ME' -%}
+      {%- assign _locale_string_email = __return -%}
+      {%- include snippets/get-locale-string.html key='FOLLOW_ME' -%}
+      {%- assign _locale_string_follow = __return -%}
+    {%- endif -%}
+
+    {%- include snippets/get-locale-string.html key='EMAIL_ME' -%}
+    {%- if _author.email -%}
+      <li title="{{ _locale_string_email }}">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:{{ _author.email }}" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a>
+    {%- endif -%}
+
+
+    {%- if _author.facebook -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Facebook' }}">
+        <a class="button button--circle facebook-button" itemprop="sameAs" href="https://www.facebook.com/{{ _author.facebook }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/facebook.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.twitter -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Twitter' }}">
+        <a class="button button--circle twitter-button" itemprop="sameAs" href="https://twitter.com/{{ _author.twitter }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/twitter.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.weibo -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Weibo' }}">
+        <a class="button button--circle weibo-button" itemprop="sameAs" href="https://weibo.com/{{ _author.weibo }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/weibo.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.googleplus -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Google+' }}">
+        <a class="button button--circle googlepluse-button" itemprop="sameAs" href="https://plus.google.com/u/0/{{ _author.googleplus }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/googleplus.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.telegram -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Telegram' }}">
+        <a class="button button--circle telegram-button" itemprop="sameAs" href="https://t.me/{{ _author.telegram }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/telegram.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.medium -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Medium' }}">
+        <a class="button button--circle medium-button" itemprop="sameAs" href="https://medium.com/{{ _author.medium }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/medium.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.zhihu -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Zhihu' }}">
+        <a class="button button--circle zhihu-button" itemprop="sameAs" href="https://www.zhihu.com/people/{{ _author.zhihu }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/zhihu.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.douban -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Douban' }}">
+        <a class="button button--circle douban-button" itemprop="sameAs" href="https://www.douban.com/people/{{ _author.douban }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/douban.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.linkedin -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Linkedin' }}">
+        <a class="button button--circle linkedin-button" itemprop="sameAs" href="https://www.linkedin.com/in/{{ _author.linkedin }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/linkedin.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.github -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'Github' }}">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/{{ _author.github }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/github.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+    {%- if _author.npm -%}
+      <li title="{{ _locale_string_follow | replace: '[NAME]', 'npm' }}">
+        <a class="button button--circle npm-button" itemprop="sameAs" href="https://www.npmjs.com/~{{ _author.npm }}" target="_blank">
+          <div class="icon">{%- include svg/icon/social/npm.svg -%}</div>
+        </a>
+      </li>
+    {%- endif -%}
+
+  </ul>
+</div>
diff --git a/_includes/comment.html b/_includes/comment.html
deleted file mode 100644
index 8536de7..0000000
--- a/_includes/comment.html
+++ /dev/null
@@ -1,36 +0,0 @@
-{% if page.nocomments %}
-{% else %}
-{% if site.disqus_shortname %}
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = '{{ site.disqus_shortname }}'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-{% endif %}
-{% if site.duoshuo_shortname %}
-<div class="post-comments">
-    <!-- 多说评论框 start -->
-    <div class="ds-thread" data-thread-key="{{ page.id }}" data-title="{{ page.title }}" data-url="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}"></div>
-    <!-- 多说评论框 end -->
-    <!-- 多说公共JS代码 start (一个网页只需插入一次) -->
-    <script type="text/javascript">
-    var duoshuoQuery = {short_name:"{{ site.duoshuo_shortname }}"};
-      (function() {
-      	var ds = document.createElement('script');
-      	ds.type = 'text/javascript';ds.async = true;
-      	ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
-      	ds.charset = 'UTF-8';
-      	(document.getElementsByTagName('head')[0] 
-      	 || document.getElementsByTagName('body')[0]).appendChild(ds);
-      })();
-      </script>
-    <!-- 多说公共JS代码 end -->
-</div>
-{% endif %}
-{% endif %}
\ No newline at end of file
diff --git a/_includes/comments-providers/custom.html b/_includes/comments-providers/custom.html
new file mode 100644
index 0000000..600b9f7
--- /dev/null
+++ b/_includes/comments-providers/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom comments snippet -->
+
+<!-- end custom comments snippet -->
diff --git a/_includes/comments-providers/disqus.html b/_includes/comments-providers/disqus.html
new file mode 100644
index 0000000..4022306
--- /dev/null
+++ b/_includes/comments-providers/disqus.html
@@ -0,0 +1,22 @@
+{%- if page.key and
+  site.comments.disqus.shortname -%}
+
+  <div id="disqus_thread"></div>
+  <script>
+  /**
+  *  RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
+  *  LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/
+  var disqus_config = function () {
+    this.page.url = '{%- include snippets/page-url.html -%}';
+    this.page.identifier = '{{ page.key }}';
+  };
+  (function() { // DON'T EDIT BELOW THIS LINE
+    var d = document, s = d.createElement('script');
+    s.src = 'https://{{ site.comments.disqus.shortname }}.disqus.com/embed.js';
+    s.setAttribute('data-timestamp', +new Date());
+    (d.head || d.body).appendChild(s);
+  })();
+  </script>
+  <noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
+
+{%- endif -%}
diff --git a/_includes/comments-providers/gitalk.html b/_includes/comments-providers/gitalk.html
new file mode 100644
index 0000000..f7f5c67
--- /dev/null
+++ b/_includes/comments-providers/gitalk.html
@@ -0,0 +1,39 @@
+{%- if page.key and
+  site.comments.gitalk.clientID and
+	site.comments.gitalk.clientSecret and
+	site.comments.gitalk.repository and
+	site.comments.gitalk.owner and
+	site.comments.gitalk.admin -%}
+
+	<!-- fix text color in the input textarea of gitalk -->
+	<style type="text/css">
+		.gitalk-wrapper .gt-header-textarea {
+			color: #333 !important;
+		}
+	</style>
+
+	{%- include snippets/get-sources.html -%}
+	{%- assign _sources = __return -%}
+	<div class="gitalk-wrapper" id="js-gitalk-container"></div>
+	{%- assign _admin = '' -%}
+	{%- for _admin_id in site.comments.gitalk.admin -%}
+		{%- assign _admin = _admin | append: ", '" | append: _admin_id | append: "'" -%}
+	{%- endfor -%}
+	{%- assign _last = _admin | size | minus: 1 -%}
+	{%- assign _admin = _admin | slice: 2, _last -%}
+	<script>
+		window.Lazyload.css('{{ _sources.gitalk.css }}');
+		window.Lazyload.js('{{ _sources.gitalk.js }}', function() {
+			var gitalk = new Gitalk({
+				clientID: '{{ site.comments.gitalk.clientID }}',
+				clientSecret: '{{ site.comments.gitalk.clientSecret }}',
+				repo: '{{ site.comments.gitalk.repository }}',
+				owner: '{{ site.comments.gitalk.owner }}',
+				admin: [{{ _admin }}],
+				id: '{{ page.key }}'
+			});
+			gitalk.render('js-gitalk-container');
+		});
+	</script>
+
+{%- endif -%}
diff --git a/_includes/comments-providers/valine.html b/_includes/comments-providers/valine.html
new file mode 100644
index 0000000..68a4274
--- /dev/null
+++ b/_includes/comments-providers/valine.html
@@ -0,0 +1,46 @@
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+
+{%- assign _VALINE_APP_ID = site.comments.valine.app_id -%}
+{%- assign _VALINE_APP_KEY = site.comments.valine.app_key -%}
+{%- assign _VALINE_PLACEHOLDER = site.comments.valine.placeholder -%}
+{%- assign _VALINE_VISITOR = site.comments.valine.visitor -%}
+{%- assign _VALINE_META = site.comments.valine.meta -%}
+
+
+{%- if _VALINE_APP_ID and
+  _VALINE_APP_KEY -%}
+
+<div id="vcomments"></div>
+
+{%- if _VALINE_VISITOR -%}    
+<span id="{{page.url}}" class="leancloud-visitors" data-flag-title={{page.title}}>
+</span>
+{%- endif -%}
+
+<script>
+  window.Lazyload.js(['{{ _sources.leancloud_js_sdk}}', '{{ _sources.valine }}'], function() {
+    var _config = {
+      el: '#vcomments',
+      appId:  '{{ _VALINE_APP_ID }}',
+      appKey: '{{ _VALINE_APP_KEY }}',
+      verify: true,
+    };
+    {%- if _VALINE_PLACEHOLDER -%}
+      _config.placeholder = '{{ _VALINE_PLACEHOLDER }}';
+    {%- endif -%}
+    {%- assign _page_lang_slice =  page.lang | slice: 0, 2 -%}
+    {%- if _page_lang_slice != 'zh'  -%}
+      _config.lang = 'en';
+    {%- endif -%}  
+    {%- if _VALINE_VISITOR -%}
+      _config.visitor = 'true';
+    {%- endif -%}
+    {%- if _VALINE_META -%}
+      _config.meta = {{ _VALINE_META}};
+    {%- endif -%}
+    new Valine(_config);
+  });
+</script>
+
+{%- endif -%}
\ No newline at end of file
diff --git a/_includes/comments.html b/_includes/comments.html
new file mode 100644
index 0000000..8029395
--- /dev/null
+++ b/_includes/comments.html
@@ -0,0 +1,11 @@
+{%- if jekyll.environment != 'development' -%}
+  {%- if site.comments.provider == 'disqus' -%}
+    {%- include comments-providers/disqus.html -%}
+  {%- elsif site.comments.provider == 'gitalk' -%}
+    {%- include comments-providers/gitalk.html -%}
+  {%- elsif site.comments.provider == 'valine' -%}
+    {%- include comments-providers/valine.html -%}
+  {%- elsif site.comments.provider == 'custom' -%}
+    {%- include comments-providers/custom.html -%}
+  {%- endif -%}
+{%- endif -%}
diff --git a/_includes/extensions/bilibili.html b/_includes/extensions/bilibili.html
new file mode 100644
index 0000000..26f4fa4
--- /dev/null
+++ b/_includes/extensions/bilibili.html
@@ -0,0 +1,5 @@
+<div class="extensions extensions--video">
+  <iframe src="//player.bilibili.com/player.html?aid={{ include.id }}&page=1"
+    frameborder="no" scrolling="no" allowfullscreen="true">
+  </iframe>
+</div>
diff --git a/_includes/extensions/codepen.html b/_includes/extensions/codepen.html
new file mode 100644
index 0000000..2240dcf
--- /dev/null
+++ b/_includes/extensions/codepen.html
@@ -0,0 +1,4 @@
+<div class="extensions extensions--demo">
+<iframe src='//codepen.io/{{ include.user }}/embed/{{ include.hash }}/?theme-id=0&default-tab={{ include.default_tab | default: result }}'
+  frameborder="0" scrolling="no" allowfullscreen></iframe>
+</div>
diff --git a/_includes/extensions/netease-cloud-music.html b/_includes/extensions/netease-cloud-music.html
new file mode 100644
index 0000000..be0b3b1
--- /dev/null
+++ b/_includes/extensions/netease-cloud-music.html
@@ -0,0 +1,4 @@
+<iframe class="extensions extensions--audio" width="330" height="86"
+  src="//music.163.com/outchain/player?type=2&id={{ include.id }}&auto=1&height=66"
+  frameborder="no" border="0" marginwidth="0" marginheight="0">
+</iframe>
diff --git a/_includes/extensions/slideshare.html b/_includes/extensions/slideshare.html
new file mode 100644
index 0000000..310806b
--- /dev/null
+++ b/_includes/extensions/slideshare.html
@@ -0,0 +1,6 @@
+<div class="extensions extensions--slide">
+  <iframe src="//www.slideshare.net/slideshow/embed_code/key/{{ include.id }}"
+    width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"
+    style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen>
+  </iframe>
+</div>
diff --git a/_includes/extensions/soundcloud.html b/_includes/extensions/soundcloud.html
new file mode 100644
index 0000000..b4e086b
--- /dev/null
+++ b/_includes/extensions/soundcloud.html
@@ -0,0 +1,4 @@
+<iframe class="extensions extensions--audio" width="100%" height="166"
+  src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/{{ include.id }}&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"
+  scrolling="no" frameborder="no" allow="autoplay">
+</iframe>
\ No newline at end of file
diff --git a/_includes/extensions/ted.html b/_includes/extensions/ted.html
new file mode 100644
index 0000000..1ffc9f4
--- /dev/null
+++ b/_includes/extensions/ted.html
@@ -0,0 +1,5 @@
+<div class="extensions extensions--video">
+  <iframe src="https://embed.ted.com/talks/{{ include.id }}"
+    frameborder="0" scrolling="no" allowfullscreen>
+  </iframe>
+</div>
diff --git a/_includes/extensions/youtube.html b/_includes/extensions/youtube.html
new file mode 100644
index 0000000..6f9c2c8
--- /dev/null
+++ b/_includes/extensions/youtube.html
@@ -0,0 +1,4 @@
+<div class="extensions extensions--video">
+  <iframe src="https://www.youtube.com/embed/{{ include.id }}?rel=0&showinfo=0"
+    frameborder="0" scrolling="no" allowfullscreen></iframe>
+</div>
diff --git a/_includes/footer.html b/_includes/footer.html
index c400e8f..0a4eb29 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,7 +1,37 @@
-<footer class="footer">
-<div class="wrapper">
-&copy; 2016 {{ site.author }}
-</div>
-</footer>
 
-<script src="{{ "/js/easybook.js" | prepend: site.baseurl }}"></script>
\ No newline at end of file
+<footer class="footer py-4 js-page-footer">
+  <div class="main">
+
+    {%- assign _site_author = site.author -%}
+    {%- if _site_author.type == 'organization' -%}
+      {%- assign _site_author_itemtype = 'http://schema.org/Organization' -%}
+    {%- else -%}
+      {%- assign _site_author_itemtype = 'http://schema.org/Person' -%}
+    {%- endif -%}
+
+    <div itemscope itemtype="{{ _site_author_itemtype }}">
+      <meta itemprop="name" content="{{ _site_author.name }}">
+      {%- assign _site_author_url = _site_author.url | default: '/'-%}
+      {%- include snippets/get-nav-url.html path=_site_author_url -%}
+      {%- assign _site_author_url = __return -%}
+      <meta itemprop="url" content="{{ _site_author_url }}">
+      {%- if _site_author.bio -%}
+        <meta itemprop="description" content="{{ _site_author.bio }}">
+      {%- endif -%}
+      <div class="footer__author-links">
+        {%- include author-links.html author=_site_author -%}
+      </div>
+    </div>
+    {%- include snippets/get-locale-string.html key='COPYRIGHT_DATES' -%}
+    {%- assign _locale_copyright_dates = __return -%}
+    <div class="site-info mt-2">
+      <div>
+        {%- include snippets/get-locale-string.html key='COPYRIGHT_DATES' -%}
+        {%- assign _locale_copyright_dates = __return -%}
+        © {{ site.title }} {{ _locale_copyright_dates }},
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
diff --git a/_includes/head.html b/_includes/head.html
index a24a26b..35a3b19 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -1,31 +1,24 @@
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
 
-  <title>{% if page.title %}{{ page.title }} « {{ site.title }}{% else %}{{ site.title }}{% endif %}</title>
-  <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
+{%- include snippets/get-article-title.html article=page -%}
+<title>{%- if __return -%}{{ __return }} - {{ site.title }}{%- else -%}{{ site.title }}{%- endif -%}</title>
 
-  <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
-  <link rel="stylesheet" href="{{ "/css/timeline.css" | prepend: site.baseurl }}">
-  <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+<meta name="description" content="{%- if page.excerpt -%}{{ page.excerpt | strip_html | strip_newlines | strip | truncate: 160 }}{%- else -%}{{ site.description }}{%- endif -%}">
+<link rel="canonical" href="{%- include snippets/page-url.html -%}">
 
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
+{%- assign _paths_rss = site.paths.rss | default: site.data.variables.default.paths.rss -%}
+{%- include snippets/get-nav-url.html path=_paths_rss -%}
+<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ __return }}">
 
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
+{%- include head/favicon.html -%}
+
+{%- include snippets/prepend-baseurl.html path='/assets/css/main.css' -%}
+<link rel="stylesheet" href="{{ __return }}">
+
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+<link rel="stylesheet" href="{{ _sources.font_awesome }}" >
+
+{%- include head/custom.html -%}
diff --git a/_includes/head/custom.html b/_includes/head/custom.html
new file mode 100644
index 0000000..33b1508
--- /dev/null
+++ b/_includes/head/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
diff --git a/_includes/head/favicon.html b/_includes/head/favicon.html
new file mode 100644
index 0000000..d383bfc
--- /dev/null
+++ b/_includes/head/favicon.html
@@ -0,0 +1,26 @@
+<!-- start favicons snippet, use https://realfavicongenerator.net/ -->
+{%- include snippets/prepend-baseurl.html path='/assets/apple-touch-icon.png' -%}
+<link rel="apple-touch-icon" sizes="180x180" href="{{ __return }}">
+
+{%- include snippets/prepend-baseurl.html path='/assets/favicon-32x32.png' -%}
+<link rel="icon" type="image/png" sizes="32x32" href="{{ __return }}">
+
+{%- include snippets/prepend-baseurl.html path='/assets/favicon-16x16.png' -%}
+<link rel="icon" type="image/png" sizes="16x16" href="{{ __return }}">
+
+{%- include snippets/prepend-baseurl.html path='/assets/site.webmanifest' -%}
+<link rel="manifest" href="{{ __return }}">
+
+{%- include snippets/prepend-baseurl.html path='/assets/safari-pinned-tab.svg' -%}
+<link rel="mask-icon" href="{{ __return }}" color="#fc4d50">
+
+{%- include snippets/prepend-baseurl.html path='/assets/favicon.ico' -%}
+<link rel="shortcut icon" href="{{ __return }}">
+
+<meta name="msapplication-TileColor" content="#ffc40d">
+
+{%- include snippets/prepend-baseurl.html path='/assets/browserconfig.xml' -%}
+<meta name="msapplication-config" content="{{ __return }}">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet -->
\ No newline at end of file
diff --git a/_includes/header.html b/_includes/header.html
index 78de311..c79d399 100644
--- a/_includes/header.html
+++ b/_includes/header.html
@@ -1,12 +1,44 @@
-<header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
-    <nav class="site-nav">
-      {% for page in site.pages %}
-        {% if page.title and page.public %}
-        <a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
-        {% endif %}
-      {% endfor %}
-    </nav>
-  </div>
-</header>
\ No newline at end of file
+{%- if include.theme == 'dark' -%}
+  <header class="header header--dark" {%- if include.background -%} style="background: {{ include.background }};" {%- endif -%}>
+{%- elsif include.theme == 'light' -%}
+  <header class="header header--light" {%- if include.background -%} style="background: {{ include.background }};" {%- endif -%}>
+{%- else -%}
+  <header class="header" {%- if include.background -%} style="background: {{ include.background }};" {%- endif -%}>
+{%- endif -%}
+    <div class="main">
+      <div class="header__title">
+        <div class="header__brand">
+          {%- include svg/logo.svg -%}
+          {%- assign _paths_root = site.paths.root | default: site.data.variables.default.paths.root  -%}
+          {%- include snippets/get-nav-url.html path=_paths_root -%}
+          {%- if site.title -%}
+            <a title="{%- if site.description -%}{{ site.description }}{%- endif -%}" href="{{ __return }}">{{ site.title }}</a>
+          {%- endif -%}
+        </div>
+        {%- if site.search.provider -%}
+          <button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button>
+        {%- endif -%}
+      </div>
+      {%- if site.data.navigation.header -%}
+      <nav class="navigation">
+        <ul>
+          {%- for _item in site.data.navigation.header -%}
+            {%- include snippets/get-nav-url.html path=_item.url -%}
+            {%- assign _nav_url = __return -%}
+            {%- include snippets/get-nav-url.html path=page.url -%}
+            {%- assign _page_url = __return -%}
+            {%- include snippets/get-string-from-locale-config.html locale=_item.titles -%}
+            {%- if _nav_url == _page_url or page.nav_key and _item.key and page.nav_key == _item.key -%}
+              <li class="navigation__item navigation__item--active"><a href="{{ _nav_url }}">{%- if _item.title -%}{{ _item.title }}{%- else -%}{{ __return }}{%- endif -%}</a></li>
+            {%- else -%}
+              <li class="navigation__item"><a href="{{ _nav_url }}">{%- if _item.title -%}{{ _item.title }}{%- else -%}{{ __return }}{%- endif -%}</a></li>
+            {%- endif -%}
+          {%- endfor -%}
+          {%- if site.search.provider -%}
+            <li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li>
+          {%- endif -%}
+        </ul>
+      </nav>
+      {%- endif -%}
+    </div>
+  </header>
diff --git a/_includes/icon-github.html b/_includes/icon-github.html
deleted file mode 100644
index e501a16..0000000
--- a/_includes/icon-github.html
+++ /dev/null
@@ -1 +0,0 @@
-<a href="https://github.com/{{ include.username }}"><span class="icon icon--github">{% include icon-github.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/_includes/icon-github.svg b/_includes/icon-github.svg
deleted file mode 100644
index 4422c4f..0000000
--- a/_includes/icon-github.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg viewBox="0 0 16 16"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg>
diff --git a/_includes/icon-twitter.html b/_includes/icon-twitter.html
deleted file mode 100644
index e623dbd..0000000
--- a/_includes/icon-twitter.html
+++ /dev/null
@@ -1 +0,0 @@
-<a href="https://twitter.com/{{ include.username }}"><span class="icon icon--twitter">{% include icon-twitter.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/_includes/icon-twitter.svg b/_includes/icon-twitter.svg
deleted file mode 100644
index dcf660e..0000000
--- a/_includes/icon-twitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg viewBox="0 0 16 16"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg>
diff --git a/_includes/main/bottom/custom.html b/_includes/main/bottom/custom.html
new file mode 100644
index 0000000..b19da2f
--- /dev/null
+++ b/_includes/main/bottom/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
diff --git a/_includes/main/top/custom.html b/_includes/main/top/custom.html
new file mode 100644
index 0000000..0bf5951
--- /dev/null
+++ b/_includes/main/top/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
diff --git a/_includes/markdown-enhancements.html b/_includes/markdown-enhancements.html
new file mode 100644
index 0000000..fe701b4
--- /dev/null
+++ b/_includes/markdown-enhancements.html
@@ -0,0 +1,17 @@
+{%- include snippets/assign.html target=site.data.variables.default.chart
+  source0=site.chart source1=page.chart -%}
+{%- if __return == true -%}
+  {%- include markdown-enhancements/chart.html -%}
+{%- endif -%}
+
+{%- include snippets/assign.html target=site.data.variables.default.mathjax
+  source0=site.mathjax source1=page.mathjax -%}
+{%- if __return == true -%}
+  {%- include markdown-enhancements/mathjax.html -%}
+{%- endif -%}
+
+{%- include snippets/assign.html target=site.data.variables.default.mermaid
+  source0=site.mermaid source1=page.mermaid -%}
+{%- if __return == true -%}
+  {%- include markdown-enhancements/mermaid.html -%}
+{%- endif -%}
diff --git a/_includes/markdown-enhancements/chart.html b/_includes/markdown-enhancements/chart.html
new file mode 100644
index 0000000..f1c476d
--- /dev/null
+++ b/_includes/markdown-enhancements/chart.html
@@ -0,0 +1,15 @@
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+<script>
+  window.Lazyload.js(['{{ _sources.jquery }}', '{{ _sources.chart }}'], function() {
+    var $canvas = null, $this = null, _ctx = null, _text = '';
+    $('.language-chart').each(function(){
+      $this = $(this);
+      $canvas = $('<canvas></canvas>');
+      _text = $this.text();
+      $this.text('').append($canvas);
+      _ctx = $canvas.get(0).getContext('2d');
+      (_ctx && _text) && (new Chart(_ctx, JSON.parse(_text)) && $this.attr('data-processed', true));
+    });
+  });
+</script>
diff --git a/_includes/markdown-enhancements/mathjax.html b/_includes/markdown-enhancements/mathjax.html
new file mode 100644
index 0000000..9500faa
--- /dev/null
+++ b/_includes/markdown-enhancements/mathjax.html
@@ -0,0 +1,17 @@
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+
+{%- include snippets/assign.html target=site.data.variables.default.mathjax_autoNumber
+  source0=site.mathjax_autoNumber source1=page.mathjax_autoNumber -%}
+{%- assign _mathjax_autoNumber = __return -%}
+
+<script type="text/x-mathjax-config">
+	var _config = { tex2jax: {
+		inlineMath: [['$','$'], ['\\(','\\)']]
+	}};
+	{%- if _mathjax_autoNumber == true -%}
+		_config.TeX = { equationNumbers: { autoNumber: "all" } };
+	{%- endif -%}
+	MathJax.Hub.Config(_config);
+</script>
+<script type="text/javascript" src="{{ _sources.mathjax }}" async></script>
diff --git a/_includes/markdown-enhancements/mermaid.html b/_includes/markdown-enhancements/mermaid.html
new file mode 100644
index 0000000..64e4dac
--- /dev/null
+++ b/_includes/markdown-enhancements/mermaid.html
@@ -0,0 +1,10 @@
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+<script>
+  window.Lazyload.js('{{ _sources.mermaid }}', function() {
+    mermaid.initialize({
+      startOnLoad: true
+    });
+    mermaid.init(undefined, '.language-mermaid');
+  });
+</script>
diff --git a/_includes/pageview-providers/custom/home.html b/_includes/pageview-providers/custom/home.html
new file mode 100644
index 0000000..7fabc80
--- /dev/null
+++ b/_includes/pageview-providers/custom/home.html
@@ -0,0 +1,3 @@
+<!-- start custom pageview snippet (for Home layout) -->
+
+<!-- end custom pageview snippet (for Home layout) -->
diff --git a/_includes/pageview-providers/custom/post.html b/_includes/pageview-providers/custom/post.html
new file mode 100644
index 0000000..c9d0f04
--- /dev/null
+++ b/_includes/pageview-providers/custom/post.html
@@ -0,0 +1,3 @@
+<!-- start custom pageview snippet (for the post) -->
+
+<!-- end custom pageview snippet (for the post) -->
\ No newline at end of file
diff --git a/_includes/pageview-providers/leancloud/home.html b/_includes/pageview-providers/leancloud/home.html
new file mode 100644
index 0000000..5dc99b7
--- /dev/null
+++ b/_includes/pageview-providers/leancloud/home.html
@@ -0,0 +1,35 @@
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+
+{%- assign _LEANCLOUD_APP_ID = site.pageview.leancloud.app_id -%}
+{%- assign _LEANCLOUD_APP_KEY = site.pageview.leancloud.app_key -%}
+{%- assign _LEANCLOUD_APP_CLASS = site.pageview.leancloud.app_class -%}
+
+{%- if _LEANCLOUD_APP_ID and
+  _LEANCLOUD_APP_KEY and
+  _LEANCLOUD_APP_CLASS -%}
+
+  <script>
+    {%- include pageview-providers/leancloud/leancloud.js -%}
+  </script>
+  <script>
+    window.Lazyload.js(['{{ _sources.jquery }}', '{{ _sources.leancloud_js_sdk}}'], function() {
+      var pageview = window.pageview(AV, {
+        appId:    '{{ _LEANCLOUD_APP_ID }}',
+        appKey:   '{{ _LEANCLOUD_APP_KEY }}',
+        appClass: '{{ _LEANCLOUD_APP_CLASS }}'
+      });
+      $('.js-pageview').each(function() {
+        var $this = $(this);
+        var key = $this.attr('data-page-key');
+        pageview.get(key, function(view) {
+          $this.attr('itemprop', 'userInteractionCount').attr('content', view).text(view);
+        });
+      });
+    });
+  </script>
+
+{%- endif -%}
+
+
+
diff --git a/_includes/pageview-providers/leancloud/leancloud.js b/_includes/pageview-providers/leancloud/leancloud.js
new file mode 100644
index 0000000..32e3ba8
--- /dev/null
+++ b/_includes/pageview-providers/leancloud/leancloud.js
@@ -0,0 +1,72 @@
+(function() {
+  function errorHandler(error, callback) {
+    if (error) {
+      callback && callback(error);
+      throw error;
+    }
+  }
+
+  function pageview(_AV, options) {
+    var AV = _AV;
+    var appId, appKey, appClass;
+    appId = options.appId;
+    appKey = options.appKey;
+    appClass = options.appClass;
+    AV.init({
+      serverURLs: 'https://avoscloud.com',
+      appId: appId,
+      appKey: appKey
+    });
+    return {
+      get: get,
+      increase: increase
+    };
+
+    function searchKey(key) {
+      var query = new AV.Query(appClass);
+      query.equalTo('key', key);
+      return query.first();
+    }
+
+    function insert(key, title) {
+      var Blog = AV.Object.extend(appClass);
+      var blog = new Blog();
+      blog.set('title', title);
+      blog.set('key', key);
+      blog.set('views', 0);
+      return blog.save();
+    }
+
+    function increment(result) {
+      result.increment('views', 1);
+      return result.save(null, {
+        fetchWhenSave: true
+      });
+    }
+
+    function get(key, callback) {
+      searchKey(key).then(function(result) {
+        if (result) {
+          callback && callback(result.attributes.views);
+        }
+      }, errorHandler);
+    }
+
+    function increase(key, title, callback) {
+      searchKey(key).then(function(result) {
+        if (result) {
+          increment(result).then(function(result) {
+            callback && callback(result.attributes.views);
+          });
+        } else {
+          insert(key, title).then(function(result) {
+            increment(result).then(function(result) {
+              callback && callback(result.attributes.views);
+            });
+          }, errorHandler);
+        }
+      }, errorHandler);
+    }
+  }
+  window.pageview = pageview;
+})();
diff --git a/_includes/pageview-providers/leancloud/post.html b/_includes/pageview-providers/leancloud/post.html
new file mode 100644
index 0000000..ebd7510
--- /dev/null
+++ b/_includes/pageview-providers/leancloud/post.html
@@ -0,0 +1,31 @@
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+
+{%- assign _LEANCLOUD_APP_ID = site.pageview.leancloud.app_id -%}
+{%- assign _LEANCLOUD_APP_KEY = site.pageview.leancloud.app_key -%}
+{%- assign _LEANCLOUD_APP_CLASS = site.pageview.leancloud.app_class -%}
+
+{%- if page.key and
+  _LEANCLOUD_APP_ID and
+  _LEANCLOUD_APP_KEY and
+  _LEANCLOUD_APP_CLASS -%}
+
+  <script>
+    {%- include pageview-providers/leancloud/leancloud.js -%}
+  </script>
+  <script>
+    window.Lazyload.js(['{{ _sources.jquery }}', '{{ _sources.leancloud_js_sdk}}'], function() {
+      var pageview = window.pageview(AV, {
+        appId:    '{{ _LEANCLOUD_APP_ID }}',
+        appKey:   '{{ _LEANCLOUD_APP_KEY }}',
+        appClass: '{{ _LEANCLOUD_APP_CLASS }}'
+      });
+      var key =   '{{ page.key }}';
+      var title = {{ page.title | jsonify }};
+      pageview.increase(key, title, function(view) {
+        $("[data-page-key='{{ page.key }}']").text(view);
+      });
+    });
+  </script>
+
+{%- endif -%}
\ No newline at end of file
diff --git a/_includes/pageview.html b/_includes/pageview.html
new file mode 100644
index 0000000..bb31b15
--- /dev/null
+++ b/_includes/pageview.html
@@ -0,0 +1,29 @@
+{%- include snippets/assign.html target=site.data.variables.default.pageview source0=page.pageview -%}
+{%- assign _pageview = __return -%}
+
+
+{%- if page.layout == "home" -%}
+
+  {%- if jekyll.environment != "development" -%}
+    {%- if site.pageview.provider == 'leancloud' -%}
+      {%- include pageview-providers/leancloud/home.html -%}
+    {%- elsif site.pageview.provider == 'custom' -%}
+      {%- include pageview-providers/custom/home.html -%}
+    {%- endif -%}
+  {%- endif -%}
+
+
+{%- elsif page.layout == "article" -%}
+  {%- if _pageview -%}
+
+    {%- if jekyll.environment != "development" and
+      jekyll.environment != "beta" -%}
+      {%- if site.pageview.provider == 'leancloud' -%}
+        {%- include pageview-providers/leancloud/post.html -%}
+      {%- elsif site.pageview.provider == 'custom' -%}
+        {%- include pageview-providers/custom/post.html -%}
+      {%- endif -%}
+    {%- endif -%}
+
+  {%- endif -%}
+{%- endif -%}
diff --git a/_includes/paginator.html b/_includes/paginator.html
new file mode 100644
index 0000000..5956481
--- /dev/null
+++ b/_includes/paginator.html
@@ -0,0 +1,98 @@
+{%- if paginator.total_pages > 1 -%}
+  <div class="pagination">
+
+    {%- include snippets/get-locale-string.html key='STATISTICS' -%}
+    {%- assign _locale_statistics = __return -%}
+
+    {%- assign _post_count = site.posts | size -%}
+    {%- assign _page_count = paginator.total_pages -%}
+    <p>{{ _locale_statistics | replace: '[POST_COUNT]', _post_count | replace: '[PAGE_COUNT]', _page_count }}</p>
+    <div class="pagination__menu">
+      <ul class="menu menu--nowrap">
+        {%- assign _max_show = 5 -%}
+        {%- assign _max_show_modulo_two = _max_show | modulo: 2 -%}
+        {%- assign _length = paginator.total_pages -%}
+        {%- assign _length_mimus_one = _length | minus: 1 -%}
+        {%- assign _cur = paginator.page -%}
+        {%- assign _extra = _max_show | minus: 3 -%}
+        {%- assign _extra_half = _extra | divided_by: 2 -%}
+
+        {%- if  _max_show > 4 and _max_show_modulo_two == 1 and paginator.total_pages > _max_show -%}
+          {%- assign _condition0 = _extra | divided_by: 2 | plus: 1 -%}
+          {%- assign _condition1 = _length | minus: _extra_half  -%}
+          {%- if _cur <= _condition0 -%}
+            {%- assign _n0 = 2 -%}
+            {%- assign _n1 = _extra | plus: 2 -%}
+          {%- elsif _cur >= _condition1 -%}
+            {%- assign _n0 = _length | minus: _extra | minus: 1 -%}
+            {%- assign _n1 = _length | minus: 1 -%}
+          {%- else -%}
+            {%- assign _n0 = _cur | minus: _extra_half -%}
+            {%- assign _n1 = _cur | plus: _extra_half -%}
+          {%- endif -%}
+        {%- endif -%}
+
+        {%- if paginator.previous_page -%}
+          {%- include snippets/prepend-baseurl.html path=paginator.previous_page_path -%}
+          {%- assign _href = __return -%}
+          <li><a class="button button--secondary button--circle" href="{{ _href }}">
+            <i class="fas fa-angle-left"></i>
+          </a></li>
+        {%- else -%}
+          <li><div class="button button--secondary button--circle disabled">
+            <i class="fas fa-angle-left"></i>
+          </div></li>
+        {%- endif -%}
+
+        {%- for page in (1.._length) -%}
+          {%- if page == _cur -%}
+            <li>
+              <div class="button button--primary button--circle focus"><span>{{ page }}</span></div>
+            </li>
+
+          {%- elsif page == 1 -%}
+            {%- assign _home_path = site.paths.home | default: site.data.variables.default.paths.home -%}
+            {%- include snippets/prepend-baseurl.html path=_home_path -%}
+            {%- assign _href = __return -%}
+            <li>
+              <a class="button button--secondary button--circle" href="{{ _href }}"><span>{{ page }}</span></a>
+            </li>
+
+          {%- else -%}
+            {%- if _n0 and _n1 -%}
+              {%- if page > 1 and page < _n0 -%}
+                {%- if page == 2 -%}<li><span class="pagination__omit"><i class="fas fa-ellipsis-h"></i></span></li>{%- endif -%}
+              {%- elsif page > _n1 and page < _length -%}
+                {%- if page == _length_mimus_one -%}<li><span class="pagination__omit"><i class="fas fa-ellipsis-h"></i></span></li>{%- endif -%}
+              {%- else -%}
+                {%- include snippets/prepend-baseurl.html path=site.paginate_path -%}
+                {%- assign _href = __return -%}
+                <li>
+                  <a class="button button--secondary button--circle" href="{{ _href | replace: ':num', page }}"><span>{{ page }}</span></a>
+                </li>
+              {%- endif -%}
+            {%- else -%}
+              {%- include snippets/prepend-baseurl.html path=site.paginate_path -%}
+              {%- assign _href = __return -%}
+              <li>
+                <a class="button button--secondary button--circle" href="{{ _href | replace: ':num', page }}"><span>{{ page }}</span></a>
+              </li>
+            {%- endif -%}
+          {%- endif -%}
+        {%- endfor -%}
+
+        {%- if paginator.next_page -%}
+          {%- include snippets/prepend-baseurl.html path=paginator.next_page_path -%}
+          {%- assign _href = __return -%}
+          <li><a class="button button--secondary button--circle" href="{{ _href }}">
+            <i class="fas fa-angle-right"></i>
+          </a></li>
+        {%- else -%}
+          <li><div class="button button--secondary button--circle disabled">
+            <i class="fas fa-angle-right"></i>
+          </div></li>
+        {%- endif -%}
+      </ul>
+    </div>
+  </div>
+{%- endif -%}
diff --git a/_includes/scripts/archieve.js b/_includes/scripts/archieve.js
new file mode 100644
index 0000000..96549b5
--- /dev/null
+++ b/_includes/scripts/archieve.js
@@ -0,0 +1,135 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  function queryString() {
+    // This function is anonymous, is executed immediately and
+    // the return value is assigned to QueryString!
+    var i = 0, queryObj = {}, pair;
+    var queryStr = window.location.search.substring(1);
+    var queryArr = queryStr.split('&');
+    for (i = 0; i < queryArr.length; i++) {
+      pair = queryArr[i].split('=');
+      // If first entry with this name
+      if (typeof queryObj[pair[0]] === 'undefined') {
+        queryObj[pair[0]] = pair[1];
+        // If second entry with this name
+      } else if (typeof queryObj[pair[0]] === 'string') {
+        queryObj[pair[0]] = [queryObj[pair[0]], pair[1]];
+        // If third or later entry with this name
+      } else {
+        queryObj[pair[0]].push(pair[1]);
+      }
+    }
+    return queryObj;
+  }
+
+  var setUrlQuery = (function() {
+    var baseUrl =  window.location.href.split('?')[0];
+    return function(query) {
+      if (typeof query === 'string') {
+        window.history.replaceState(null, '', baseUrl + query);
+      } else {
+        window.history.replaceState(null, '', baseUrl);
+      }
+    };
+  })();
+
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $tags = $('.js-tags');
+    var $articleTags = $tags.find('button');
+    var $tagShowAll = $tags.find('.tag-button--all');
+    var $result = $('.js-result');
+    var $sections = $result.find('section');
+    var sectionArticles = [];
+    var $lastFocusButton = null;
+    var sectionTopArticleIndex = [];
+    var hasInit = false;
+
+    $sections.each(function() {
+      sectionArticles.push($(this).find('.item'));
+    });
+
+    function init() {
+      var i, index = 0;
+      for (i = 0; i < $sections.length; i++) {
+        sectionTopArticleIndex.push(index);
+        index += $sections.eq(i).find('.item').length;
+      }
+      sectionTopArticleIndex.push(index);
+    }
+
+    function searchButtonsByTag(_tag/*raw tag*/) {
+      if (!_tag) {
+        return $tagShowAll;
+      }
+      var _buttons = $articleTags.filter('[data-encode="' + _tag + '"]');
+      if (_buttons.length === 0) {
+        return $tagShowAll;
+      }
+      return _buttons;
+    }
+    function buttonFocus(target) {
+      if (target) {
+        target.addClass('focus');
+        $lastFocusButton && !$lastFocusButton.is(target) && $lastFocusButton.removeClass('focus');
+        $lastFocusButton = target;
+      }
+    }
+
+    function tagSelect (tag/*raw tag*/, target) {
+      var result = {}, $articles;
+      var i, j, k, _tag;
+
+      for (i = 0; i < sectionArticles.length; i++) {
+        $articles = sectionArticles[i];
+        for (j = 0; j < $articles.length; j++) {
+          if (tag === '' || tag === undefined) {
+            result[i] || (result[i] = {});
+            result[i][j] = true;
+          } else {
+            var tags = $articles.eq(j).data('tags').split(',');
+            for (k = 0; k < tags.length; k++) {
+              if (tags[k] === tag) {
+                result[i] || (result[i] = {});
+                result[i][j] = true; break;
+              }
+            }
+          }
+        }
+      }
+
+      for (i = 0; i < sectionArticles.length; i++) {
+        result[i] && $sections.eq(i).removeClass('d-none');
+        result[i] || $sections.eq(i).addClass('d-none');
+        for (j = 0; j < sectionArticles[i].length; j++) {
+          if (result[i] && result[i][j]) {
+            sectionArticles[i].eq(j).removeClass('d-none');
+          } else {
+            sectionArticles[i].eq(j).addClass('d-none');
+          }
+        }
+      }
+
+      hasInit || ($result.removeClass('d-none'), hasInit = true);
+
+
+      if (target) {
+        buttonFocus(target);
+        _tag = target.attr('data-encode');
+        if (_tag === '' || typeof _tag !== 'string') {
+          setUrlQuery();
+        } else {
+          setUrlQuery('?tag=' + _tag);
+        }
+      } else {
+        buttonFocus(searchButtonsByTag(tag));
+      }
+    }
+
+    var query = queryString(), _tag = query.tag;
+    init(); tagSelect(_tag);
+    $tags.on('click', 'button', function() {
+      tagSelect($(this).data('encode'), $(this));
+    });
+
+  });
+})();
diff --git a/_includes/scripts/article.js b/_includes/scripts/article.js
new file mode 100644
index 0000000..9b18ef5
--- /dev/null
+++ b/_includes/scripts/article.js
@@ -0,0 +1,24 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
diff --git a/_includes/scripts/aside/affix.js b/_includes/scripts/aside/affix.js
new file mode 100644
index 0000000..1db3b8e
--- /dev/null
+++ b/_includes/scripts/aside/affix.js
@@ -0,0 +1,26 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window), $pageFooter = $('.js-page-footer');
+    var $pageAside = $('.js-page-aside');
+    var affix;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+
+    affix = $pageAside.affix({
+      offsetBottom: $pageFooter.outerHeight(),
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      scroll: hasSidebar ? $('.js-page-main').children() : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      affix && affix.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+    window.pageAsideAffix = affix;
+  });
+})();
diff --git a/_includes/scripts/aside/toc.js b/_includes/scripts/aside/toc.js
new file mode 100644
index 0000000..a19ea95
--- /dev/null
+++ b/_includes/scripts/aside/toc.js
@@ -0,0 +1,35 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window);
+    var $articleContent = $('.js-article-content');
+    var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
+    var toc;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+    var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
+
+    function disabled() {
+      return $col2.css('display') === 'none' || !hasToc;
+    }
+
+    tocDisabled = disabled();
+
+    toc = $tocRoot.toc({
+      selectors: TOC_SELECTOR,
+      container: $articleContent,
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      tocDisabled = disabled();
+      toc && toc.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+  });
+})();
diff --git a/_includes/scripts/common.js b/_includes/scripts/common.js
new file mode 100644
index 0000000..09400a2
--- /dev/null
+++ b/_includes/scripts/common.js
@@ -0,0 +1,7 @@
+(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
diff --git a/_includes/scripts/components/lightbox.js b/_includes/scripts/components/lightbox.js
new file mode 100644
index 0000000..51689c2
--- /dev/null
+++ b/_includes/scripts/components/lightbox.js
@@ -0,0 +1,49 @@
+{%- include scripts/utils/imagesLoad.js -%}
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $pageGalleryModal = $('.js-page-gallery-modal');
+    var $images = $('.page__content').find('img:not(.lightbox-ignore)');
+    window.imagesLoad($images).then(function() {
+      /* global Gallery */
+      var pageGalleryModal = $pageGalleryModal.modal({ onChange: handleModalChange });
+      var gallery = null;
+      var modalVisible = false;
+      var i, items = [], image, item;
+      if($images && $images.length > 0) {
+        for (i = 0; i < $images.length; i++) {
+          image = $images.eq(i);
+          if (image.get(0).naturalWidth > 800) {
+            items.push({ src: image.attr('src'), w: image.get(0).naturalWidth, h: image.get(0).naturalHeight, $el: image});
+          }
+        }
+      }
+
+      if(items.length > 0) {
+        gallery = new Gallery('.gallery', items);
+        gallery.setOptions({ disabled: !modalVisible });
+        gallery.init();
+        for (i = 0; i < items.length; i++) {
+          item = items[i];
+          item.$el && (item.$el.addClass('popup-image'), item.$el.on('click', (function() {
+            var index = i;
+            return function() {
+              pageGalleryModal.show();
+              gallery.setOptions({ initialSlide: index });
+              gallery.refresh(true, { animation: false });
+            };
+          })()));
+        }
+      }
+
+      function handleModalChange(visible) {
+        modalVisible = visible;
+        gallery && gallery.setOptions({ disabled: !modalVisible });
+      }
+
+      $pageGalleryModal.on('click', function() {
+        pageGalleryModal.hide();
+      });
+    });
+  });
+})();
diff --git a/_includes/scripts/components/search.js b/_includes/scripts/components/search.js
new file mode 100644
index 0000000..e1c8c27
--- /dev/null
+++ b/_includes/scripts/components/search.js
@@ -0,0 +1,86 @@
+
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
diff --git a/_includes/scripts/components/sidebar.js b/_includes/scripts/components/sidebar.js
new file mode 100644
index 0000000..92c5591
--- /dev/null
+++ b/_includes/scripts/components/sidebar.js
@@ -0,0 +1,30 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $pageMask = $('.js-page-mask');
+    var $pageRoot = $('.js-page-root');
+    var $sidebarShow = $('.js-sidebar-show');
+    var $sidebarHide = $('.js-sidebar-hide');
+
+    function freeze(e) {
+      if (e.target === $pageMask[0]) {
+        e.preventDefault();
+      }
+    }
+    function stopBodyScrolling(bool) {
+      if (bool === true) {
+        window.addEventListener('touchmove', freeze, { passive: false });
+      } else {
+        window.removeEventListener('touchmove', freeze, { passive: false });
+      }
+    }
+
+    $sidebarShow.on('click', function() {
+      stopBodyScrolling(true); $pageRoot.addClass('show-sidebar');
+    });
+    $sidebarHide.on('click', function() {
+      stopBodyScrolling(false); $pageRoot.removeClass('show-sidebar');
+    });
+  });
+})();
diff --git a/_includes/scripts/home.js b/_includes/scripts/home.js
new file mode 100644
index 0000000..91d05b9
--- /dev/null
+++ b/_includes/scripts/home.js
@@ -0,0 +1,3 @@
+/*(function () {
+
+})();*/
diff --git a/_includes/scripts/lib/affix.js b/_includes/scripts/lib/affix.js
new file mode 100644
index 0000000..779442f
--- /dev/null
+++ b/_includes/scripts/lib/affix.js
@@ -0,0 +1,111 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
diff --git a/_includes/scripts/lib/gallery.js b/_includes/scripts/lib/gallery.js
new file mode 100644
index 0000000..1793f04
--- /dev/null
+++ b/_includes/scripts/lib/gallery.js
@@ -0,0 +1,192 @@
+(function() {
+  {%- include scripts/lib/swiper.js -%}
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var template =
+      '<div class="swiper gallery__swiper">' +
+        '<div class="swiper__wrapper">' +
+        '</div>' +
+        '<div class="swiper__button swiper__button--prev fas fa-chevron-left"></div>' +
+        '<div class="swiper__button swiper__button--next fas fa-chevron-right"></div>' +
+      '</div>';
+    function setState($item, zoom, translate) {
+      $item.css('transform', 'scale(' + zoom + ') translate(' + translate.x +  'px,' + translate.y + 'px)');
+    }
+    function Gallery(root, items) {
+      this.$root = $(root);
+      this.$swiper = null;
+      this.$swiperWrapper = null;
+      this.$activeItem = null;
+      this.$items = [];
+      this.contentWidth = 0;
+      this.contentHeight = 0;
+      this.swiper = null;
+      this.items = items;
+      this.disabled = false;
+      this.curIndex = 0;
+      this.touchCenter = null;
+      this.lastTouchCenter = null;
+      this.zoomRect = null;
+      this.lastZoomRect = null;
+      this.lastTranslate = null;
+      this.translate = null;
+      this.lastZoom = 1;
+      this.preZoom = 1;
+      this.zoom = 1;
+    }
+    Gallery.prototype.init = function() {
+      var i, item, items = this.items, size, self = this, touchstartFingerCount = 0;
+      this.$root.append(template);
+      this.$swiper = this.$root.find('.gallery__swiper');
+      this.$swiperWrapper = this.$root.find('.swiper__wrapper');
+      this.contentWidth = this.$swiperWrapper && this.$swiperWrapper.width();
+      this.contentHeight = this.$swiperWrapper && this.$swiperWrapper.height();
+      for (i = 0; i < items.length; i++) {
+        item = items[i];
+        size = this._calculateImageSize(item.w, item.h);
+        this.$items.push($(
+          '<div class="swiper__slide">' +
+            '<div class="gallery-item">' +
+              '<div class="gallery-item__content">' +
+                '<img src="' + item.src + '" style="width:' + size.w + 'px;height:' + size.h +  'px"/>' +
+              '</div>' +
+            '</div>' +
+          '</div>'
+        ));
+      }
+      this.$swiperWrapper && this.$swiperWrapper.append(this.$items);
+      this.swiper = this.$swiper && this.$swiper.swiper({
+        onChangeEnd: function() {
+          self._handleChangeEnd.apply(self, Array.prototype.slice.call(arguments));
+        }
+      });
+      $(window).on('resize', function() {
+        if (self.disabled) { return; }
+        self._resizeImageSize();
+      });
+      // Char Code: 37  ⬅, 39  ➡
+      $(window).on('keyup', function(e) {
+        if (window.isFormElement(e.target || e.srcElement) || self.disabled) { return; }
+        if (e.which === 37) {
+          self.swiper && self.swiper.previous();
+        } else if (e.which === 39) {
+          self.swiper && self.swiper.next();
+        }
+      });
+      function getRect(touch0, touch1) {
+        return {
+          o: {
+            x: (touch0.pageX + touch1.pageX) / 2,
+            y: (touch0.pageY + touch1.pageY) / 2
+          },
+          w: Math.abs(touch0.pageX - touch1.pageX),
+          h: Math.abs(touch0.pageY - touch1.pageY)
+        };
+      }
+      function getTouches(e) {
+        return e.touches || e;
+      }
+      function getTouchesCount(e) {
+        if (e.touches) {
+          return e.touches.length;
+        } else {
+          return 1;
+        }
+      }
+      this.$swiperWrapper.on('touchstart', function(e) {
+        var touch0, touch1, rect;
+        touchstartFingerCount = getTouchesCount(e);
+        if (touchstartFingerCount > 1) {
+          touch0 = e.touches[0];
+          touch1 = e.touches[1];
+          rect = getRect(touch0, touch1);
+          self.lastZoomRect = { w: rect.w, h: rect.h };
+          self.lastTouchCenter = rect.o;
+        } else {
+          var touch = getTouches(e)[0];
+          self.lastTouchCenter = { x: touch.pageX, y: touch.pageY };
+        }
+      });
+      this.$swiperWrapper.on('touchmove', function(e) {
+        if (touchstartFingerCount === getTouchesCount(e)) {
+          if (touchstartFingerCount > 1) {
+            var touch0 = e.touches[0];
+            var touch1 = e.touches[1];
+            var rect = getRect(touch0, touch1);
+            self.zoomRect = { w: rect.w, h: rect.h };
+            self.touchCenter = rect.o;
+            self._zoom(); self._translate();
+            setState(self.$activeItem, self.zoom, self.translate);
+          } else {
+            var touch = getTouches(e)[0];
+            self.touchCenter = { x: touch.pageX, y: touch.pageY };
+            self._translate();
+            setState(self.$activeItem, self.zoom, self.translate);
+          }
+        }
+      });
+      this.$swiperWrapper.on('touchend', function(e) {
+        self.lastZoom = self.zoom;
+        self.lastTranslate = self.translate;
+        touchstartFingerCount = 0;
+      });
+      this.$root.on('touchmove', function(e) {
+        if (self.disabled) { return; }
+        e.preventDefault();
+      });
+    };
+
+    Gallery.prototype._translate = function() {
+      this.translate = this.touchCenter && this.lastTouchCenter && this.lastTranslate ? {
+        x: (this.touchCenter.x - this.lastTouchCenter.x) / this.zoom + this.lastTranslate.x,
+        y: (this.touchCenter.y - this.lastTouchCenter.y) / this.zoom + this.lastTranslate.y
+      } : { x: 0, y: 0 };
+    }
+    Gallery.prototype._zoom = function() {
+      this.zoom = (this.zoomRect.w + this.zoomRect.h) / (this.lastZoomRect.w + this.lastZoomRect.h) * this.lastZoom;
+      this.zoom > 1 ? this.$activeItem.addClass('zoom') : this.$activeItem.removeClass('zoom');
+      this.preZoom = this.zoom;
+    }
+
+    Gallery.prototype._calculateImageSize = function(w, h) {
+      var scale = 1;
+      if (this.contentWidth > 0 && this.contentHeight > 0 && w > 0 && h > 0) {
+        scale = Math.min(
+          Math.min(w, this.contentWidth) / w,
+          Math.min(h, this.contentHeight) / h);
+      }
+      return { w: Math.floor(w * scale), h: Math.floor(h * scale) };
+    };
+
+    Gallery.prototype._resizeImageSize = function() {
+      var i, $item, $items = this.$items, item, size;
+      this.contentWidth = this.$swiperWrapper && this.$swiperWrapper.width();
+      this.contentHeight = this.$swiperWrapper && this.$swiperWrapper.height();
+      if ($items.length < 1) { return; }
+      for (i = 0; i < $items.length; i++) {
+        item = this.items[i], $item = $items[i];
+        size = this._calculateImageSize(item.w, item.h);
+        item.width = size.w; item.height = size.h;
+        $item && $item.find('img').css({ width: size.w, height: size.h });
+      }
+    };
+    Gallery.prototype._handleChangeEnd = function(index, $dom, preIndex, $preDom) {
+      this.curIndex = index;
+      this.lastZoomRect = null; this.lastZoomRect = null;
+      this.lastTranslate = this.translate = { x: 0, y:0 };
+      this.lastZoom = this.preZoom = this.zoom = 1;
+      this.$activeItem = $dom.find('.gallery-item__content');
+      setState($preDom.find('.gallery-item__content'), this.zoom, this.translate);
+    };
+
+    Gallery.prototype.refresh = function() {
+      this.swiper && this.swiper.refresh();
+      this._resizeImageSize();
+    };
+    Gallery.prototype.setOptions = function(options) {
+      this.disabled = options.disabled;
+      this.swiper && this.swiper.setOptions(options);
+    };
+    window.Gallery = Gallery;
+  });
+})();
\ No newline at end of file
diff --git a/_includes/scripts/lib/lazyload.js b/_includes/scripts/lib/lazyload.js
new file mode 100644
index 0000000..9911535
--- /dev/null
+++ b/_includes/scripts/lib/lazyload.js
@@ -0,0 +1,143 @@
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
diff --git a/_includes/scripts/lib/modal.js b/_includes/scripts/lib/modal.js
new file mode 100644
index 0000000..cb5d188
--- /dev/null
+++ b/_includes/scripts/lib/modal.js
@@ -0,0 +1,64 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
diff --git a/_includes/scripts/lib/scroll-to.js b/_includes/scripts/lib/scroll-to.js
new file mode 100644
index 0000000..e5a0ea2
--- /dev/null
+++ b/_includes/scripts/lib/scroll-to.js
@@ -0,0 +1,13 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
diff --git a/_includes/scripts/lib/swiper.js b/_includes/scripts/lib/swiper.js
new file mode 100644
index 0000000..3d06419
--- /dev/null
+++ b/_includes/scripts/lib/swiper.js
@@ -0,0 +1,203 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function swiper(options) {
+      var $window = $(window), $root = this, $swiperWrapper, $swiperSlides, $swiperButtonPrev, $swiperButtonNext,
+        initialSlide, animation, onChange, onChangeEnd,
+        rootWidth, count, preIndex, curIndex, translateX, CRITICAL_ANGLE = Math.PI / 3;
+
+      function setOptions(options) {
+        var _options = options || {};
+        initialSlide = _options.initialSlide || 0;
+        animation = _options.animation === undefined && true;
+        onChange = onChange || _options.onChange;
+        onChangeEnd = onChangeEnd || _options.onChangeEnd;
+      }
+
+      function init() {
+        $swiperWrapper = $root.find('.swiper__wrapper');
+        $swiperSlides = $root.find('.swiper__slide');
+        $swiperButtonPrev = $root.find('.swiper__button--prev');
+        $swiperButtonNext = $root.find('.swiper__button--next');
+        animation && $swiperWrapper.addClass('swiper__wrapper--animation');
+        calc(true);
+      }
+
+      function preCalc() {
+        rootWidth = $root.width();
+        count = $swiperWrapper.children('.swiper__slide').length;
+        if (count < 2) {
+          $swiperButtonPrev.addClass('d-none');
+          $swiperButtonNext.addClass('d-none');
+        }
+        curIndex = initialSlide || 0;
+        translateX = getTranslateXFromCurIndex();
+      }
+
+      var calc = (function() {
+        var preAnimation, $swiperSlide, $preSwiperSlide;
+        return function (needPreCalc, params) {
+          needPreCalc && preCalc();
+          var _animation = (params && params.animation !== undefined) ? params.animation : animation;
+          if (preAnimation === undefined || preAnimation !== _animation) {
+            preAnimation = _animation ? $swiperWrapper.addClass('swiper__wrapper--animation') :
+              $swiperWrapper.removeClass('swiper__wrapper--animation');
+          }
+          if (preIndex !== curIndex) {
+            ($preSwiperSlide = $swiperSlides.eq(preIndex)).removeClass('active');
+            ($swiperSlide = $swiperSlides.eq(curIndex)).addClass('active');
+            onChange && onChange(curIndex, $swiperSlides.eq(curIndex), $swiperSlide, $preSwiperSlide);
+            if (onChangeEnd) {
+              if (_animation) {
+                setTimeout(function() {
+                  onChangeEnd(curIndex, $swiperSlides.eq(curIndex), $swiperSlide, $preSwiperSlide);
+                }, 400);
+              } else {
+                onChangeEnd(curIndex, $swiperSlides.eq(curIndex), $swiperSlide, $preSwiperSlide);
+              }
+            }
+            preIndex = curIndex;
+          }
+          $swiperWrapper.css('transform', 'translate(' + translateX + 'px, 0)');
+          if (count > 1) {
+            if (curIndex <= 0) {
+              $swiperButtonPrev.addClass('disabled');
+            } else {
+              $swiperButtonPrev.removeClass('disabled');
+            }
+            if (curIndex >= count - 1) {
+              $swiperButtonNext.addClass('disabled');
+            } else {
+              $swiperButtonNext.removeClass('disabled');
+            }
+          }
+        };
+      })();
+
+      function getTranslateXFromCurIndex() {
+        return curIndex <= 0 ? 0 : - rootWidth * curIndex;
+      }
+
+      function moveToIndex(index ,params) {
+        preIndex = curIndex;
+        curIndex = index;
+        translateX = getTranslateXFromCurIndex();
+        calc(false, params);
+      }
+
+      function move(type) {
+        var nextIndex = curIndex, unstableTranslateX;
+        if (type === 'prev') {
+          nextIndex > 0 && nextIndex--;
+        } else if (type === 'next') {
+          nextIndex < count - 1 && nextIndex++;
+        }
+        if (type === 'cur') {
+          moveToIndex(curIndex, { animation: true });
+          return;
+        }
+        unstableTranslateX = translateX % rootWidth !== 0;
+        if (nextIndex !== curIndex || unstableTranslateX) {
+          unstableTranslateX ? moveToIndex(nextIndex, { animation: true }) : moveToIndex(nextIndex);
+        }
+      }
+
+      setOptions(options);
+      init();
+      preIndex = curIndex;
+
+      $swiperButtonPrev.on('click', function(e) {
+        e.stopPropagation();
+        move('prev');
+      });
+      $swiperButtonNext.on('click', function(e) {
+        e.stopPropagation();
+        move('next');
+      });
+      $window.on('resize', function() {
+        calc(true, { animation: false });
+      });
+
+      (function() {
+        var pageX, pageY, velocityX, preTranslateX = translateX, timeStamp, touching;
+        function handleTouchstart(e) {
+          var point = e.touches ? e.touches[0] : e;
+          pageX = point.pageX;
+          pageY = point.pageY;
+          velocityX = 0;
+          preTranslateX = translateX;
+        }
+        function handleTouchmove(e) {
+          if (e.touches && e.touches.length > 1) {
+            return;
+          }
+          var point = e.touches ? e.touches[0] : e;
+          var deltaX = point.pageX - pageX;
+          var deltaY = point.pageY - pageY;
+          velocityX = deltaX / (e.timeStamp - timeStamp);
+          timeStamp = e.timeStamp;
+          if (e.cancelable && Math.abs(Math.atan(deltaY / deltaX)) < CRITICAL_ANGLE) {
+            touching = true;
+            translateX += deltaX;
+            calc(false, { animation: false });
+          }
+          pageX = point.pageX;
+          pageY = point.pageY;
+        }
+        function handleTouchend() {
+          touching = false;
+          var deltaX = translateX - preTranslateX;
+          var distance = deltaX + velocityX * rootWidth;
+          if (Math.abs(distance) > rootWidth / 2) {
+            distance > 0 ? move('prev') : move('next');
+          } else {
+            move('cur');
+          }
+        }
+        $swiperWrapper.on('touchstart', handleTouchstart);
+        $swiperWrapper.on('touchmove', handleTouchmove);
+        $swiperWrapper.on('touchend', handleTouchend);
+        $swiperWrapper.on('touchcancel', handleTouchend);
+
+        (function() {
+          var pressing = false, moved = false;
+          $swiperWrapper.on('mousedown', function(e) {
+            pressing = true; handleTouchstart(e);
+          });
+          $swiperWrapper.on('mousemove', function(e) {
+            pressing && (e.preventDefault(), moved = true, handleTouchmove(e));
+          });
+          $swiperWrapper.on('mouseup', function(e) {
+            pressing && (pressing = false, handleTouchend(e));
+          });
+          $swiperWrapper.on('mouseleave', function(e) {
+            pressing && (pressing = false, handleTouchend(e));
+          });
+          $swiperWrapper.on('click', function(e) {
+            moved && (e.stopPropagation(), moved = false);
+          });
+        })();
+
+        $root.on('touchmove', function(e) {
+          if (e.cancelable & touching) {
+            e.preventDefault();
+          }
+        });
+      })();
+
+      return {
+        setOptions: setOptions,
+        previous: function(){
+          move('prev');
+        },
+        next: function(){
+          move('next');
+        },
+        refresh: function() {
+          calc(true, { animation: false });
+        }
+      };
+    }
+    $.fn.swiper = swiper;
+  });
+})();
diff --git a/_includes/scripts/lib/throttle.js b/_includes/scripts/lib/throttle.js
new file mode 100644
index 0000000..2add23c
--- /dev/null
+++ b/_includes/scripts/lib/throttle.js
@@ -0,0 +1,28 @@
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
diff --git a/_includes/scripts/lib/toc.js b/_includes/scripts/lib/toc.js
new file mode 100644
index 0000000..fb43857
--- /dev/null
+++ b/_includes/scripts/lib/toc.js
@@ -0,0 +1,107 @@
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
diff --git a/_includes/scripts/page.js b/_includes/scripts/page.js
new file mode 100644
index 0000000..91d05b9
--- /dev/null
+++ b/_includes/scripts/page.js
@@ -0,0 +1,3 @@
+/*(function () {
+
+})();*/
diff --git a/_includes/scripts/utils/imagesLoad.js b/_includes/scripts/utils/imagesLoad.js
new file mode 100644
index 0000000..63a6bdf
--- /dev/null
+++ b/_includes/scripts/utils/imagesLoad.js
@@ -0,0 +1,28 @@
+(function() {
+  window.imagesLoad = function(images) {
+    images = images || document.getElementsByTagName('img');
+    var imagesCount = images.length, loadedCount = 0, image;
+    var i, j, loaded = false, cbs = [];
+    imagesCount < 1 && (loaded = true);
+    for (i = 0; i < imagesCount; i++) {
+      image = images[i];
+      image.complete ? handleImageLoad() : image.addEventListener('load', handleImageLoad);
+    }
+    function handleImageLoad() {
+      loadedCount++;
+      if (loadedCount === imagesCount) {
+        loaded = true;
+        if (cbs.length > 0) {
+          for (j = 0; j < cbs.length; j++) {
+            cbs[j]();
+          }
+        }
+      }
+    }
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  };
+})();
diff --git a/_includes/scripts/utils/utils.js b/_includes/scripts/utils/utils.js
new file mode 100644
index 0000000..e7bce45
--- /dev/null
+++ b/_includes/scripts/utils/utils.js
@@ -0,0 +1,39 @@
+(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
diff --git a/_includes/scripts/variables.html b/_includes/scripts/variables.html
new file mode 100644
index 0000000..5bd1770
--- /dev/null
+++ b/_includes/scripts/variables.html
@@ -0,0 +1,35 @@
+{%- include snippets/get-sources.html -%}
+{%- assign _sources = __return -%}
+
+{%- include snippets/get-nav-url.html path="/assets/search.js" -%}
+{%- assign _paths_search_js = __return -%}
+
+<script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: '{{ _sources.font_awesome }}',
+        jquery: '{{ _sources.jquery }}',
+        leancloud_js_sdk: '{{ _sources.leancloud_js_sdk }}',
+        chart: '{{ _sources.chart }}',
+        gitalk: {
+          js: '{{ _sources.gitalk.js }}',
+          css: '{{ _sources.gitalk.css }}'
+        },
+        valine: '{{ _sources.valine }}',
+        mathjax: '{{ _sources.mathjax }}',
+        mermaid: '{{ _sources.mermaid }}'
+      },
+      site: {
+        toc: {
+          selectors: '{{ site.toc.selectors | default: site.data.variables.default.toc.selectors }}'
+        }
+      },
+      paths: {
+        search_js: '{{ _paths_search_js }}'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
diff --git a/_includes/search-providers/custom/search.html b/_includes/search-providers/custom/search.html
new file mode 100644
index 0000000..1d7eba3
--- /dev/null
+++ b/_includes/search-providers/custom/search.html
@@ -0,0 +1,3 @@
+<!-- start custom search snippet -->
+
+<!-- end custom search snippet -->
diff --git a/_includes/search-providers/default/search-data.js b/_includes/search-providers/default/search-data.js
new file mode 100644
index 0000000..f20e0c5
--- /dev/null
+++ b/_includes/search-providers/default/search-data.js
@@ -0,0 +1,14 @@
+window.TEXT_SEARCH_DATA={
+  {%- for _collection in site.collections -%}
+    {%- unless forloop.first -%},{%- endunless -%}
+    '{{ _collection.label }}':[
+      {%- for _article in _collection.docs -%}
+      {%- unless forloop.first -%},{%- endunless -%}
+      {'title':{{ _article.title | jsonify }},
+      {%- include snippets/prepend-baseurl.html path=_article.url -%}
+      {%- assign _url = __return -%}
+      'url':{{ _url | jsonify }}}
+      {%- endfor -%}
+    ]
+  {%- endfor -%}
+};
diff --git a/_includes/search-providers/default/search.html b/_includes/search-providers/default/search.html
new file mode 100644
index 0000000..a21512c
--- /dev/null
+++ b/_includes/search-providers/default/search.html
@@ -0,0 +1,18 @@
+<div class="search search--dark">
+  <div class="main">
+    <div class="search__header">{{ _locale_search }}</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        {{ _locale_cancel }}</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>{%- include search-providers/default/search.js -%}</script>
diff --git a/_includes/search-providers/default/search.js b/_includes/search-providers/default/search.js
new file mode 100644
index 0000000..bf69c28
--- /dev/null
+++ b/_includes/search-providers/default/search.js
@@ -0,0 +1,112 @@
+var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
diff --git a/_includes/search-providers/google-custom-search-engine/search.html b/_includes/search-providers/google-custom-search-engine/search.html
new file mode 100644
index 0000000..cf132ab
--- /dev/null
+++ b/_includes/search-providers/google-custom-search-engine/search.html
@@ -0,0 +1,21 @@
+{%- if site.search.google.custom_search_engine_id -%}
+  <div class="search search--dark search--google-custom-search-engine">
+    <div class="main">
+      <div class="content js-gcse">
+        <!-- <gcse:search enableAutoComplete="true" gname="search-box"></gcse:search>
+        <gcse:searchresults-only gname="results"></gcse:searchresults-only> -->
+      </div>
+    </div>
+  </div>
+  <script>
+    var gcse = document.getElementsByClassName('js-gcse')[0];
+    var gcseSearch = document.createElement('gcse:search');
+    gcseSearch.setAttribute('enableAutoComplete', 'true');
+    gcseSearch.setAttribute('gname', 'search-box');
+    var gcseSearchresults = document.createElement('gcse:searchresults-only');
+    gcseSearchresults.setAttribute('gname', 'results');
+    gcse.appendChild(gcseSearch);
+    gcse.appendChild(gcseSearchresults);
+  </script>
+  <script>{%- include search-providers/google-custom-search-engine/search.js -%}</script>
+{%- endif -%}
diff --git a/_includes/search-providers/google-custom-search-engine/search.js b/_includes/search-providers/google-custom-search-engine/search.js
new file mode 100644
index 0000000..09e5273
--- /dev/null
+++ b/_includes/search-providers/google-custom-search-engine/search.js
@@ -0,0 +1,33 @@
+var SOURCES = window.TEXT_VARIABLES.sources;
+window.Lazyload.js(SOURCES.jquery, function() {
+  /* global google */
+  var search = (window.search || (window.search = {}));
+  var searchBox, searchInput, clearIcon, searchModal;
+
+  search.clear = function() {
+    searchBox && searchBox.clearAllResults();
+  };
+  search.onShow = function() {
+    searchInput && searchInput.focus();
+  };
+  search.onHide = function() {
+    searchInput && searchInput.blur();
+  };
+
+  window.__gcse = {
+    callback: function() {
+      searchBox = google.search.cse.element.getElement('search-box');
+      searchInput = document.getElementById('gsc-i-id1');
+      clearIcon = document.getElementById('gs_cb50');
+      searchModal = search.searchModal;
+      searchModal && searchModal.$el && searchModal.$el.on('click', function(e) {
+        (e.target === this || e.target === clearIcon || e.target.className === 'gs-title') && searchModal.hide();
+      });
+    }
+  };
+  var cx = '{{ site.search.google.custom_search_engine_id }}'; // Insert your own Custom Search Engine ID here
+  var gcse = document.createElement('script'); gcse.type = 'text/javascript'; gcse.async = true;
+  gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
+    '//cse.google.com/cse.js?cx=' + cx;
+  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s);
+});
diff --git a/_includes/search.html b/_includes/search.html
new file mode 100644
index 0000000..680dd35
--- /dev/null
+++ b/_includes/search.html
@@ -0,0 +1,20 @@
+{%- include snippets/get-locale-string.html key='CANCEL' -%}
+{%- assign _locale_cancel = __return -%}
+{%- include snippets/get-locale-string.html key='SEARCH' -%}
+{%- assign _locale_search = __return -%}
+
+{%- if site.search.provider == 'google' -%}
+  <script>window.useDefaultSearchBox = false;</script>
+{%- endif -%}
+
+{%- if site.search.provider -%}
+  <script>{%- include scripts/components/search.js -%}</script>
+{%- endif -%}
+
+{%- if site.search.provider == 'default' -%}
+  {%- include search-providers/default/search.html -%}
+{%- elsif site.search.provider == 'google' -%}
+  {%- include search-providers/google-custom-search-engine/search.html -%}
+{%- elsif site.search.provider == 'custom' -%}
+  {%- include search-providers/custom/search.html -%}
+{%- endif -%}
diff --git a/_includes/sharing-providers/addthis.html b/_includes/sharing-providers/addthis.html
new file mode 100644
index 0000000..f2364d3
--- /dev/null
+++ b/_includes/sharing-providers/addthis.html
@@ -0,0 +1,9 @@
+<!-- Addthis BEGIN -->
+{%- assign _SHARING_ADDTHIS_ID = site.sharing.addthis.id -%}
+
+{%- if _SHARING_ADDTHIS_ID -%}
+  <script type="text/javascript"
+    src="//s7.addthis.com/js/300/addthis_widget.js#pubid={{ _SHARING_ADDTHIS_ID }}"></script>
+  <div class="addthis_inline_share_toolbox addthis_default_style"></div>
+{%- endif -%}
+<!-- Addthis END -->
diff --git a/_includes/sharing-providers/addtoany.html b/_includes/sharing-providers/addtoany.html
new file mode 100644
index 0000000..a433a1b
--- /dev/null
+++ b/_includes/sharing-providers/addtoany.html
@@ -0,0 +1,10 @@
+<!-- AddToAny BEGIN -->
+<div class="a2a_kit a2a_kit_size_32 a2a_default_style">
+<a class="a2a_dd" href="https://www.addtoany.com/share"></a>
+<a class="a2a_button_facebook"></a>
+<a class="a2a_button_twitter"></a>
+<a class="a2a_button_google_plus"></a>
+<a class="a2a_button_linkedin"></a>
+</div>
+<script async src="https://static.addtoany.com/menu/page.js"></script>
+<!-- AddToAny END -->
diff --git a/_includes/sharing-providers/custom.html b/_includes/sharing-providers/custom.html
new file mode 100644
index 0000000..d2b17d2
--- /dev/null
+++ b/_includes/sharing-providers/custom.html
@@ -0,0 +1,3 @@
+<!-- start custom sharing snippet -->
+
+<!-- end custom sharing snippet -->
diff --git a/_includes/sharing.html b/_includes/sharing.html
new file mode 100644
index 0000000..f585346
--- /dev/null
+++ b/_includes/sharing.html
@@ -0,0 +1,7 @@
+{%- if site.sharing.provider == 'addtoany' -%}
+  {%- include sharing-providers/addtoany.html -%}
+{%- elsif site.sharing.provider == 'addthis' -%}
+  {%- include sharing-providers/addthis.html -%}
+  {%- elsif site.sharing.provider == 'custom' -%}
+  {%- include sharing-providers/custom.html -%}
+{%- endif -%}
diff --git a/_includes/sidebar.html b/_includes/sidebar.html
deleted file mode 100644
index ced93f3..0000000
--- a/_includes/sidebar.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="col-box col-box-author">
-  <img class="avatar" src="{{ site.avatar }}" alt="{{ site.author }}">
-  <div class="col-box-title name">{{ site.author }}</div>
-  <p>{{ site.profile }}</p>
-  <p class="contact">
-    {% if site.github_username %}
-    <a href="https://github.com/{{ site.github_username }}">GitHub</a>
-    {% endif %}
-    {% if site.twitter_username %}
-    <a href="https://twitter.com/{{ site.twitter_username }}">Twitter</a>
-    {% endif %}
-    {% if site.email %}
-    <a href="mailto:{{ site.email }}">Email</a>
-    {% endif %}
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    {% for post in site.posts limit:5 %}
-      <li><a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a></li>
-    {% endfor %}
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
\ No newline at end of file
diff --git a/_includes/sidebar/toc.html b/_includes/sidebar/toc.html
new file mode 100644
index 0000000..4e3469e
--- /dev/null
+++ b/_includes/sidebar/toc.html
@@ -0,0 +1,25 @@
+{%- if page.sidebar.nav -%}
+  <div class="sidebar-toc">
+    {%- assign _sidebar_nav = site.data.navigation[page.sidebar.nav] -%}
+    {%- if _sidebar_nav -%}
+    <ul class="toc toc--navigator">
+      {%- for _item in _sidebar_nav -%}
+        <li class="toc-h1">{{ _item.title }}</li>
+        {%- if _item.children -%}
+          {%- for _child in _item.children -%}
+            {%- include snippets/get-nav-url.html path=_child.url -%}
+            {%- assign _nav_url = __return -%}
+            {%- include snippets/get-nav-url.html path=page.url -%}
+            {%- assign _page_url = __return -%}
+            {%- if _nav_url == _page_url -%}
+              <li class="toc-h2 active"><a href="{{ _nav_url }}">{{ _child.title }}</a></li>
+            {%- else -%}
+              <li class="toc-h2"><a href="{{ _nav_url }}">{{ _child.title }}</a></li>
+            {%- endif -%}
+          {%- endfor -%}
+        {%- endif -%}
+      {%- endfor -%}
+      </ul>
+    {%- endif -%}
+  </div>
+{%- endif -%}
\ No newline at end of file
diff --git a/_includes/snippets/assign.html b/_includes/snippets/assign.html
new file mode 100644
index 0000000..c2691f5
--- /dev/null
+++ b/_includes/snippets/assign.html
@@ -0,0 +1,9 @@
+{%- if include.source1 == nil -%}
+  {%- if include.source0 == nil -%}
+    {%- assign __return = include.target -%}
+  {%- else -%}
+    {%- assign __return = include.source0 -%}
+  {%- endif -%}
+{%- else -%}
+  {%- assign __return = include.source1 -%}
+{%- endif -%}
diff --git a/_includes/snippets/get-article-title.html b/_includes/snippets/get-article-title.html
new file mode 100644
index 0000000..395b793
--- /dev/null
+++ b/_includes/snippets/get-article-title.html
@@ -0,0 +1,11 @@
+{%- assign _title = include.article.title | default: layout.title -%}
+{%- assign _titles = include.article.titles | default: layout.titles -%}
+
+{%- if _title -%}
+  {%- assign __return = _title -%}
+{%- elsif _titles -%}
+  {%- include snippets/get-string-from-locale-config.html locale=_titles -%}
+  {%- assign __return = __return -%}
+{%- else -%}
+  {%- assign __return = nil -%}
+{%- endif -%}
diff --git a/_includes/snippets/get-lang.html b/_includes/snippets/get-lang.html
new file mode 100644
index 0000000..028c52a
--- /dev/null
+++ b/_includes/snippets/get-lang.html
@@ -0,0 +1,6 @@
+{%- assign __return = site.data.variables.default.lang -%}
+{%- if page.lang -%}
+  {%- assign __return = page.lang -%}
+{%- elsif site.lang -%}
+  {%- assign __return = site.lang -%}
+{%- endif -%}
diff --git a/_includes/snippets/get-locale-string.html b/_includes/snippets/get-locale-string.html
new file mode 100644
index 0000000..a7069ae
--- /dev/null
+++ b/_includes/snippets/get-locale-string.html
@@ -0,0 +1,12 @@
+{%- include snippets/get-lang.html -%}
+{%- assign _lang = __return -%}
+{%- assign _local_lang = site.data.locale[_lang] -%}
+{%- assign _local_lang_en = site.data.locale.en -%}
+{%- if _local_lang == nil -%}
+ {%- assign _local_lang = _local_lang_en -%}
+{%- endif -%}
+{%- if _local_lang[include.key] -%}
+  {%- assign __return = _local_lang[include.key] -%}
+{%- else -%}
+  {%- assign __return = _local_lang_en[include.key] -%}
+{%- endif -%}
diff --git a/_includes/snippets/get-nav-url.html b/_includes/snippets/get-nav-url.html
new file mode 100644
index 0000000..3b1b122
--- /dev/null
+++ b/_includes/snippets/get-nav-url.html
@@ -0,0 +1,8 @@
+{%- assign _pre7 = include.path | slice: 0, 7 -%}
+{%- assign _pre8 = include.path | slice: 0, 8 -%}
+{%- if _pre7 == 'http://' or _pre8 == 'https://' -%}
+  {%- assign __return = include.path -%}
+{%- else -%}
+  {%- include snippets/prepend-baseurl.html path=include.path -%}
+  {%- assign __return = __return -%}
+{%- endif -%}
diff --git a/_includes/snippets/get-sources.html b/_includes/snippets/get-sources.html
new file mode 100644
index 0000000..0de1cb5
--- /dev/null
+++ b/_includes/snippets/get-sources.html
@@ -0,0 +1,2 @@
+{%- assign _sources = site.sources | default: site.data.variables.default.sources -%}
+{%- assign __return = site.data.variables.sources[_sources] -%}
diff --git a/_includes/snippets/get-string-from-locale-config.html b/_includes/snippets/get-string-from-locale-config.html
new file mode 100644
index 0000000..03325fa
--- /dev/null
+++ b/_includes/snippets/get-string-from-locale-config.html
@@ -0,0 +1,7 @@
+{%- include snippets/get-lang.html -%}
+{%- assign _lang = __return -%}
+{%- if include.locale[_lang] -%}
+  {%- assign __return = include.locale[_lang] -%}
+{%- else -%}
+  {%- assign __return = include.locale.en -%}
+{%- endif -%}
diff --git a/_includes/snippets/is_collection.html b/_includes/snippets/is_collection.html
new file mode 100644
index 0000000..559a624
--- /dev/null
+++ b/_includes/snippets/is_collection.html
@@ -0,0 +1,6 @@
+{%- assign _page_path_first_char = include.page.path | slice: 0, 1 -%}
+{%- if _page_path_first_char == '_' -%}
+  {%- assign __return = true -%}
+{%- else -%}
+  {%- assign __return = false -%}
+{%- endif -%}
diff --git a/_includes/snippets/page-url.html b/_includes/snippets/page-url.html
new file mode 100644
index 0000000..3e9815d
--- /dev/null
+++ b/_includes/snippets/page-url.html
@@ -0,0 +1,2 @@
+{%- include snippets/prepend-baseurl.html path=page.url -%}
+{{ __return | prepend: site.url }}
\ No newline at end of file
diff --git a/_includes/snippets/prepend-baseurl.html b/_includes/snippets/prepend-baseurl.html
new file mode 100644
index 0000000..d5d24ef
--- /dev/null
+++ b/_includes/snippets/prepend-baseurl.html
@@ -0,0 +1,4 @@
+{%- assign _include_path_replace_index = include.path | replace: 'index.html', '' -%}
+{%- include snippets/prepend-path.html
+  path=_include_path_replace_index
+  prepend_path=site.baseurl -%}
\ No newline at end of file
diff --git a/_includes/snippets/prepend-path.html b/_includes/snippets/prepend-path.html
new file mode 100644
index 0000000..5f6e904
--- /dev/null
+++ b/_includes/snippets/prepend-path.html
@@ -0,0 +1 @@
+{%- assign __return = include.path | prepend: '/' | prepend: include.prepend_path | replace:'///','/' | replace:'//','/' -%}
diff --git a/_includes/svg/icon/social/behance.svg b/_includes/svg/icon/social/behance.svg
new file mode 100644
index 0000000..bba499c
--- /dev/null
+++ b/_includes/svg/icon/social/behance.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M1056.000001 193.714286l-292 0 0 70.857143 292 0 0-70.857143zm-144 243.428571q-51.428571 0-83.428571 30t-35.428571 81.428571l233.142857 0q-10.285714-111.428571-114.285714-111.428571zm9.142857 334.285714q36 0 69.714286-18.285714t43.428571-49.714286l126.285714 0q-57.142857 175.428571-244 175.428571-122.285714 0-194.571429-75.428571t-72.285714-198.285714q0-118.857143 74.571429-197.428571t192.285714-78.571429q78.857143 0 137.428571 38.857143t87.428571 102.285714 28.857143 141.714286q0 9.714286-1.142857 26.857143l-376 0q0 63.428571 32.857143 98t95.142857 34.571429zm-762.857143-28.571429l169.142857 0q117.142857 0 117.142857-95.428571 0-102.857143-113.714286-102.857143l-172.571429 0 0 198.285714zm0-306.857143l160.571429 0q44.571429 0 70.571429-20.857143t26-64.857143q0-82.285714-108.571429-82.285714l-148.571429 0 0 168zm-158.285714-290.857143l339.428571 0q49.714286 0 88.571429 8t72.285714 27.142857 51.428571 55.142857 18 88q0 103.428571-98.285714 150.285714 65.142857 18.285714 98.285714 65.714286t33.142857 116.571429q0 42.857143-14 78t-37.714286 59.142857-56.285714 40.571429-69.142857 24-76.571429 7.428571l-349.142857 0 0-720z" />
+</svg>
diff --git a/_includes/svg/icon/social/douban.svg b/_includes/svg/icon/social/douban.svg
new file mode 100644
index 0000000..42a07d5
--- /dev/null
+++ b/_includes/svg/icon/social/douban.svg
@@ -0,0 +1,5 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M161.431 147.172l699.701 0 0 78.813-699.701 0 0-78.814z" />
+  <path d="M800.298 616.311l0-308.108-578.031 0 0 308.108 578.031 0zM306.076 386.961l411.23 0 0 150.633-411.23 0 0-150.633z" />
+  <path d="M675.281 793.89c25.15-38.487 48.885-83.129 70.879-133.81l-84.107-30.649c-21.885 60.046-47.337 114.974-76.324 164.459l-146.332 0c-24.225-64.156-51.607-119.031-82.313-164.459l-77.357 30.649c31.9 47.851 57.651 92.383 77.357 133.81l-215.414 0 0 77.957 739.278 0 0-77.957-205.67 0z" />
+</svg>
diff --git a/_includes/svg/icon/social/facebook.svg b/_includes/svg/icon/social/facebook.svg
new file mode 100644
index 0000000..ba901bd
--- /dev/null
+++ b/_includes/svg/icon/social/facebook.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M767.428571 6.857143l0 150.857143-89.714286 0q-49.142857 0-66.285714 20.571429t-17.142857 61.714286l0 108 167.428571 0-22.285714 169.142857-145.142857 0 0 433.714286-174.857143 0 0-433.714286-145.714286 0 0-169.142857 145.714286 0 0-124.571429q0-106.285714 59.428571-164.857143t158.285714-58.571429q84 0 130.285714 6.857143z" />
+</svg>
diff --git a/_includes/svg/icon/social/flicker.svg b/_includes/svg/icon/social/flicker.svg
new file mode 100644
index 0000000..eaacc73
--- /dev/null
+++ b/_includes/svg/icon/social/flicker.svg
@@ -0,0 +1,5 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M512 996.693333C245.76 996.693333 27.306667 778.24 27.306667 512 27.306667 245.76 245.76 27.306667 512 27.306667c266.24 0 484.693333 218.453333 484.693333 484.693333C996.693333 778.24 778.24 996.693333 512 996.693333zM512 78.506667C273.066667 78.506667 78.506667 273.066667 78.506667 512S273.066667 945.493333 512 945.493333 945.493333 750.933333 945.493333 512 750.933333 78.506667 512 78.506667z" />
+  <path d="M655.36 512m-129.706667 0a3.8 3.8 0 1 0 259.413333 0 3.8 3.8 0 1 0-259.413333 0Z" />
+  <path d="M368.64 512m-129.706667 0a3.8 3.8 0 1 0 259.413333 0 3.8 3.8 0 1 0-259.413333 0Z" />
+</svg>
diff --git a/_includes/svg/icon/social/github.svg b/_includes/svg/icon/social/github.svg
new file mode 100644
index 0000000..c5439a9
--- /dev/null
+++ b/_includes/svg/icon/social/github.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
diff --git a/_includes/svg/icon/social/googleplus.svg b/_includes/svg/icon/social/googleplus.svg
new file mode 100644
index 0000000..69ab1e5
--- /dev/null
+++ b/_includes/svg/icon/social/googleplus.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M621.31315 72.459289l-228.995461 0c-60.030212 0-135.601374 8.695033-198.98189 59.797921-47.839565 40.21184-71.180156 95.678106-71.180156 145.682987 0 84.786035 66.730821 170.671101 184.5369 170.671101 11.150968 0 23.341614-1.098008 35.619242-2.167363-5.574972 13.028735-11.122315 23.89113-11.122315 42.407855 0 33.68417 17.73799 54.338582 33.308617 73.894987-50.004881 3.264347-143.401014 8.695033-212.32785 50.005904-65.60416 38.046524-85.59547 93.483114-85.59547 132.624577 0 80.453357 77.794807 155.476027 239.019769 155.476027 191.20988 0 292.377-103.274108 292.377-205.451232 0-75.021647-44.402279-111.99984-93.367481-152.21168l-40.037878-30.447453c-12.219299-9.764388-28.887934-22.821775-28.887934-46.741557 0-23.890107 16.668635-39.142485 31.141254-53.269227 46.654576-35.879162 93.366458-73.925686 93.366458-154.37802 0-82.619696-53.357232-126.096906-78.951143-146.751319l68.926836 0L621.31315 72.459289zM523.497357 737.809909c0 67.367317-56.678884 117.373221-163.419953 117.373221-118.961392 0-195.687868-55.43659-195.687868-132.626623 0-77.18901 71.180156-103.274108 95.619778-111.969141 46.683229-15.223726 106.74107-17.419741 116.765377-17.419741 11.092639 0 16.638959 0 25.536606 1.098008C486.838436 652.994198 523.497357 682.316014 523.497357 737.809909zM434.608887 387.745045c-17.822924 17.36039-47.895847 30.447453-75.658144 30.447453-95.591125 0-138.980331-120.694873-138.980331-193.521528 0-28.281113 5.547343-57.631582 24.496927-80.453357 17.795295-21.75242 48.879244-35.879162 77.794807-35.879162 92.298126 0 140.078339 121.763205 140.078339 200.021569C462.341508 327.916425 460.116841 362.727255 434.608887 387.745045zM842.798567 238.016929 842.798567 127.57763l-55.464219 0 0 110.439298L676.402839 238.016929l0 55.234999 110.930485 0 0 110.438275 55.464219 0L842.797543 293.251927l110.929462 0 0-55.234999L842.798567 238.016929z" />
+</svg>
diff --git a/_includes/svg/icon/social/linkedin.svg b/_includes/svg/icon/social/linkedin.svg
new file mode 100644
index 0000000..3c26dbc
--- /dev/null
+++ b/_includes/svg/icon/social/linkedin.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M260.096 155.648c0 27.307008-9.899008 50.516992-29.696 69.632-19.796992 19.115008-45.396992 28.672-76.8 28.672-30.036992 0-54.612992-9.556992-73.728-28.672-19.115008-19.115008-28.672-42.324992-28.672-69.632 0-28.672 9.556992-52.224 28.672-70.656 19.115008-18.432 44.372992-27.648 75.776-27.648 31.403008 0 56.32 9.216 74.752 27.648 18.432 18.432 28.331008 41.984 29.696 70.656 0 0 0 0 0 0m-202.752 808.96c0 0 0-632.832 0-632.832 0 0 196.608 0 196.608 0 0 0 0 632.832 0 632.832 0 0-196.608 0-196.608 0 0 0 0 0 0 0m313.344-430.08c0-58.708992-1.364992-126.292992-4.096-202.752 0 0 169.984 0 169.984 0 0 0 10.24 88.064 10.24 88.064 0 0 4.096 0 4.096 0 40.96-68.267008 105.812992-102.4 194.56-102.4 68.267008 0 123.220992 22.868992 164.864 68.608 41.643008 45.739008 62.464 113.664 62.464 203.776 0 0 0 374.784 0 374.784 0 0-196.608 0-196.608 0 0 0 0-350.208 0-350.208 0-91.476992-33.451008-137.216-100.352-137.216-47.787008 0-81.236992 24.576-100.352 73.728-4.096 8.192-6.144 24.576-6.144 49.152 0 0 0 364.544 0 364.544 0 0-198.656 0-198.656 0 0 0 0-430.08 0-430.08 0 0 0 0 0 0" />
+</svg>
diff --git a/_includes/svg/icon/social/mail.svg b/_includes/svg/icon/social/mail.svg
new file mode 100644
index 0000000..a0d0751
--- /dev/null
+++ b/_includes/svg/icon/social/mail.svg
@@ -0,0 +1,6 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M512.091 166.946c116.242 0 232.484-0.014 348.727 0.007 41.522 0.008 76.321 12.188 94.842 53.167 8.25 18.251 6.5 30.831-13.43 43.256-137.452 85.695-274.125 172.655-410.534 260.014-14.762 9.456-24.638 9.569-39.498 0.041C354.353 435.041 216.033 347.399 77.465 260.14c-12.701-8.002-16.368-15.572-12.01-29.962 9.882-32.627 30.845-52.873 63.868-59.66 13.656-2.806 27.953-3.4 41.966-3.431C284.888 166.83 398.492 166.943 512.091 166.946z" />
+  <path d="M510.888 856.021c-117.998 0-235.996 0.134-353.993-0.067-47.671-0.083-79.295-22.331-91.17-61.206-4.28-14.027-2.127-22.232 10.858-30.356 108.193-67.725 215.807-136.366 324.233-203.713 7.275-4.519 21.51-4.25 29.378-0.171 22.589 11.713 44.026 25.859 64.999 40.383 11.823 8.191 21.091 8.623 33.117 0.325 20.993-14.484 43.689-26.52 64.549-41.176 12.159-8.539 20.73-7.176 32.785 0.537 106.04 67.844 212.318 135.315 319.158 201.894 16.481 10.272 18.065 21.564 12.577 37.407-12.35 35.666-45.183 55.999-92.491 56.081C746.889 856.149 628.886 856.021 510.888 856.021z" />
+  <path d="M64.376 326.925c97.051 61.769 192.332 122.409 290.508 184.898-97.877 62.309-192.719 122.68-290.508 184.932C64.376 572.674 64.376 451.511 64.376 326.925z" />
+  <path d="M959.665 327.168c0 124.369 0 244.164 0 369.253-97.913-62.322-192.914-122.792-290.001-184.589C766.993 449.854 861.628 389.595 959.665 327.168z" />
+</svg>
diff --git a/_includes/svg/icon/social/medium.svg b/_includes/svg/icon/social/medium.svg
new file mode 100644
index 0000000..2dfdd92
--- /dev/null
+++ b/_includes/svg/icon/social/medium.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M834.7 279.8l61.3-58.9V208H683.7L532.4 586.4 360.3 208H137.7v12.9l71.6 86.6c7 6.4 10.6 15.8 9.7 25.2V673c2.2 12.3-1.7 24.8-10.3 33.7L128 805v12.7h228.6v-12.9l-80.6-98a39.99 39.99 0 0 1-11.1-33.7V378.7l200.7 439.2h23.3l172.6-439.2v349.9c0 9.2 0 11.1-6 17.2l-62.1 60.3V819h301.2v-12.9l-59.9-58.9c-5.2-4-7.9-10.7-6.8-17.2V297a18.1 18.1 0 0 1 6.8-17.2z"></path>
+</svg>
diff --git a/_includes/svg/icon/social/npm.svg b/_includes/svg/icon/social/npm.svg
new file mode 100644
index 0000000..c382c30
--- /dev/null
+++ b/_includes/svg/icon/social/npm.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" version="1.1" width="24px" height="24px">
+<g id="surface1">
+<path style=" fill:#D50000;" d="M 0 15 L 48 15 L 48 32 L 24 32 L 24 35 L 13 35 L 13 32 L 0 32 Z "/>
+<path style=" fill:#FFFFFF;" d="M 3 29 L 8 29 L 8 21 L 11 21 L 11 29 L 13 29 L 13 18 L 3 18 Z "/>
+<path style=" fill:#FFFFFF;" d="M 16 18 L 16 32 L 21 32 L 21 29 L 26 29 L 26 18 Z M 24 26 L 21 26 L 21 21 L 24 21 Z "/>
+<path style=" fill:#FFFFFF;" d="M 29 18 L 29 29 L 34 29 L 34 21 L 37 21 L 37 29 L 40 29 L 40 21 L 43 21 L 43 29 L 45 29 L 45 18 Z "/>
+</g>
+</svg>
diff --git a/_includes/svg/icon/social/pinterest.svg b/_includes/svg/icon/social/pinterest.svg
new file mode 100644
index 0000000..68f400b
--- /dev/null
+++ b/_includes/svg/icon/social/pinterest.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M444.56 671.968c-16.832 85.472-35.936 155.392-57.296 209.776S333.84 978.224 291.104 1008c-5.184-29.776-7.12-62.48-5.824-98.096 1.264-35.616 3.2-66.352 5.824-92.256 2.592-25.904 7.44-55.04 14.576-87.408 7.088-32.368 13.888-60.224 20.4-83.536 6.464-23.296 13.888-50.816 22.336-82.544 8.416-31.712 14.56-58.56 18.448-80.608-12.96-24.576-19.424-53.088-19.424-85.472 0-32.336 5.504-62.16 16.512-89.344 10.976-27.2 28.464-47.888 52.432-62.16 23.968-14.24 50.176-16.192 78.672-5.824 27.2 11.664 42.08 31.744 44.672 60.208 2.592 28.496-1.936 59.92-13.6 94.208-11.648 34.32-22.656 68.32-33.008 101.984-10.384 33.696-11.664 63.44-3.888 89.344 7.76 25.888 28.48 42.08 62.16 48.544 45.312 9.072 85.776-3.872 121.392-38.848 35.616-34.96 60.224-77.984 73.808-129.168 13.6-51.152 17.152-104.56 10.688-160.24-6.48-55.648-24.608-98.384-54.384-128.192-32.368-33.664-71.216-55.648-116.528-66.032-45.328-10.352-89.36-8.736-132.096 4.864-42.72 13.6-81.904 34.32-117.504 62.16-35.648 27.872-62.48 63.792-80.608 107.792-18.16 44.016-23.312 90.016-15.536 137.904 2.592 12.944 7.776 26.224 15.536 39.824 7.776 13.6 14.576 24.96 20.4 34 5.824 9.056 8.416 21.68 7.76 37.872-0.672 16.208-6.8 33.984-18.448 53.408-97.12-22-143.728-97.76-139.84-227.248 3.888-91.936 39.136-169.632 105.856-233.072 66.688-63.424 143.408-100.336 230.176-110.72 108.768-11.648 204.592 7.12 287.456 56.336 82.88 49.232 130.8 121.728 143.728 217.552 10.352 73.808 4.528 145.664-17.488 215.6-22 69.92-59.568 126.576-112.656 169.952-53.072 43.392-115.232 62.48-186.448 57.312-14.256-1.296-27.52-4.224-39.808-8.752-12.32-4.528-22.336-9.056-30.112-13.6-7.76-4.528-18.16-11.328-31.072-20.384C462.688 684.288 452.336 677.152 444.56 671.968z" />
+</svg>
\ No newline at end of file
diff --git a/_includes/svg/icon/social/qq.svg b/_includes/svg/icon/social/qq.svg
new file mode 100644
index 0000000..a305a5b
--- /dev/null
+++ b/_includes/svg/icon/social/qq.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M116.434944 581.71392c-33.540096 78.963712-38.984704 154.297344-12.058624 168.370176 18.572288 9.696256 47.685632-12.382208 74.93632-52.909056 10.790912 44.156928 37.492736 84.13696 75.63264 116.209664-40.003584 14.768128-66.13504 38.8864-66.13504 66.23232 0 44.9536 70.709248 81.301504 157.9776 81.301504 78.715904 0 143.906816-29.538304 155.93984-68.371456 3.231744-0.049152 15.663104-0.049152 18.79552 0 12.0832 38.784 77.324288 68.371456 155.988992 68.371456 87.267328 0 157.9776-36.39808 157.9776-81.301504 0-27.296768-26.104832-51.464192-66.13504-66.23232 38.088704-32.12288 64.888832-72.052736 75.630592-116.209664 27.250688 40.526848 56.290304 62.605312 74.887168 52.909056 26.949632-14.072832 21.630976-89.455616-12.032-168.370176-26.354688-62.058496-62.109696-107.754496-89.45664-117.848064 0.398336-3.929088 0.595968-7.957504 0.595968-11.93472 0-23.967744-6.66112-46.145536-18.049024-64.195584 0.198656-1.39264 0.198656-2.834432 0.198656-4.227072 0-11.037696-2.635776-21.38112-7.113728-30.331904-6.908928-161.308672-111.930368-289.401856-281.86624-289.401856-170.036224 0-275.105792 128.093184-281.94304 289.401856-4.525056 9.00096-7.135232 19.34336-7.135232 30.331904 0 1.39264 0.099328 2.835456 0.149504 4.227072-11.287552 18.050048-17.95072 40.177664-17.95072 64.195584 0 3.97824 0.149504 7.955456 0.497664 11.93472C178.61632 473.959424 142.739456 519.706624 116.434944 581.71392z" />
+</svg>
diff --git a/_includes/svg/icon/social/telegram.svg b/_includes/svg/icon/social/telegram.svg
new file mode 100644
index 0000000..1fc8d78
--- /dev/null
+++ b/_includes/svg/icon/social/telegram.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px">
+    <path style="line-height:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;isolation:auto;mix-blend-mode:normal" d="M 20.302734 2.984375 C 20.013769 2.996945 19.748583 3.080055 19.515625 3.171875 C 19.300407 3.256634 18.52754 3.5814726 17.296875 4.0976562 C 16.06621 4.61384 14.435476 5.2982348 12.697266 6.0292969 C 9.2208449 7.4914211 5.314238 9.1361259 3.3125 9.9785156 C 3.243759 10.007156 2.9645852 10.092621 2.65625 10.328125 C 2.3471996 10.564176 2.0039062 11.076462 2.0039062 11.636719 C 2.0039062 12.088671 2.2295201 12.548966 2.5019531 12.8125 C 2.7743861 13.076034 3.0504903 13.199244 3.28125 13.291016 C 3.9563403 13.559857 6.0424892 14.392968 6.9492188 14.755859 C 7.2668647 15.707799 8.0129251 17.950071 8.1875 18.501953 L 8.1855469 18.501953 C 8.3275588 18.951162 8.4659791 19.243913 8.6582031 19.488281 C 8.7543151 19.610465 8.8690398 19.721184 9.0097656 19.808594 C 9.0637596 19.842134 9.1235454 19.868148 9.1835938 19.892578 C 9.191962 19.896131 9.2005867 19.897012 9.2089844 19.900391 L 9.1855469 19.894531 C 9.2029579 19.901531 9.2185841 19.911859 9.2363281 19.917969 C 9.2652427 19.927926 9.2852873 19.927599 9.3242188 19.935547 C 9.4612233 19.977694 9.5979794 20.005859 9.7246094 20.005859 C 10.26822 20.005859 10.601562 19.710938 10.601562 19.710938 L 10.623047 19.695312 L 12.970703 17.708984 L 15.845703 20.367188 C 15.897113 20.439837 16.308174 20.998047 17.261719 20.998047 C 17.829844 20.998047 18.280978 20.718791 18.568359 20.423828 C 18.855741 20.128866 19.034757 19.82706 19.115234 19.417969 L 19.115234 19.414062 L 19.115234 19.412109 C 19.171124 19.121728 21.931641 5.265625 21.931641 5.265625 L 21.925781 5.2890625 C 22.01148 4.9067181 22.036735 4.5369631 21.935547 4.1601562 C 21.834358 3.7833495 21.561271 3.4156252 21.232422 3.2226562 C 20.903572 3.0296874 20.591699 2.9718046 20.302734 2.984375 z M 19.908203 5.1738281 C 19.799749 5.7182284 17.343164 18.059965 17.183594 18.878906 L 14.328125 16.240234 C 13.59209 15.559749 12.44438 15.535812 11.679688 16.181641 L 10.222656 17.414062 L 11 14.375 C 11 14.375 16.362547 8.9468594 16.685547 8.6308594 C 16.945547 8.3778594 17 8.2891719 17 8.2011719 C 17 8.0841719 16.939781 8 16.800781 8 C 16.675781 8 16.506016 8.1197812 16.416016 8.1757812 C 15.267511 8.8918132 10.350132 11.694224 7.96875 13.048828 C 7.8792978 12.995267 7.7913128 12.939666 7.6933594 12.900391 C 6.9119785 12.587666 5.4101276 11.985551 4.53125 11.634766 C 6.6055146 10.76177 10.161156 9.2658083 13.472656 7.8730469 C 15.210571 7.142109 16.840822 6.4570977 18.070312 5.9414062 C 19.108158 5.5060977 19.649538 5.2807035 19.908203 5.1738281 z M 17.152344 19.023438 C 17.152344 19.023438 17.154297 19.023438 17.154297 19.023438 C 17.154234 19.023761 17.152444 19.03095 17.152344 19.03125 C 17.154024 19.022709 17.151187 19.029588 17.152344 19.023438 z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible"/>
+</svg>
diff --git a/_includes/svg/icon/social/twitter.svg b/_includes/svg/icon/social/twitter.svg
new file mode 100644
index 0000000..b04f68d
--- /dev/null
+++ b/_includes/svg/icon/social/twitter.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M1024.032 194.432c-37.664 16.704-78.176 28-120.672 33.088 43.36-26.016 76.672-67.168 92.384-116.224-40.608 24.064-85.568 41.568-133.408 50.976-38.336-40.832-92.928-66.336-153.344-66.336-116.032 0-210.08 94.048-210.08 210.08 0 16.48 1.856 32.512 5.44 47.872-174.592-8.768-329.408-92.416-433.024-219.52-18.08 31.04-28.448 67.104-28.448 105.632 0 72.896 37.088 137.184 93.472 174.88-34.432-1.088-66.816-10.528-95.168-26.272-0.032 0.864-0.032 1.76-0.032 2.656 0 101.792 72.416 186.688 168.512 205.984-17.632 4.8-36.192 7.36-55.36 7.36-13.536 0-26.688-1.312-39.52-3.776 26.72 83.456 104.32 144.192 196.256 145.888-71.904 56.352-162.496 89.92-260.928 89.92-16.96 0-33.664-0.992-50.112-2.944 92.96 59.616 203.392 94.4 322.048 94.4 386.432 0 597.728-320.128 597.728-597.76 0-9.12-0.192-18.176-0.608-27.168 41.056-29.632 76.672-66.624 104.832-108.736z" />
+</svg>
diff --git a/_includes/svg/icon/social/weibo.svg b/_includes/svg/icon/social/weibo.svg
new file mode 100644
index 0000000..2ccd8b1
--- /dev/null
+++ b/_includes/svg/icon/social/weibo.svg
@@ -0,0 +1,6 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+	<path d="M769.226164 496.610234c-14.420098-4.330228-24.309277-7.266877-16.746482-26.214823 16.350218-41.133578 18.046881-76.626289 0.307181-101.939024-33.242099-47.500415-124.194284-44.928286-228.44638-1.280945 0-0.056317-32.73525 14.323848-24.371737-11.64523 16.042013-51.54906 13.626547-94.739726-11.332929-119.662341-56.566349-56.601163-206.976479 2.134908-335.954595 131.078209-96.594075 96.61353-152.681222 198.989775-152.681222 287.52035 0 169.337597 217.152361 272.292366 429.593589 272.292366 278.498445 0 463.752111-161.808592 463.752111-290.273715C893.345701 558.867622 827.968378 514.820945 769.226164 496.610234zM430.163922 866.063936c-169.51781 16.728051-315.851649-59.899262-326.864086-171.202185-11.010389-111.275277 117.530505-215.061482 287.031932-231.823323 169.537265-16.761841 315.876224 59.866496 326.86511 171.119247C728.190884 745.495411 599.705282 849.291856 430.163922 866.063936z" />
+	<path d="M954.16753 186.714824c-67.256246-74.565105-166.457264-102.990607-258.020739-83.522502l-0.037886 0c-21.188318 4.535015-34.695065 25.37929-30.159026 46.527675 4.516584 21.166816 25.352668 34.691993 46.54201 30.174385 65.139769-13.832358 135.634727 6.400627 183.442323 59.368863 47.765615 52.96414 60.740938 125.206957 40.282686 188.537431l0.011263 0.012287c-6.666851 20.629249 4.617954 42.698153 25.271777 49.366027 20.570885 6.662755 42.687913-4.607714 49.362955-25.188838 0-0.037886 0-0.116729 0.011263-0.150519C1039.577146 362.756133 1021.443231 261.206205 954.16753 186.714824" />
+	<path d="M850.886125 279.919669c-32.732179-36.315956-81.068126-50.108381-125.685136-40.621609-18.234261 3.885839-29.856965 21.833398-25.946551 40.085067 3.89915 18.173849 21.833398 29.851845 40.024654 25.893307l0 0.037886c21.809848-4.610786 45.459709 2.113405 61.461789 19.83365 16.018463 17.757107 20.323092 41.949655 13.45043 63.178931l0.035838 0c-5.715614 17.717174 3.983113 36.770584 21.717694 42.511796 17.7397 5.677728 36.76956-3.992328 42.493365-21.756603C892.458972 365.691759 883.686907 316.228458 850.886125 279.919669" />
+	<path d="M447.103928 548.691741c-80.666743-20.985579-171.84317 19.215193-206.880229 90.291746-35.685212 72.492657-1.180599 152.963828 80.321676 179.268757 84.41947 27.224424 183.926645-14.492797 218.521364-92.744074C573.187374 649.021137 530.586496 570.268131 447.103928 548.691741zM385.506979 733.819463c-16.398343 26.160554-51.51015 37.623523-77.954335 25.54824-26.066352-11.868448-33.760211-42.248645-17.360844-67.757975 16.197652-25.400793 50.129884-36.716316 76.378497-25.711046C393.129162 677.216253 401.60838 707.401901 385.506979 733.819463zM439.522702 664.493841c-5.929616 10.131852-19.03498 15.010909-29.304039 10.785123-10.096014-4.15411-13.261002-15.495231-7.522862-25.454038 5.906066-9.908634 18.500485-14.747758 28.572948-10.750309C441.502995 642.817105 445.180975 654.283146 439.522702 664.493841z" />
+</svg>
diff --git a/_includes/svg/icon/social/weixin.svg b/_includes/svg/icon/social/weixin.svg
new file mode 100644
index 0000000..c2ed41b
--- /dev/null
+++ b/_includes/svg/icon/social/weixin.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M684.111464 364.088889c10.47478 0 20.949559 0.722399 31.424339 1.805996-28.173545-131.476543-168.680071-229.000353-329.052557-229.000353-179.15485 0-326.162963 122.085362-326.162963 277.401058 0 89.577425 48.761905 163.262081 130.392945 220.33157l-32.507937 98.246208L272.344268 675.442681c40.81552 7.946384 73.684656 16.253968 114.138977 16.253968 10.11358 0 20.22716-0.361199 30.340741-1.444797-6.501587-21.671958-10.11358-44.788713-10.11358-68.266667C406.710406 479.672663 529.156966 364.088889 684.111464 364.088889zM508.568607 275.595062c24.561552 0 40.81552 16.253968 40.81552 40.81552 0 24.561552-16.253968 40.81552-40.81552 40.81552-24.561552 0-49.123104-16.253968-49.123104-40.81552C459.806702 291.84903 484.368254 275.595062 508.568607 275.595062zM280.290653 357.226102c-24.561552 0-49.123104-16.253968-49.123104-40.81552 0-24.561552 24.561552-40.81552 49.123104-40.81552 24.561552 0 40.81552 16.253968 40.81552 40.81552C321.106173 340.610935 304.852205 357.226102 280.290653 357.226102z" p-id="792"></path><path d="M981.739683 618.373192c0-130.392945-130.392945-236.585538-277.039859-236.585538-155.315697 0-277.401058 106.192593-277.401058 236.585538 0 130.754145 122.085362 236.585538 277.401058 236.585538 32.507937 0 65.377072-8.307584 97.885009-16.253968l89.577425 49.123104-24.561552-81.631041C932.977778 757.073721 981.739683 691.696649 981.739683 618.373192zM614.761199 577.557672c-16.253968 0-32.507937-16.253968-32.507937-32.507937 0-16.253968 16.253968-32.507937 32.507937-32.507937 24.561552 0 40.81552 16.253968 40.81552 32.507937C655.57672 561.303704 639.322751 577.557672 614.761199 577.557672zM794.277249 577.557672c-16.253968 0-32.507937-16.253968-32.507937-32.507937 0-16.253968 16.253968-32.507937 32.507937-32.507937 24.561552 0 40.81552 16.253968 40.81552 32.507937C835.092769 561.303704 818.477601 577.557672 794.277249 577.557672z" />
+</svg>
diff --git a/_includes/svg/icon/social/zhihu.svg b/_includes/svg/icon/social/zhihu.svg
new file mode 100644
index 0000000..210fb2e
--- /dev/null
+++ b/_includes/svg/icon/social/zhihu.svg
@@ -0,0 +1,3 @@
+<svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path d="M351.791182 562.469462l192.945407 0c0-45.367257-21.3871-71.939449-21.3871-71.939449L355.897709 490.530013c3.977591-82.182744 7.541767-187.659007 8.816806-226.835262l159.282726 0c0 0-0.86367-67.402109-18.578124-67.402109s-279.979646 0-279.979646 0 16.850783-88.141456 39.318494-127.053698c0 0-83.60514-4.510734-112.121614 106.962104S81.344656 355.077018 76.80834 367.390461c-4.536316 12.313443 24.62791 5.832845 36.941354 0 12.313443-5.832845 68.050885-25.924439 84.252893-103.69571l86.570681 0c1.165546 49.28652 4.596691 200.335724 3.515057 226.835262L109.86113 490.530013c-25.275663 18.147312-33.701566 71.939449-33.701566 71.939449L279.868105 562.469462c-8.497535 56.255235-23.417339 128.763642-44.275389 167.210279-33.05279 60.921511-50.55235 116.65793-169.802314 212.576513 0 0-19.442818 14.257725 40.829917 9.073656 60.273758-5.185093 117.305683-20.739347 156.840094-99.807147 20.553105-41.107233 41.805128-93.250824 58.386782-146.138358l-0.055259 0.185218 167.855986 193.263655c0 0 22.035876-51.847855 5.832845-108.880803L371.045711 650.610918l-42.1244 31.157627-0.045025 0.151449c11.69946-41.020252 20.11206-81.5749 22.726607-116.858498C351.665315 564.212152 351.72876 563.345412 351.791182 562.469462z" p-id="907"></path><path d="M584.918753 182.033893l0 668.840094 70.318532 0 28.807093 80.512708 121.875768-80.512708 153.600307 0L959.520453 182.033893 584.918753 182.033893zM887.150192 778.934538l-79.837326 0-99.578949 65.782216-23.537066-65.782216-24.855084 0L659.341766 256.673847l227.807403 0L887.149169 778.934538z" />
+</svg>
diff --git a/_includes/svg/logo.svg b/_includes/svg/logo.svg
new file mode 100644
index 0000000..740dd3e
--- /dev/null
+++ b/_includes/svg/logo.svg
@@ -0,0 +1,8 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
diff --git a/_includes/tags.html b/_includes/tags.html
new file mode 100644
index 0000000..424804c
--- /dev/null
+++ b/_includes/tags.html
@@ -0,0 +1,52 @@
+{%- assign _tag_max_size = 1 -%}
+{%- assign _tag_min_size = 1 -%}
+{%- assign _tag_cur_size = 1 -%}
+{%- assign _tags = site.tags | sort -%}
+{%- for _tag in _tags -%}
+  {%- assign _tag_cur_size = _tag[1].size -%}
+  {%- if _tag_cur_size > _tag_max_size -%}
+    {%- assign _tag_max_size =  _tag_cur_size -%}
+  {%- endif -%}
+  {%- if _tag_cur_size < _tag_min_size -%}
+    {%- assign _tag_min_size = _tag_cur_size -%}
+  {%- endif -%}
+{%- endfor -%}
+{%- assign _tag_gap_size =  _tag_max_size | minus: _tag_min_size | plus: 1 | divided_by: 4 -%}
+{%- if _tag_gap_size < 1 -%}
+  {%- assign _tag_gap_size = 1 -%}
+{%- endif -%}
+<div class="site-tags js-tags">
+  <ul class="menu">
+    <li>
+      <button type="button" class="button button--secondary button--pill tag-button tag-button--all" data-encode="">
+        Show All<div class="tag-button__count">{{ site.posts | size }}</div>
+      </button>
+    </li>
+    {%- for _tag in _tags -%}
+      {%- assign _tag_cur_size = _tag[1].size -%}
+      {%- assign _tag_min_1 = _tag_min_size -%}
+      {%- assign _tag_max_1 = _tag_min_1 | plus: _tag_gap_size -%}
+      {%- assign _tag_min_2 = _tag_max_1 -%}
+      {%- assign _tag_max_2 = _tag_min_2 | plus: _tag_gap_size -%}
+      {%- assign _tag_min_3 = _tag_max_2 -%}
+      {%- assign _tag_max_3 = _tag_min_3 | plus: _tag_gap_size -%}
+      {%- assign _tag_min_4 = _tag_max_3 -%}
+      {%- assign _tag_max_4 = _tag_min_4 | plus: _tag_gap_size -%}
+      {%- if _tag_cur_size >= _tag_min_1 and _tag_cur_size < _tag_max_1 -%}
+        {%- assign _c_index = 1 -%}
+      {%- elsif _tag_cur_size >= _tag_min_2 and _tag_cur_size < _tag_max_2 -%}
+        {%- assign _c_index = 2 -%}
+      {%- elsif _tag_cur_size >= _tag_min_3 and _tag_cur_size < _tag_max_3 -%}
+        {%- assign _c_index = 3 -%}
+      {%- elsif _tag_cur_size >= _tag_min_4 and _tag_cur_size < _tag_max_4 -%}
+        {%- assign _c_index = 4 -%}
+      {%- else -%}
+        {%- assign _c_index = 4 -%}
+      {%- endif -%}
+      <li><button type="button" class="button button--pill tag-button tag-button-{{ _c_index }}" data-encode="{{ _tag[0] | strip | url_encode }}">
+          <span>{{ _tag[0] | strip }}</span><div class="tag-button__count">{{ _tag[1].size }}</div>
+        </button>
+      </li>
+    {%- endfor -%}
+  </ul>
+</div>
diff --git a/_layouts/404.html b/_layouts/404.html
new file mode 100644
index 0000000..4dd94a6
--- /dev/null
+++ b/_layouts/404.html
@@ -0,0 +1,13 @@
+---
+layout: page
+title: 404
+show_title: false
+---
+<div class="layout--404">
+  <div class="sign">
+    <h1>404</h1>
+    <p>Page not found :(</p>
+  </div>
+</div>
+
+{{ content }}
diff --git a/_layouts/archive.html b/_layouts/archive.html
new file mode 100644
index 0000000..02412a6
--- /dev/null
+++ b/_layouts/archive.html
@@ -0,0 +1,39 @@
+---
+layout: page
+titles:
+  # @start locale config
+  en      : &EN       Archive
+  en-GB   : *EN
+  en-US   : *EN
+  en-CA   : *EN
+  en-AU   : *EN
+  zh-Hans : &ZH_HANS  归档
+  zh      : *ZH_HANS
+  zh-CN   : *ZH_HANS
+  zh-SG   : *ZH_HANS
+  zh-Hant : &ZH_HANT  歸檔
+  zh-TW   : *ZH_HANT
+  zh-HK   : *ZH_HANT
+  ko      : &KO       아카이브
+  ko-KR   : *KO
+  fr      : &FR       Archives
+  fr-BE   : *FR
+  fr-CA   : *FR
+  fr-CH   : *FR
+  fr-FR   : *FR
+  fr-LU   : *FR
+  # @end locale config
+---
+
+<div class="layout--archive js-all">
+  {%- include tags.html -%}
+  <div class="js-result layout--archive__result d-none">
+    {%- include article-list.html articles=site.posts type='brief' show_info=true reverse=true group_by='year' -%}
+  </div>
+</div>
+
+<script>
+  {%- include scripts/archieve.js -%}
+</script>
+
+{{ content }}
diff --git a/_layouts/article.html b/_layouts/article.html
new file mode 100644
index 0000000..80f3b3c
--- /dev/null
+++ b/_layouts/article.html
@@ -0,0 +1,29 @@
+---
+layout: page
+type: article
+---
+
+{%- include snippets/assign.html
+  target = site.data.variables.default.page.sharing
+  source0=layout.sharing source1=page.sharing -%}
+{%- assign _sharing = __return -%}
+
+<div class="layout--article">
+  {%- include article/top/custom.html -%}
+
+  <div class="article__content" itemprop="articleBody">{{ content }}</div>
+
+  {%- if _sharing -%}
+    <section class="article__sharing d-print-none">{%- include sharing.html -%}</section>
+  {%- endif -%}
+
+  <div class="d-print-none">
+    {%- include article-footer.html -%}
+    {%- include article-section-navigator.html -%}
+  </div>
+
+</div>
+
+<script>
+  {%- include scripts/article.js -%}
+</script>
diff --git a/_layouts/articles.html b/_layouts/articles.html
new file mode 100644
index 0000000..00738a1
--- /dev/null
+++ b/_layouts/articles.html
@@ -0,0 +1,89 @@
+---
+layout: page
+---
+
+{%- assign _page_articles_data_source = page.articles.data_source | default: layout.articles.data_source -%}
+
+{%- if _page_articles_data_source -%}
+{%- assign _keys = _page_articles_data_source | split: '.' -%}
+{%- endif -%}
+
+{%- assign _articles = nil -%}
+{%- for _key in _keys -%}
+  {%- if forloop.first -%}
+    {%- case _key -%}
+      {%- when 'site' -%}
+        {%- assign _articles = site -%}
+      {%- when 'page' -%}
+        {%- assign _articles = page -%}
+      {%- when 'layout' -%}
+        {%- assign _articles = layout -%}
+      {%- when 'paginator' -%}
+        {%- assign _articles = paginator -%}
+      {%- else -%}
+        {%- assign _articles = site[_key] -%}
+      {%- else -%}
+    {%- endcase -%}
+  {%- else -%}
+    {%- assign _articles = _articles[_key] -%}
+  {%- endif -%}
+{%- endfor -%}
+
+{%- assign _type = page.articles.type | default: layout.articles.type -%}
+
+{%- if _articles -%}
+
+  <div class="layout--articles">
+
+    {%- if _type == 'grid' -%}
+      {%- if page.articles.size == 'sm' -%}
+        {%- include article-list.html articles=_articles type='grid' size='sm' -%}
+      {%- else -%}
+        {%- include article-list.html articles=_articles type='grid' -%}
+      {%- endif -%}
+
+    {%- elsif _type == 'brief' -%}
+      {%- include snippets/assign.html
+        target=site.data.variables.default.page.articles.show_info
+        source0=layout.articles.show_info source1=page.articles.show_info -%}
+      {%- assign _show_info = __return -%}
+
+      {%- include article-list.html articles=_articles type='brief' show_info=_show_info -%}
+
+    {%- else -%}
+      {%- include snippets/assign.html
+        target=site.data.variables.default.page.articles.show_cover
+        source0=layout.articles.show_cover source1=page.articles.show_cover -%}
+      {%- assign _show_cover = __return -%}
+
+      {%- include snippets/assign.html
+        target=site.data.variables.default.page.articles.show_excerpt
+        source0=layout.articles.show_excerpt source1=page.articles.show_excerpt -%}
+      {%- assign _show_excerpt = __return -%}
+
+      {%- include snippets/assign.html
+        target=site.data.variables.default.page.articles.show_readmore
+        source0=layout.articles.show_readmore source1=page.articles.show_readmore -%}
+      {%- assign _show_readmore = __return -%}
+
+      {%- include snippets/assign.html
+        target=site.data.variables.default.page.articles.show_info
+        source0=layout.articles.show_info source1=page.articles.show_info -%}
+      {%- assign _show_info = __return -%}
+
+      {%- assign _article_type = page.articles.article_type | default: layout.articles.article_type -%}
+      {%- assign _cover_size = page.articles.cover_size | default: layout.articles.cover_size -%}
+      {%- assign _excerpt_type = page.articles.excerpt_type | default: layout.articles.excerpt_type -%}
+
+      {%- include article-list.html articles=_articles type='item'
+        article_type=_article_type
+        show_cover=_show_cover cover_size=_cover_size
+        show_excerpt=_show_excerpt excerpt_type=_excerpt_type
+        show_readmore=_show_readmore show_info=_show_info -%}
+
+    {%- endif -%}
+
+  </div>
+{%- endif -%}
+
+{{ content }}
diff --git a/_layouts/base.html b/_layouts/base.html
new file mode 100644
index 0000000..8a02572
--- /dev/null
+++ b/_layouts/base.html
@@ -0,0 +1,25 @@
+---
+layout: none
+---
+<!DOCTYPE html>
+{%- include snippets/get-lang.html -%}
+<html lang="{{ __return }}">
+  <head>
+    {%- include analytics.html -%}
+    {%- include head.html -%}
+    <script>
+      {%- include scripts/utils/utils.js -%}
+      {%- include scripts/lib/throttle.js -%}
+      {%- include scripts/lib/lazyload.js -%}
+    </script>
+    {%- include scripts/variables.html -%}
+  </head>
+  <body>
+    <div class="root" data-is-touch="false">
+      {{ content }}
+    </div>
+    <script>
+      {%- include scripts/common.js -%}
+    </script>
+  </body>
+</html>
diff --git a/_layouts/default.html b/_layouts/default.html
deleted file mode 100644
index b0e362a..0000000
--- a/_layouts/default.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  {% include head.html %}
-
-  <body>
-
-    {% include header.html %}
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          {{ content }}
-        </div>
-        <div class="col-second">
-          {% include sidebar.html %}
-        </div>
-      </div>
-    </div>
-
-    {% include footer.html %}
-
-  </body>
-
-</html>
diff --git a/_layouts/home.html b/_layouts/home.html
new file mode 100644
index 0000000..e587d6f
--- /dev/null
+++ b/_layouts/home.html
@@ -0,0 +1,42 @@
+---
+layout: articles
+titles:
+  # @start locale config
+  en      : &EN       Home
+  en-GB   : *EN
+  en-US   : *EN
+  en-CA   : *EN
+  en-AU   : *EN
+  zh-Hans : &ZH_HANS  主页
+  zh      : *ZH_HANS
+  zh-CN   : *ZH_HANS
+  zh-SG   : *ZH_HANS
+  zh-Hant : &ZH_HANT  主頁
+  zh-TW   : *ZH_HANT
+  zh-HK   : *ZH_HANT
+  ko      : &KO       홈
+  ko-KR   : *KO
+  fr      : &FR       Accueil
+  fr-BE   : *FR
+  fr-CA   : *FR
+  fr-CH   : *FR
+  fr-FR   : *FR
+  fr-LU   : *FR
+  # @end locale config
+show_title: false
+articles:
+  data_source: paginator.posts
+  article_type: BlogPosting
+  show_cover: false
+  show_excerpt: true
+  show_readmore: true
+  show_info: true
+---
+<div class="layout--home">
+  {%- include paginator.html -%}
+</div>
+<script>
+  {%- include scripts/home.js -%}
+</script>
+
+{{ content }}
diff --git a/_layouts/landing.html b/_layouts/landing.html
new file mode 100644
index 0000000..306067b
--- /dev/null
+++ b/_layouts/landing.html
@@ -0,0 +1,178 @@
+---
+layout: page
+header: false
+full_width: true
+article_header:
+  type: overlay
+  align: center
+  height: 80vh
+---
+<div class="layout--landing">
+  <div class="heros">
+  {%- for _section in page.data.sections -%}
+    {%- include snippets/get-nav-url.html path=_section.background_image.src -%}
+    {%- assign _url = __return -%}
+    {%- if _section.theme == 'light' -%}
+      <section class="hero hero--center hero--light" id="hero-{{ forloop.index }}"
+    {%- elsif _section.theme == 'dark' -%}
+      <section class="hero hero--center hero--dark" id="hero-{{ forloop.index }}"
+    {%- else -%}
+      <section class="hero hero--center" id="hero-{{ forloop.index }}"
+    {%- endif -%}
+    {%- if _section.background_color -%}
+        style="background-image: url({{ _url }}); background-color: {{ _section.background_color }};">
+    {%- else -%}
+        style="background-image: url({{ _url }});">
+    {%- endif -%}
+
+        <div class="hero__content">
+          <div class="mb-5">
+
+            <h3>{{ _section.title }}</h3>
+              {%- if _section.excerpt-%}
+            <p>{{ _section.excerpt }}</p>
+            {%- endif -%}
+
+            {%- if _section.actions -%}
+              <ul class="menu">
+              {%- for _action in _section.actions -%}
+                {%- include snippets/get-nav-url.html path=_action.url -%}
+                {%- assign _url = __return -%}
+                {%- assign _type = _action.type | default: 'outline-info' -%}
+                <li><a class="button button--{{ _type }} button--pill button--lg" href="{{ _url }}">{{ _action.text }}</a></li>
+              {%- endfor -%}
+              </ul>
+            {%- endif -%}
+
+          </div>
+
+          {%- if _section.children -%}
+            {%- assign _size = _section.children | size  -%}
+            <div class="grid--container">
+              <div class="grid grid--p-3">
+
+                {%- for child in _section.children -%}
+
+                  {%- if _size >= 2 -%}
+                    {%- assign _cell_md_col = 6 -%}
+                  {%- else -%}
+                    {%- assign _cell_md_col = 12 | divided_by: _size -%}
+                  {%- endif -%}
+
+                  {%- if _size >= 4 -%}
+                    {%- assign _cell_lg_col = 3 -%}
+                  {%- else -%}
+                    {%- assign _cell_lg_col = 12 | divided_by: _size -%}
+                  {%- endif -%}
+
+                  <div class="cell cell--12 cell--md-{{ _cell_md_col }} cell--lg-{{ _cell_lg_col }} ">
+
+                    <div class="mb-5">
+                      <h4>{{ child.title }}</h4>
+
+                      {%- if child.excerpt-%}
+                        <p>{{ child.excerpt }}</p>
+                      {%- endif -%}
+
+                      {%- if child.actions -%}
+                        <ul class="menu">
+                          {%- for _action in child.actions -%}
+                            {%- include snippets/get-nav-url.html path=_action.url -%}
+                            {%- assign _url = __return -%}
+                            {%- assign _type = _action.type | default: 'outline-info' -%}
+                            <li><a class="button button--{{ _type }} button--pill button--lg" href="{{ _url }}">{{ _action.text }}</a></li>
+                          {%- endfor -%}
+                        </ul>
+                      {%- endif -%}
+                    </div>
+
+                    {%- if child.image and child.image.src -%}
+
+                      {%- if child.image.url -%}
+                        {%- include snippets/get-nav-url.html path=child.image.url -%}
+                        {%- assign _item_image_url = __return -%}
+                      {%- else -%}
+                        {%- assign _item_image_url = nil -%}
+                      {%- endif -%}
+
+                      {%- include snippets/get-nav-url.html path=child.image.src -%}
+                      {%- assign _item_image_src = __return -%}
+
+                      {%- if child.image.is_row -%}
+                        <div class="mb-5">
+                      {%- endif -%}
+                          <div class="mx-auto" style="{{ child.image.style }}">
+                      {%- if _item_image_url -%}
+                            <a href="{{ _item_image_url }}">
+                      {%- endif -%}
+                              <img src="{{ _item_image_src }}"/>
+                      {%- if _item_image_url -%}
+                            </a>
+                      {%- endif -%}
+                          </div>
+                      {%- if child.image.is_row -%}
+                        </div>
+                      {%- endif -%}
+                    {%- endif -%}
+
+                    {%- if child.content-%}
+                      <p>{{ child.content }}</p>
+                    {%- endif -%}
+
+                  </div>
+                {%- endfor-%}
+
+              </div>
+            </div>
+          {%- endif -%}
+
+      {%- if _section.image.full_width == true -%}
+        </div> {% comment %} end hero__content {% endcomment %}
+      {%- endif -%}
+
+          {%- if _section.image and _section.image.src -%}
+
+            {%- if _section.image.url -%}
+              {%- include snippets/get-nav-url.html path=_section.image.url -%}
+              {%- assign _section_image_url = __return -%}
+            {%- else -%}
+              {%- assign _section_image_url = nil -%}
+            {%- endif -%}
+
+            {%- include snippets/get-nav-url.html path=_section.image.src -%}
+            {%- assign _section_image_src = __return -%}
+
+            {%- if _section.image.is_row -%}
+              <div class="mb-5">
+            {%- endif -%}
+                <div class="mx-auto" style="{{ _section.image.style }}">
+            {%- if _section_image_url -%}
+                  <a href="{{ _section_image_url }}">
+            {%- endif -%}
+                    {%- if _section.image.full_width == true -%}
+                      <img class="hero__cover hero__cover--full-width" src="{{ _section_image_src }}"/>
+                    {%- else -%}
+                      <img class="hero__cover" src="{{ _section_image_src }}"/>
+                    {%- endif -%}
+            {%- if _section_image_url -%}
+                  </a>
+            {%- endif -%}
+                </div>
+            {%- if _section.image.is_row -%}
+              </div>
+            {%- endif -%}
+          {%- endif -%}
+
+      {%- if _section.image.full_width != true -%}
+        </div> {% comment %} end hero__content {% endcomment %}
+      {%- endif -%}
+
+      {%- if _section.content-%}
+        <p>{{ _section.content }}</p>
+      {%- endif -%}
+      </section>
+  {%- endfor -%}
+  </div>
+</div>
+
+{{ content }}
diff --git a/_layouts/none.html b/_layouts/none.html
new file mode 100644
index 0000000..cddd070
--- /dev/null
+++ b/_layouts/none.html
@@ -0,0 +1 @@
+{{ content }}
diff --git a/_layouts/page.html b/_layouts/page.html
index 9b863db..185798a 100644
--- a/_layouts/page.html
+++ b/_layouts/page.html
@@ -1,16 +1,270 @@
 ---
-layout: default
+layout: base
 ---
-<div class="post">
+{%- assign _page_mode = page.mode | default: layout.mode | default: site.data.variables.default.page.mode -%}
+{%- assign _page_type = page.type | default: layout.type | default: site.data.variables.default.page.type -%}
+{%- assign _article_header_type = page.article_header.type | default: layout.article_header.type -%}
 
-  <header class="post-header">
-    <h1 class="post-title">{{ page.title }}</h1>
-  </header>
+{%- include snippets/assign.html
+  target=layout.header source0=page.header -%}
+{%- assign _header = __return -%}
 
-  <article class="post-content">
-    {{ content }}
-  </article>
+{%- include snippets/assign.html
+  target=layout.footer source0=page.footer -%}
+{%- assign _footer = __return -%}
 
-  {% include comment.html %}
+{%- include snippets/assign.html
+  target=layout.lightbox source0=page.lightbox -%}
+{%- assign _lightbox = __return -%}
 
+{%- include snippets/assign.html
+  target = site.data.variables.default.page.full_width
+  source0=layout.full_width source1=page.full_width -%}
+{%- assign _full_width = __return -%}
+
+{%- include snippets/assign.html
+  target = site.data.variables.default.page.comment
+  source0=layout.comment source1=page.comment -%}
+{%- assign _comment = __return -%}
+
+
+{%- assign _article_header_excerpt_truncate = include.excerpt_truncate | default: 200 -%}
+
+{%- if page.sidebar -%}
+<div class="layout--page layout--page--sidebar clearfix js-page-root">
+  <div class="page__mask d-print-none js-page-mask js-sidebar-hide"></div>
+  <div class="page__viewport">
+    <div class="page__actions d-print-none">
+      <div class="button button--circle button--lg box-shadow-2 sidebar-button js-sidebar-show">
+        <i class="fas fa-bars icon--show"></i>
+      </div>
+    </div>
+
+    <div class="grid page__grid">
+
+      <div class="page__sidebar d-print-none">
+        {%- include sidebar/toc.html -%}
+      </div>
+
+{%- else -%}
+<div class="layout--page js-page-root">
+{%- endif -%}
+
+    {%- assign _page_main_class = 'page__main js-page-main' -%}
+    {%- if _page_mode == 'immersive' -%}
+      {%- assign _page_main_class = _page_main_class | append: ' page__main--immersive' -%}
+    {%- endif -%}
+    {%- unless page.sidebar -%}
+      {%- assign _page_main_class = _page_main_class | append: ' page__viewport' -%}
+    {%- endunless -%}
+    {%- if _footer == false -%}
+      {%- assign _page_main_class = _page_main_class | append: ' hide-footer' -%}
+    {%- endif -%}
+    {%- if page.aside -%}
+      {%- assign _page_main_class = _page_main_class | append: ' has-aside' -%}
+    {%- elsif _full_width -%}
+      {%- assign _page_main_class = _page_main_class | append: ' full-width' -%}
+    {%- endif -%}
+    <div class="{{ _page_main_class }} cell cell--auto">
+
+      <div class="page__main-inner">
+      {%- if _header != false -%}
+        <div class="page__header d-print-none">
+        {%- assign _header_theme = page.header.theme | default: layout.header.theme -%}
+        {%- if _header_theme == 'dark'-%}
+          {%- include header.html theme='dark' background=page.header.background -%}
+        {%- elsif _header_theme == 'light' -%}
+          {%- include header.html theme='light' background=page.header.background -%}
+        {%- else -%}
+          {%- include header.html -%}
+        {%- endif -%}
+        </div>
+      {%- endif -%}
+
+
+        <div class="page__content">
+        {%- if _article_header_type == 'overlay' or _article_header_type == 'cover' -%}
+
+          {%- if _article_header_type == 'overlay' -%}
+
+            {%- assign _article_header_height = page.article_header.height | default: layout.article_header.height -%}
+            {%- assign _article_header_align = page.article_header.align | default: layout.article_header.align | default: site.data.variables.default.page.article_header.align -%}
+            {%- assign _article_header_theme = page.article_header.theme | default: layout.article_header.theme | default: site.data.variables.default.page.article_header.theme -%}
+
+            {%- if page.article_header.background_image.src -%}
+              {%- assign _header_background_image_src = page.article_header.background_image.src -%}
+            {%- elsif page.article_header.background_image != false and page.cover -%}
+              {%- assign _header_background_image_src = page.cover -%}
+            {%- endif -%}
+
+            {%- if page.article_header.background_image.gradient -%}
+              {%- assign _header_background_image = page.article_header.background_image.gradient -%}
+              {%- if _header_background_image_src -%}
+                {%- assign _header_background_image = _header_background_image | append: ',' -%}
+              {%- endif -%}
+            {%- endif -%}
+
+            {%- if _header_background_image_src -%}
+              {%- include snippets/get-nav-url.html path=_header_background_image_src -%}
+              {%- assign _header_background_image_src = __return -%}
+              {%- assign _header_background_image = _header_background_image
+                | append: 'url(' | append: _header_background_image_src  | append: ')'-%}
+            {%- endif -%}
+
+            {%- assign _header_style = 'background-image:' | append: _header_background_image | append: ';' -%}
+
+            {%- if page.article_header.background_color -%}
+              {%- assign _header_style = _header_style | append: 'background-color:' | append: page.article_header.background_color | append: ';' -%}
+            {%- endif -%}
+
+            {%- if _article_header_height -%}
+              {%- assign _header_style = _header_style | append: 'min-height:' | append: _article_header_height | append: ';' -%}
+            {%- endif -%}
+
+            <div class="article__header--overlay">
+
+            {%- if _article_header_theme == 'light' -%}
+              {%- if _article_header_align == 'center' -%}
+                <div class="hero hero--center hero--light overlay" style="{{ _header_style }}">
+              {%- else -%}
+                <div class="hero hero--light overlay" style="{{ _header_style }}">
+              {%- endif -%}
+            {%- elsif _article_header_theme == 'dark' -%}
+              {%- if _article_header_align == 'center' -%}
+                <div class="hero hero--center hero--dark overlay" style="{{ _header_style }}">
+              {%- else -%}
+                <div class="hero hero--dark overlay" style="{{ _header_style }}">
+              {%- endif -%}
+            {%- else -%}
+              {%- if _article_header_align == 'center' -%}
+                <div class="hero hero--center overlay" style="{{ _header_style }}">
+              {%- else -%}
+                <div class="hero overlay" style="{{ _header_style }}">
+              {%- endif -%}
+            {%- endif -%}
+                <div class="hero__content">
+                  {%- if _full_width == false -%}
+                    <div class ="main">
+                  {%- endif -%}
+                    {%- include article-info.html article=page semantic=false -%}
+                    {%- include article-header.html article=page semantic=false -%}
+                    {%- if page.excerpt -%}
+                      <p class="overlay__excerpt">{{ page.excerpt | strip_html | strip_newlines | strip | truncate: _article_header_excerpt_truncate }}</p>
+                    {%- endif -%}
+                    {%- if page.article_header.actions -%}
+                      <ul class="menu">
+                        {%- for _action in page.article_header.actions -%}
+                          {%- include snippets/get-nav-url.html path=_action.url -%}
+                          {%- assign _url = __return -%}
+                          {%- assign _type = _action.type | default: 'info' -%}
+                          <li><a class="button button--{{ _type }} button--rounded button--xl" href="{{ _url }}">{{ _action.text }}</a></li>
+                        {%- endfor -%}
+                      </ul>
+                    {%- endif -%}
+                  {%- if _full_width == false -%}
+                    </div>
+                  {%- endif -%}
+                </div>
+              </div>
+            </div>
+          {%- elsif _article_header_type == 'cover' -%}
+            {%- if page.article_header.image.src -%}
+              {%- include snippets/get-nav-url.html path=page.article_header.image.src -%}
+              {%- assign _header_image_src = __return -%}
+              <img class="article__header--cover" src="{{ _header_image_src }}" />
+            {%- endif -%}
+          {%- endif -%}
+
+        {%- endif -%}
+
+
+        {%- if _full_width == false -%}
+          <div class ="main">
+        {%- endif -%}
+            <div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside">
+                {%- if page.aside -%}
+                  <aside class="page__aside js-page-aside">
+                    {%- include aside/toc.html -%}
+                  </aside>
+                {%- endif -%}
+              </div>
+
+              <div class="col-main cell cell--auto">
+                {%- include main/top/custom.html -%}
+                {%- if _page_type == 'article' -%}
+                  <article itemscope itemtype="http://schema.org/Article">
+                {%- elsif _page_type == 'webpage' -%}
+                  <article itemscope itemtype="http://schema.org/WebPage">
+                {%- else -%}
+                  <article>
+                {%- endif -%}
+
+                {%- if _article_header_type == 'overlay' or page.article_header == false -%}
+                  {%- include article-header.html article=page html=false -%}
+                  {%- include article-info.html article=page html=false -%}
+                {%- else -%}
+                  {%- include article-header.html article=page -%}
+                  {%- include article-info.html article=page -%}
+                {%- endif -%}
+
+                    <div class="js-article-content">{{ content }}</div>
+                    {%- if _comment != false -%}
+                      <section class="page__comments d-print-none">{%- include comments.html -%}</section>
+                    {%- endif -%}
+                </article>
+                {%- include main/bottom/custom.html -%}
+              </div>
+            </div>
+
+        {%- if _full_width == false -%}
+          </div>
+        {%- endif -%}
+        </div>
+
+        {%- if _footer != false -%}
+          <div class="page__footer d-print-none">{%- include footer.html -%}</div>
+        {%- endif -%}
+      </div>
+    </div> {%- comment -%} end page__main {%- endcomment -%}
+{%- if page.sidebar -%}
+    </div> {%- comment -%} end grid {%- endcomment -%}
+  </div> {%- comment -%} end page__viewport {%- endcomment -%}
+{%- endif -%}
+
+<script>{%- include scripts/lib/modal.js -%}</script>
+{%- if _lightbox == true -%}
+  <div class="modal d-print-none js-page-gallery-modal"><div class="gallery"></div></div>
+{%- endif -%}
+{%- if _header != false -%}
+  <div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal">{%- include search.html -%}</div>
+{%- endif -%}
 </div>
+
+
+<script>
+  {%- include scripts/lib/scroll-to.js -%}
+  {%- include scripts/lib/affix.js -%}
+  {%- include scripts/lib/toc.js -%}
+  {%- if _lightbox == true -%}
+    {%- include scripts/lib/gallery.js -%}
+    {%- include scripts/components/lightbox.js -%}
+  {%- endif -%}
+  {%- include scripts/page.js -%}
+</script>
+
+{%- if page.sidebar -%}
+<script>{%- include scripts/components/sidebar.js -%}</script>
+{%- endif -%}
+
+{%- if page.aside -%}
+<script>
+  /* toc must before affix, since affix need to konw toc' height. */
+  {%- if page.aside.toc -%}{%- include scripts/aside/toc.js -%}{%- endif -%}
+  {%- include scripts/aside/affix.js -%}
+</script>
+{%- endif -%}
+
+{%- include markdown-enhancements.html -%}
+{%- include pageview.html -%}
diff --git a/_layouts/post.html b/_layouts/post.html
deleted file mode 100644
index 93d15a5..0000000
--- a/_layouts/post.html
+++ /dev/null
@@ -1,17 +0,0 @@
----
-layout: default
----
-<div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">{{ page.title }}</h1>
-    <p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
-  </header>
-
-  <article class="post-content">
-    {{ content }}
-  </article>
-  
-  {% include comment.html %}
-
-</div>
diff --git a/_posts/2016-10-26-welcome-to-my-blog.markdown b/_posts/2016-10-26-welcome-to-my-blog.markdown
index 3b132c6..2c8eb9c 100644
--- a/_posts/2016-10-26-welcome-to-my-blog.markdown
+++ b/_posts/2016-10-26-welcome-to-my-blog.markdown
@@ -1,9 +1,7 @@
 ---
-layout: post
 title:  "Stop Talking is the worst title of one blog"
 date:   2016-10-26 22:50:33 -0400
-categories: Nonsense
-permalink: /archivers/hello
+tags: Nonsense
 ---
 
 
diff --git a/_posts/2016-10-27-charles-is-not-a-good-tool.md b/_posts/2016-10-27-charles-is-not-a-good-tool.md
index a6d5d43..04b0c06 100644
--- a/_posts/2016-10-27-charles-is-not-a-good-tool.md
+++ b/_posts/2016-10-27-charles-is-not-a-good-tool.md
@@ -1,5 +1,4 @@
 ---
-layout: post
 title:  "Using charles proxy to monitor mobile SSL traffics"
 date:   2016-10-27 22:50:33 -0400
 categories: Network
diff --git a/_posts/2016-10-28-some-of-my-previews-exper-work.md b/_posts/2016-10-28-some-of-my-previews-exper-work.md
index 573db59..daeb364 100644
--- a/_posts/2016-10-28-some-of-my-previews-exper-work.md
+++ b/_posts/2016-10-28-some-of-my-previews-exper-work.md
@@ -1,8 +1,7 @@
 ---
-layout: post
 title:  "Some of my previews experiment works: 2016"
 date:   2016-10-28 12:27:33 -0400
-categories: Research
+tags: Research
 ---
 This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.
 
diff --git a/_posts/2017-07-08-intro-xv6.md b/_posts/2017-07-08-intro-xv6.md
index 85c8a7c..ca0d9d5 100644
--- a/_posts/2017-07-08-intro-xv6.md
+++ b/_posts/2017-07-08-intro-xv6.md
@@ -1,8 +1,8 @@
 ---
-layout: post
 title:  "Xv6 introduction"
 date:   2017-07-28 14:56:55 -0400
-categories: xv6
+tags: xv6
+
 ---
 
 In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
diff --git a/_posts/2020-09-15-generate-word-cloud-with-chinese-fenci.md b/_posts/2020-09-15-generate-word-cloud-with-chinese-fenci.md
index d1ab58e..60b3e39 100644
--- a/_posts/2020-09-15-generate-word-cloud-with-chinese-fenci.md
+++ b/_posts/2020-09-15-generate-word-cloud-with-chinese-fenci.md
@@ -1,8 +1,7 @@
 ---
-layout: post
 title:  "Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries"
 date:   2020-09-15 22:00:14 -0400
-categories: visualization
+tags: visualization
 ---
 
 Let's generate a word cloud like this. 
diff --git a/_posts/2021-10-13-eddl-how-do-we-train-on-limited-edge-devices.md b/_posts/2021-10-13-eddl-how-do-we-train-on-limited-edge-devices.md
index 457d594..f7bcf89 100644
--- a/_posts/2021-10-13-eddl-how-do-we-train-on-limited-edge-devices.md
+++ b/_posts/2021-10-13-eddl-how-do-we-train-on-limited-edge-devices.md
@@ -1,8 +1,7 @@
 ---
-layout: post
 title:  "EDDL: How do we train neural networks on limited edge devices - PART 1"
 date:   2021-10-13 16:53:20 -0400
-categories: Research
+tags: Research
 ---
 This post introduces our previous milestone in project "Edge trainer", as the paper "EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment." was published.
 As the first part of the introductions, I focus only on the motivation and summary of our works.
diff --git a/_sass/_base.scss b/_sass/_base.scss
deleted file mode 100644
index 4af8772..0000000
--- a/_sass/_base.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-body {
-	margin: 0;
-	font-family: $base-font-family;
-	font-size: $base-font-size;
-	line-height: $base-line-height;
-}
-a {
-	text-decoration: none;
-	color: #036;
-}
-a:hover, a:focus {
-	text-decoration:underline;
-	color: #069;
-}
-blockquote {
-	background: #FFF;
-	margin:0;
-	padding: 5px 20px;
-	border-left: 10px solid #CCC;
-}
-code,pre {
-	font-family:  $code-font-family;
-	font-size: $code-font-size;
-}
-code {
-	color: #900;
-	background-color: #fff;
-	padding: 2px 5px;
-	border-radius: 5px;
-}
-pre {
-	overflow-x: auto;
-	padding: 20px 50px;
-}
-pre, pre code {
-	color: #fafafa;
-	background-color: #223;
-}
-pre code {
-	padding: 0;	
-}
-.hide {
-    display: none;
-}
-.center {
-	text-align: center;
-}
-table {
-	border-collapse: collapse;
-	border-spacing: 0;
-    margin: 10pt auto;
-	background: #FFF;
-
-	td, th {
-		border: 1px solid #CCC;
-		padding: 5px 15px;
-		margin: 0;
-	}
-	
-	th {
-		border-color: #555;
-		background: #555;
-		color: #eee;
-		font-weight:normal;
-	}
-	
-	tr:hover {
-		background: rgba(255,255,0,0.2);
-	}
-}
-
-h1,h2,h3,h4,h5,h6{
-	font-weight: normal;
-}
\ No newline at end of file
diff --git a/_sass/_easybook.scss b/_sass/_easybook.scss
deleted file mode 100644
index 2ef2273..0000000
--- a/_sass/_easybook.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-.page-content .wrapper {
-    .post-toc {
-        &>ul {
-            overflow: auto;
-        }
-    }
-}
-
-.util-notify1 {
-    position: absolute;
-    z-index: 100;
-    background: rgba(0,0,0,0.7);
-    color: #FFF;
-    padding: 5px 10px;
-    font-size: 14px;
-    pointer-events: none;
-    opacity: 1;
-    transition: .2s ease;
-    
-    &.hidden {
-        opacity: 0;
-        display: none;
-    }
-}
\ No newline at end of file
diff --git a/_sass/_home.scss b/_sass/_home.scss
deleted file mode 100644
index 872bd1e..0000000
--- a/_sass/_home.scss
+++ /dev/null
@@ -1,102 +0,0 @@
-.home {
-.page-heading {
-	font-size:40px;
-	font-weight: normal;
-	margin: 0px;
-    @include media-query($on-palm) {
-		margin: 10px;
-		font-size: 34px;
-    }
-}
-.rss-link {
-	float:right;
-    text-decoration: none;
-    border:1px solid;
-    color: #999;
-    background: #fff;
-    font-size: 0.7 * $base-font-size;
-    padding: 1px 8px;
-    
-    &:hover, &:focus {
-        color: #666;
-    }
-}
-.post-list {
-    margin: 0;
-	padding: 10px 0px;
-    list-style: none;
-    > li {
-        padding-bottom: 5px;
-        border-bottom: 2px dotted rgb(63, 63, 63);
-    	margin-bottom: 5px;
-    }
-    .post-title {
-    	font-size: 28px;
-    	font-weight: bold;
-    	margin: 0;
-    }
-    .post-meta {
-    	font-size: $small-font-size;
-    	color: rgb(170, 170, 170);
-        margin: 0 0px;
-        margin-bottom: .5em;
-    }
-    .post-excerpt {
-        &, * {
-            font-size: $small-font-size;
-            line-height: $small-font-size * 1.1;
-            padding-top: 0;
-            padding-bottom: 0;
-	        color: #333;
-        }
-        code, pre, pre * {
-            color: #666;
-            background-color: #eee;
-        }
-        th {
-            border-color: #ccc;
-            background-color: #ccc;
-        }
-        a {
-            color: $color-link-hover;
-        }
-        img {
-            display: block;
-            margin: 1em auto;
-            max-height: 16em;
-            opacity: .7;
-            transition: opacity .3s;
-            &:hover {
-                opacity: 1;
-            }
-        }
-        margin: 0 0px;
-    }
-    @include media-query($on-palm) {
-		padding: 10px;
-    }
-}
-.pagination {
-	text-align:center;
-	text-decoration:none;
-	color: #666;
-	margin: 30px 0;
-    .page_number {
-    	margin:0 30px;
-    }
-    .previous,.next {
-    	padding: 10px 20px;
-    	white-space: nowrap;
-    }
-    a.previous,a.next {
-    	color: #333;
-    	border-radius: 20px;
-    	border: 1px solid #CCC;
-    }
-    a.previous:hover,a.next:hover {
-    	background: #fefefe;
-    	color: #000;
-    	text-decoration:none;
-    }
-}
-}
\ No newline at end of file
diff --git a/_sass/_layout.scss b/_sass/_layout.scss
deleted file mode 100644
index 1e0475b..0000000
--- a/_sass/_layout.scss
+++ /dev/null
@@ -1,211 +0,0 @@
-.wrapper {
-	margin: 0 auto;
-	max-width: 1100px;
-}
-@media (max-width: 1120px) {
-	.wrapper {
-		max-width: 800px;
-	}
-}
-
-.header {
-	line-height: $base-font-size * 2;
-	background-color: $header-bg;
-	padding: 10px;
-	margin: 0;
-	
-	&:after {
-		clear: both;
-		content: ' ';
-		display: block;
-	}
-	
-	.site-title {
-		float: left;
-		color: $header-fg;
-		text-decoration: none;
-		font-size: $base-font-size;
-		line-height: $base-font-size * 2;
-	}
-	.site-nav {
-		text-align:right;
-		
-		a {
-			text-decoration: none;
-			color: $header-link;
-			padding: 10px 20px;
-			white-space: nowrap;
-		
-			&:hover, &:focus {
-				background: $header-bg-hover;
-			}
-		}
-	}
-}
-
-.page-content {
-	background:#e0e0e3;
-	padding: 30px 0;
-
-	.wrapper {
-		position: relative;
-		background: #FAFAFA;
-		box-shadow: 0 1px 4px #999;
-		outline: 1px solid #CCC;
-		&:after {
-			clear:both;
-			content: '';
-			display:block;
-		}
-		&:before {
-			content: '';
-			display:block;
-			position: absolute;
-			width: 300px;
-			height: 100%;
-			left: 800px;
-			top: 0;
-			background: #EEE;
-		}
-	}
-	
-	img {
-		max-width:100%;
-	}
-}
-
-// Colum
-.col-main {
-	position: relative;
-	box-sizing: border-box;
-	padding: 30px;
-	width: 800px;
-	float: left;
-}
-.col-second {
-	position: relative;
-	box-sizing: border-box;
-	float: left;
-	width: 300px;
-	padding: 20px;
-	background: #EEE;
-	z-index: 10;
-}
-.col-box{
-	color: #666;
-	font-size: $small-font-size;
-	padding-bottom: 20px;
-	
-	p {
-	    margin: 0;
-	}
-    ul {
-        padding-left: 20px;
-        margin: 0;
-    }
-	
-	&:not(:first-child) {
-    	border-top: 1px solid #ccc;
-    	padding-top: 20px;
-    }
-    
-    .col-box-title {
-    	color: #333;
-	    margin-bottom: 10px;
-	    font-size: $small-font-size * 1.1;
-    }
-}
-@media (max-width: 1120px) {
-	.page-content .wrapper:before {
-		display: none;
-	}
-	.col-main,
-	.col-second {
-		width: auto;
-		float: none;
-	}
-	.col-box {
-		width: 50%;
-		float: left;
-		margin-bottom: 10px;
-	}
-	.col-box:not(:first-child) {
-		border-top: none;
-		padding-top:0;
-	}
-	.col-second:after {
-		clear: both;
-		display: block;
-		content: ' ';
-	}
-}
-.col-box-author {
-	text-align: center;
-	.avatar {
-		width: 135px;
-		height: 135px;
-		border-radius: 100%;
-		margin: 20px auto;
-		display: block;
-	}
-	.name {
-		font-size: $base-font-size;
-	}
-	.contact {
-		margin-top: 10px;
-		a {
-			background: #999;
-			color: #eee;
-			padding: 5px 10px;
-			text-decoration: none;
-			border-radius: 5px;
-    		white-space: nowrap;
-			
-			&:hover {
-				transition: background 0.3s ease;
-				background: #666;
-			}
-		}
-	}
-}
-
-// footer
-.footer {
-	padding: 60px 0;
-	background-color: #e0e0e3;
-	text-align:center;
-	color:#666;
-	font-size:$small-font-size;
-}
-
-@import "post", "home";
-
-@include media-query($on-laptop) {
-	.page-content {
-		padding: 0;
-	}
-	.footer {
-		padding: 15px 0 ;
-	}
-}
-@include media-query($on-palm) {
-	.header {
-		&, .site-nav{
-			text-align:center;
-		}
-		.site-title {
-			float: none;
-		}
-	}
-	.col-main {
-		padding: 10px;
-	}
-	.col-box {
-		width: 100%;
-		float: none;
-		margin-bottom: 20px;
-	}
-	pre {
-		padding: 10px;
-	}
-}
diff --git a/_sass/_normalize.scss b/_sass/_normalize.scss
deleted file mode 100644
index 08f8950..0000000
--- a/_sass/_normalize.scss
+++ /dev/null
@@ -1,425 +0,0 @@
-/*! normalize.css v3.0.1 | 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,
-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: 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;
-}
diff --git a/_sass/_post.scss b/_sass/_post.scss
deleted file mode 100644
index 474e6e2..0000000
--- a/_sass/_post.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-.post {
-    .post-header {
-    	margin: 0 100px;
-    	margin-bottom: 40px;
-    	padding: 0px;
-        .post-title {
-        	font-size:40px;
-        	font-weight: normal;
-        	margin: 0 -100px;
-        	@include media-query($on-palm) {
-        		font-size: 34px;
-        	}
-        }
-        .post-meta {
-        	color:#999;
-        	font-size:$small-font-size;
-        	margin: 0 -100px;
-        }
-        @include media-query($on-palm) {
-    		text-align:center;
-    		margin-bottom: 10px;
-    		padding: 10px;
-        }
-    }
-    .post-content {
-        color: #333;
-        
-        h1,h2,h3,h4,h5,h6 {
-            color: #000;
-        }
-
-        h1 {
-            font-size: xx-large;
-        }
-        
-        h1, h2 {
-            // font-weight: bold;
-        	margin-bottom: 10px;
-            margin-top: 30px;
-        }
-        
-        h1, h2, h3 {
-            border-bottom: 1px dotted rgb(63, 63, 63);
-        }
-        
-        pre {
-        	margin: 0 -30px;
-            @include media-query($on-palm) {
-		        margin: 0 -10px;
-            }
-        }
-        
-        .middle-image {
-            display: block;
-            margin-left: auto;
-            margin-right: auto
-        }
-    }
-    .post-comments {
-        padding-top: 30px;
-    }
-}
\ No newline at end of file
diff --git a/_sass/_syntax-highlighting.scss b/_sass/_syntax-highlighting.scss
deleted file mode 100644
index 582e053..0000000
--- a/_sass/_syntax-highlighting.scss
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Monokai Theme from https://github.com/richleland/pygments-css/blob/master/monokai.css */
-.highlight {
-    .hll { background-color: #49483e }
-    .c { color: #75715e } /* Comment */
-    .err { color: #960050; background-color: #1e0010 } /* Error */
-    .k { color: #66d9ef } /* Keyword */
-    .l { color: #ae81ff } /* Literal */
-    .n { color: #f8f8f2 } /* Name */
-    .o { color: #f92672 } /* Operator */
-    .p { color: #f8f8f2 } /* Punctuation */
-    .cm { color: #75715e } /* Comment.Multiline */
-    .cp { color: #75715e } /* Comment.Preproc */
-    .c1 { color: #75715e } /* Comment.Single */
-    .cs { color: #75715e } /* Comment.Special */
-    .ge { font-style: italic } /* Generic.Emph */
-    .gs { font-weight: bold } /* Generic.Strong */
-    .kc { color: #66d9ef } /* Keyword.Constant */
-    .kd { color: #66d9ef } /* Keyword.Declaration */
-    .kn { color: #f92672 } /* Keyword.Namespace */
-    .kp { color: #66d9ef } /* Keyword.Pseudo */
-    .kr { color: #66d9ef } /* Keyword.Reserved */
-    .kt { color: #66d9ef } /* Keyword.Type */
-    .ld { color: #e6db74 } /* Literal.Date */
-    .m { color: #ae81ff } /* Literal.Number */
-    .s { color: #e6db74 } /* Literal.String */
-    .na { color: #a6e22e } /* Name.Attribute */
-    .nb { color: #f8f8f2 } /* Name.Builtin */
-    .nc { color: #a6e22e } /* Name.Class */
-    .no { color: #66d9ef } /* Name.Constant */
-    .nd { color: #a6e22e } /* Name.Decorator */
-    .ni { color: #f8f8f2 } /* Name.Entity */
-    .ne { color: #a6e22e } /* Name.Exception */
-    .nf { color: #a6e22e } /* Name.Function */
-    .nl { color: #f8f8f2 } /* Name.Label */
-    .nn { color: #f8f8f2 } /* Name.Namespace */
-    .nx { color: #a6e22e } /* Name.Other */
-    .py { color: #f8f8f2 } /* Name.Property */
-    .nt { color: #f92672 } /* Name.Tag */
-    .nv { color: #f8f8f2 } /* Name.Variable */
-    .ow { color: #f92672 } /* Operator.Word */
-    .w { color: #f8f8f2 } /* Text.Whitespace */
-    .mf { color: #ae81ff } /* Literal.Number.Float */
-    .mh { color: #ae81ff } /* Literal.Number.Hex */
-    .mi { color: #ae81ff } /* Literal.Number.Integer */
-    .mo { color: #ae81ff } /* Literal.Number.Oct */
-    .sb { color: #e6db74 } /* Literal.String.Backtick */
-    .sc { color: #e6db74 } /* Literal.String.Char */
-    .sd { color: #e6db74 } /* Literal.String.Doc */
-    .s2 { color: #e6db74 } /* Literal.String.Double */
-    .se { color: #ae81ff } /* Literal.String.Escape */
-    .sh { color: #e6db74 } /* Literal.String.Heredoc */
-    .si { color: #e6db74 } /* Literal.String.Interpol */
-    .sx { color: #e6db74 } /* Literal.String.Other */
-    .sr { color: #e6db74 } /* Literal.String.Regex */
-    .s1 { color: #e6db74 } /* Literal.String.Single */
-    .ss { color: #e6db74 } /* Literal.String.Symbol */
-    .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
-    .vc { color: #f8f8f2 } /* Name.Variable.Class */
-    .vg { color: #f8f8f2 } /* Name.Variable.Global */
-    .vi { color: #f8f8f2 } /* Name.Variable.Instance */
-    .il { color: #ae81ff } /* Literal.Number.Integer.Long */
-    
-    .gh { } /* Generic Heading & Diff Header */
-    .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */
-    .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */
-    .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */
-}
\ No newline at end of file
diff --git a/_sass/additional/_alert.scss b/_sass/additional/_alert.scss
new file mode 100644
index 0000000..fa5651f
--- /dev/null
+++ b/_sass/additional/_alert.scss
@@ -0,0 +1,29 @@
+.article__content {
+  p.success {
+    padding: map-get($spacers, 2) map-get($spacers, 3);
+    background-color: rgba($green, .1);
+    border: 1px solid $green;
+    border-radius: map-get($base, border-radius);
+  }
+
+  p.info {
+    padding: map-get($spacers, 2) map-get($spacers, 3);
+    background-color: rgba($blue, .1);
+    border: 1px solid $blue;
+    border-radius: map-get($base, border-radius);
+  }
+
+  p.warning {
+    padding: map-get($spacers, 2) map-get($spacers, 3);
+    background-color: rgba($yellow, .1);
+    border: 1px solid $yellow;
+    border-radius: map-get($base, border-radius);
+  }
+
+  p.error {
+    padding: map-get($spacers, 2) map-get($spacers, 3);
+    background-color: rgba($red, .1);
+    border: 1px solid $red;
+    border-radius: map-get($base, border-radius);
+  }
+}
diff --git a/_sass/additional/_photo-frame.scss b/_sass/additional/_photo-frame.scss
new file mode 100644
index 0000000..55a30c7
--- /dev/null
+++ b/_sass/additional/_photo-frame.scss
@@ -0,0 +1,17 @@
+.article__content {
+  img.shadow, .shadow > img {
+    @include box-shadow();
+  }
+
+  img.border, .border > img {
+    border: 1px solid $border-color-l;
+  }
+
+  img.rounded, .rounded > img {
+    border-radius: map-get($base, border-radius);
+  }
+
+  img.circle, .circle > img {
+    border-radius: 50%;
+  }
+}
diff --git a/_sass/additional/_tag.scss b/_sass/additional/_tag.scss
new file mode 100644
index 0000000..6a418ed
--- /dev/null
+++ b/_sass/additional/_tag.scss
@@ -0,0 +1,21 @@
+.article__content {
+  code.success {
+    color: $text-color-function;
+    background-color: $green;
+  }
+
+  code.info {
+    color: $text-color-function;
+    background-color: $blue;
+  }
+
+  code.warning {
+    color: $text-color-function;
+    background-color: $yellow;
+  }
+
+  code.error {
+    color: $text-color-function;
+    background-color: $red;
+  }
+}
diff --git a/_sass/animate/_fade-in-down.scss b/_sass/animate/_fade-in-down.scss
new file mode 100644
index 0000000..a32a4e7
--- /dev/null
+++ b/_sass/animate/_fade-in-down.scss
@@ -0,0 +1,10 @@
+@include keyframes(fade-in-down) {
+  from {
+    opacity: 0;
+    @include transform(translateY(-2rem));
+  }
+  to {
+    opacity: 1;
+    @include transform(translateY(0));
+  }
+}
diff --git a/_sass/animate/_fade-in-up.scss b/_sass/animate/_fade-in-up.scss
new file mode 100644
index 0000000..920a0bb
--- /dev/null
+++ b/_sass/animate/_fade-in-up.scss
@@ -0,0 +1,10 @@
+@include keyframes(fade-in-up) {
+  from {
+    opacity: 0;
+    @include transform(translateY(2rem));
+  }
+  to {
+    opacity: 1;
+    @include transform(translateY(0));
+  }
+}
diff --git a/_sass/animate/_fade-in.scss b/_sass/animate/_fade-in.scss
new file mode 100644
index 0000000..03fdea8
--- /dev/null
+++ b/_sass/animate/_fade-in.scss
@@ -0,0 +1,8 @@
+@include keyframes(fade-in) {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
diff --git a/_sass/common/_classes.scss b/_sass/common/_classes.scss
new file mode 100644
index 0000000..b5615d8
--- /dev/null
+++ b/_sass/common/_classes.scss
@@ -0,0 +1,24 @@
+/* stylelint-disable at-rule-name-space-after, at-rule-semicolon-space-before  */
+@charset "utf-8";
+@import
+  "common/classes/animation",
+  "common/classes/transform",
+  "common/classes/transition",
+  "common/classes/user-select",
+
+  "common/classes/clearfix",
+  "common/classes/media",
+  "common/classes/clickable",
+  "common/classes/display",
+  "common/classes/flex",
+  "common/classes/horizontal-rules",
+  "common/classes/pseudo",
+  "common/classes/link",
+  "common/classes/text",
+  "common/classes/overflow",
+  "common/classes/shadow",
+  "common/classes/spacing",
+  "common/classes/split-line",
+  "common/classes/grid"
+;
+/* stylelint-enable */
diff --git a/_sass/common/_function.scss b/_sass/common/_function.scss
new file mode 100644
index 0000000..1de2492
--- /dev/null
+++ b/_sass/common/_function.scss
@@ -0,0 +1,15 @@
+@function get-color-theme($color) {
+  @if lightness($color) < 15% {
+    @return "dark";
+  } @else {
+    @return "light";
+  }
+}
+
+@function breakpoint-infix($name, $breakpoints: default) {
+  @if $breakpoints == default {
+    $breakpoints: $responsive;
+  }
+  $min: map-get($breakpoints, $name);
+  @return if($min != 0, "#{$name}-", "");
+}
diff --git a/_sass/common/_print.scss b/_sass/common/_print.scss
new file mode 100644
index 0000000..d798d87
--- /dev/null
+++ b/_sass/common/_print.scss
@@ -0,0 +1,20 @@
+@media print {
+  a {
+    @include plain() {
+      text-decoration: underline;
+    }
+    @include hover() {
+      text-decoration: underline;
+    }
+    @include active() {
+      text-decoration: underline;
+    }
+  }
+
+  img,
+  tr,
+  pre,
+  blockquote {
+    page-break-inside: avoid;
+  }
+}
diff --git a/_sass/common/_reset.scss b/_sass/common/_reset.scss
new file mode 100644
index 0000000..2062d37
--- /dev/null
+++ b/_sass/common/_reset.scss
@@ -0,0 +1,174 @@
+@mixin block-elements {
+  h1,
+  h2,
+  h3,
+  h4,
+  h5,
+  h6,
+  p,
+  hr,
+  blockquote,
+  figure,
+  pre,
+  .highlighter-rouge,
+  ul,
+  ol,
+  dl,
+  table,
+  .footnotes {
+    @content;
+  }
+}
+@mixin heading-elements {
+  h1, h2, h3, h4, h5, h6 {
+    @content;
+  }
+}
+
+*,
+::before,
+::after {
+  box-sizing: border-box;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+/**
+ * 1. Prevent adjustments of font size after orientation changes in iOS.
+ **/
+
+html {
+  font-size: map-get($base, font-size-root);
+  -webkit-text-size-adjust: 100%; /* 1 */
+  @media print {
+    font-size: map-get($base, font-size-root-sm);
+  }
+}
+
+body {
+  padding: 0;
+  margin: 0;
+  font: map-get($base, font-weight) #{map-get($base, font-size)}/#{map-get($base, line-height)} map-get($base, font-family);
+  ::-moz-selection {
+    background: $select-color;
+  }
+  ::-webkit-selection {
+    background: $select-color;
+  }
+  ::selection {
+    background: $select-color;
+  }
+}
+
+@include block-elements() {
+  padding: 0;
+  margin: map-get($spacers, 2) 0;
+}
+
+input, textarea, select, button {
+  font: map-get($base, font-weight) #{map-get($base, font-size)}/#{map-get($base, line-height)} map-get($base, font-family);
+  color: $text-color;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+strong {
+  font-weight: map-get($base, font-weight-bold);
+}
+
+h1 {
+  font-size: map-get($base, font-size-h1);
+  color: $text-color-d;
+  @include media-breakpoint-down(md) {
+    font-size: map-get($base, font-size-h1-sm);
+  }
+}
+
+h2 {
+  font-size: map-get($base, font-size-h2);
+  color: $text-color-d;
+  @include media-breakpoint-down(md) {
+    font-size: map-get($base, font-size-h2-sm);
+  }
+}
+
+h3 {
+  font-size: map-get($base, font-size-h3);
+  color: $text-color-d;
+  @include media-breakpoint-down(md) {
+    font-size: map-get($base, font-size-h3-sm);
+  }
+}
+
+h4 {
+  font-size: map-get($base, font-size-h4);
+  color: $text-color;
+  @include media-breakpoint-down(md) {
+    font-size: map-get($base, font-size-h4-sm);
+  }
+}
+
+h5 {
+  font-size: map-get($base, font-size-h5);
+  color: $text-color;
+  @include media-breakpoint-down(md) {
+    font-size: map-get($base, font-size-h5-sm);
+  }
+}
+
+h6 {
+  font-size: map-get($base, font-size-h6);
+  color: $text-color-l;
+  @include media-breakpoint-down(md) {
+    font-size: map-get($base, font-size-h6-sm);
+  }
+}
+
+a {
+  font-weight: map-get($base, font-weight-bold);
+  @include link-colors($main-color-1);
+}
+
+pre, code {
+  font-family: map-get($base, font-family-code);
+}
+
+code {
+  font-size: map-get($base, font-size-xs);
+  line-height: map-get($base, line-height-sm);
+}
+
+figure > img {
+  display: block;
+}
+
+figcaption {
+  font-size: map-get($base, font-size-sm);
+}
+
+button {
+  padding: 0;
+  margin: 0;
+  font-size: map-get($spacers, 3);
+  cursor: pointer;
+  background-color: transparent;
+  border-width: 0;
+  outline: none;
+}
+
+input {
+  &::-ms-clear {
+    display: none;
+  }
+  &:focus {
+    outline: none;
+  }
+}
+
+// mermaid
+.mermaidTooltip {
+  display: none;
+}
diff --git a/_sass/common/_variables.scss b/_sass/common/_variables.scss
new file mode 100644
index 0000000..faf4e98
--- /dev/null
+++ b/_sass/common/_variables.scss
@@ -0,0 +1,150 @@
+$base: (
+  font-family:            (-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif),
+  font-family-code:       (Menlo, Monaco, Consolas, Andale Mono, lucida console, Courier New, monospace),
+
+  font-size-root:         16px,
+  font-size-root-sm:      14px,
+
+  font-size-xl:           1.5rem,
+  font-size-lg:           1.25rem,
+  font-size:              1rem,
+  font-size-sm:           .85rem,
+  font-size-xs:           .7rem,
+
+  font-size-h1-xl:        3.5rem,
+  font-size-h2-xl:        2.5rem,
+  font-size-h3-xl:        2rem,
+  font-size-h4-xl:        1.75rem,
+  font-size-h5-xl:        1.5rem,
+  font-size-h6-xl:        1.5rem,
+
+  font-size-h1-lg:        3rem,
+  font-size-h2-lg:        2rem,
+  font-size-h3-lg:        1.75rem,
+  font-size-h4-lg:        1.5rem,
+  font-size-h5-lg:        1.25rem,
+  font-size-h6-lg:        1.25rem,
+
+  font-size-h1:           2.5rem,
+  font-size-h2:           1.9rem,
+  font-size-h3:           1.5rem,
+  font-size-h4:           1.2rem,
+  font-size-h5:           1rem,
+  font-size-h6:           1rem,
+
+  font-size-h1-sm:        2rem,
+  font-size-h2-sm:        1.5rem,
+  font-size-h3-sm:        1.35rem,
+  font-size-h4-sm:        1.15rem,
+  font-size-h5-sm:        1rem,
+  font-size-h6-sm:        1rem,
+
+  font-size-h1-xs:        1.05rem,
+  font-size-h2-xs:        1rem,
+  font-size-h3-xs:        .95rem,
+  font-size-h4-xs:        .9rem,
+  font-size-h5-xs:        .85rem,
+  font-size-h6-xs:        .85rem,
+
+  font-weight:            400,
+  font-weight-bold:       700,
+
+  line-height-xl:         2,
+  line-height-lg:         1.8,
+  line-height:            1.6,
+  line-height-sm:         1.4,
+  line-height-xs:         1.2,
+
+  spacer:                 1rem,
+
+  border-radius-lg:       .8rem,
+  border-radius:          .4rem,
+  border-radius-sm:       .2rem
+);
+
+$spacers: (
+  0:                      0,
+  1:                      map-get($base, spacer) * .25,
+  2:                      map-get($base, spacer) * .5,
+  3:                      map-get($base, spacer),
+  4:                      map-get($base, spacer) * 1.5,
+  5:                      map-get($base, spacer) * 3
+);
+
+$z-indexes: (
+  actions: 996,
+  mask: 997,
+  sidebar: 998,
+  modal: 999
+);
+
+$layout: (
+  header-height:          5rem,
+  header-height-sm:       3rem,
+  content-max-width:      950px,
+  sidebar-width:          250px,
+  sidebar-header-height:  3rem,
+  aside-width:            220px
+);
+
+//     sm       md       lg
+// | ------ | ------ | ------ |
+// 0       500      1024      -
+
+$responsive: (
+  sm:                      0,
+  md:                      500px,
+  lg:                      1024px
+);
+
+$animation: (
+  duration:               .4s,
+  duration-sm:            .2s,
+  timing-function:        ease-in-out
+);
+
+$clickable: (
+  transition:             all .2s ease-in-out
+);
+
+$button-height-xl:        2.8rem;
+$button-height-lg:        2.3rem;
+$button-height:           1.9rem;
+$button-height-sm:        1.5rem;
+$button-height-xs:        1.2rem;
+
+$button: (
+  padding-y-xl:           ($button-height-xl - map-get($base, font-size-xl)) / 2,
+  padding-x-xl:           $button-height-xl / 3,
+  padding-y-lg:           ($button-height-lg - map-get($base, font-size-lg)) / 2,
+  padding-x-lg:           $button-height-lg / 3,
+  padding-y:              ($button-height - map-get($base, font-size)) / 2,
+  padding-x:              $button-height / 3,
+  padding-y-sm:           ($button-height-sm - map-get($base, font-size-sm)) / 2,
+  padding-x-sm:           $button-height-sm / 3,
+  padding-y-xs:           ($button-height-xs - map-get($base, font-size-xs)) / 2,
+  padding-x-xs:           $button-height-xs / 3,
+
+  pill-radius:            6rem,
+
+  circle-diameter-xl:     $button-height-xl,
+  circle-diameter-lg:     $button-height-lg,
+  circle-diameter:        $button-height,
+  circle-diameter-sm:     $button-height-sm,
+  circle-diameter-xs:     $button-height-xs,
+
+  font-weight:            map-get($base, font-weight-bold)
+);
+
+$image: (
+  width-xl:  20em,
+  width-lg:  16rem,
+  width:     12rem,
+  width-sm:  8rem,
+  width-xs:  4rem
+);
+
+$menu: (
+  horizontal-spacer: 1,
+  horizontal-item-vertical-spacer: 1
+);
diff --git a/_sass/common/classes/_animation.scss b/_sass/common/classes/_animation.scss
new file mode 100644
index 0000000..2dbc47d
--- /dev/null
+++ b/_sass/common/classes/_animation.scss
@@ -0,0 +1,13 @@
+@mixin animation($value) {
+  -webkit-animation: $value;
+  animation: $value;
+}
+
+@mixin keyframes($name) {
+  @-webkit-keyframes #{$name} {
+    @content;
+  }
+  @keyframes #{$name} {
+    @content;
+  }
+}
diff --git a/_sass/common/classes/_clearfix.scss b/_sass/common/classes/_clearfix.scss
new file mode 100644
index 0000000..caf3124
--- /dev/null
+++ b/_sass/common/classes/_clearfix.scss
@@ -0,0 +1,19 @@
+@mixin clearfix() {
+  &::after {
+    display: table;
+    clear: both;
+    content: "";
+  }
+}
+
+.clearfix {
+  @include clearfix();
+}
+
+.left {
+  float: left;
+}
+
+.right {
+  float: right;
+}
diff --git a/_sass/common/classes/_clickable.scss b/_sass/common/classes/_clickable.scss
new file mode 100644
index 0000000..af32eff
--- /dev/null
+++ b/_sass/common/classes/_clickable.scss
@@ -0,0 +1,159 @@
+@mixin clickable($clr, $bg-clr, $hover-clr: default, $hover-bg-clr: default, $active-clr: default, $active-bg-clr: default, $focus-clr: default, $focus-bg-clr: default, $theme: default, $ignore-path: default) {
+
+  @if $theme == default {
+    @if $bg-clr == null and $hover-bg-clr == null {
+      @if $hover-clr == default {
+        $theme: get-color-theme($clr);
+      } @else {
+        $theme: get-color-theme($hover-clr);
+      }
+    } @else {
+      @if $hover-bg-clr == default {
+        $theme: get-color-theme($bg-clr);
+      } @else {
+        $theme: get-color-theme($hover-bg-clr);
+      }
+    }
+  }
+
+  @if $ignore-path == default {
+    $ignore-path: false;
+  } @else {
+    $ignore-path: true;
+  }
+
+  @include transition(map-get($clickable, transition));
+  @if $ignore-path == false {
+    svg {
+      path {
+        @include transition(map-get($clickable, transition));
+      }
+    }
+  }
+
+  // hover
+  @if $hover-clr == default {
+    @if $hover-bg-clr == null {
+      @if $theme == "light" {
+        $hover-clr: darken($clr, 14%);
+      }
+      @if $theme == "dark" {
+        $hover-clr: lighten($clr, 18%);
+      }
+    } @else if $hover-bg-clr == default {
+      $hover-clr: $clr;
+    }
+  }
+
+  @if $hover-bg-clr == default {
+    @if $theme == "light" {
+      $hover-bg-clr: darken($bg-clr, 14%);
+    }
+    @if $theme == "dark" {
+      $hover-bg-clr: lighten($bg-clr, 18%);
+    }
+  }
+
+  // active
+  @if $active-clr == default {
+    @if $active-bg-clr == null {
+      @if $theme == "light" {
+        $active-clr: darken($hover-clr, 15%);
+      }
+      @if $theme == "dark" {
+        $active-clr: lighten($hover-clr, 16%);
+      }
+    } @else if $active-bg-clr == default {
+      $active-clr: $hover-clr;
+    }
+  }
+
+  @if $active-bg-clr == default {
+    @if $theme == "light" {
+      $active-bg-clr: darken($hover-bg-clr, 15%);
+    }
+    @if $theme == "dark" {
+      $active-bg-clr: lighten($hover-bg-clr, 16%);
+    }
+  }
+
+  // focus
+  @if $focus-clr == default {
+    @if $focus-bg-clr == null {
+      $focus-clr: $hover-clr;
+    } @else if $hover-bg-clr == default {
+      $focus-clr: $hover-clr;
+    }
+  }
+
+  @if $focus-bg-clr == default {
+    $focus-bg-clr: $hover-bg-clr;
+  }
+
+  @include plain() {
+    color: $clr;
+    @if $bg-clr {
+      background-color: $bg-clr;
+    }
+    @if $ignore-path == false {
+      svg path {
+        fill: $clr;
+      }
+    }
+  }
+  @include hover() {
+    color: $hover-clr;
+    @if $hover-bg-clr {
+      background-color: $hover-bg-clr;
+    }
+    @if $ignore-path == false {
+      svg path {
+        fill: $hover-clr;
+      }
+    }
+  }
+  @include active() {
+    color: $active-clr;
+    @if $active-bg-clr {
+      background-color: $active-bg-clr;
+    }
+    @if $ignore-path == false {
+      svg path {
+        fill: $active-clr;
+      }
+    }
+  }
+  @include focus() {
+    color: $focus-clr;
+    @if $focus-bg-clr{
+      background-color: $focus-bg-clr;
+      box-shadow: 0 0 0 2px rgba($focus-bg-clr, .4);
+    }
+    @if $ignore-path == false {
+      svg path {
+        fill: $focus-clr;
+      }
+    }
+  }
+  @include disabled() {
+    @if $theme == "light" {
+      color: rgba($clr, .2) !important;
+    }
+    @if $theme == "dark" {
+      color: rgba($clr, .4) !important;
+    }
+    @if $bg-clr {
+      background-color: $bg-clr !important;
+    }
+    @if $ignore-path == false {
+      svg path {
+        @if $theme == "light" {
+          fill: rgba($clr, .2) !important;
+        }
+        @if $theme == "dark" {
+          fill: rgba($clr, .4) !important;
+        }
+      }
+    }
+  }
+}
diff --git a/_sass/common/classes/_display.scss b/_sass/common/classes/_display.scss
new file mode 100644
index 0000000..411611e
--- /dev/null
+++ b/_sass/common/classes/_display.scss
@@ -0,0 +1,13 @@
+@each $breakpoint in map-keys($responsive) {
+  @include media-breakpoint-up($breakpoint) {
+    .d-#{breakpoint-infix($breakpoint)}none {
+      display: none !important;
+    }
+  }
+}
+
+.d-print-none {
+  @media print {
+    display: none !important;
+  }
+}
diff --git a/_sass/common/classes/_flex.scss b/_sass/common/classes/_flex.scss
new file mode 100644
index 0000000..59e1570
--- /dev/null
+++ b/_sass/common/classes/_flex.scss
@@ -0,0 +1,394 @@
+// Flexbox Mixins
+// http://philipwalton.github.io/solved-by-flexbox/
+// https://github.com/philipwalton/solved-by-flexbox
+//
+// Copyright (c) 2013 Brian Franco
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// This is a set of mixins for those who want to mess around with flexbox
+// using the native support of current browsers. For full support table
+// check: http://caniuse.com/flexbox
+//
+// Basically this will use:
+//
+// * Fallback, old syntax (IE10, mobile webkit browsers - no wrapping)
+// * Final standards syntax (FF, Safari, Chrome, IE11, Opera)
+//
+// This was inspired by:
+//
+// * http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/
+//
+// With help from:
+//
+// * http://w3.org/tr/css3-flexbox/
+// * http://the-echoplex.net/flexyboxes/
+// * http://msdn.microsoft.com/en-us/library/ie/hh772069(v=vs.85).aspx
+// * http://css-tricks.com/using-flexbox/
+// * http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/
+// * https://developer.mozilla.org/en-us/docs/web/guide/css/flexible_boxes
+
+//----------------------------------------------------------------------
+
+// Flexbox Containers
+//
+// The 'flex' value causes an element to generate a block-level flex
+// container box.
+//
+// The 'inline-flex' value causes an element to generate a inline-level
+// flex container box.
+//
+// display: flex | inline-flex
+//
+// http://w3.org/tr/css3-flexbox/#flex-containers
+//
+// (Placeholder selectors for each type, for those who rather @extend)
+
+@mixin flexbox {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -moz-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+
+%flexbox { @include flexbox; }
+
+//----------------------------------
+
+@mixin inline-flex {
+  display: -webkit-inline-box;
+  display: -webkit-inline-flex;
+  display: -moz-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+}
+
+%inline-flex { @include inline-flex; }
+
+//----------------------------------------------------------------------
+
+// Flexbox Direction
+//
+// The 'flex-direction' property specifies how flex items are placed in
+// the flex container, by setting the direction of the flex container's
+// main axis. This determines the direction that flex items are laid out in.
+//
+// Values: row | row-reverse | column | column-reverse
+// Default: row
+//
+// http://w3.org/tr/css3-flexbox/#flex-direction-property
+
+@mixin flex-direction($value: row) {
+  @if $value == row-reverse {
+    -webkit-box-direction: reverse;
+    -webkit-box-orient: horizontal;
+  } @else if $value == column {
+    -webkit-box-direction: normal;
+    -webkit-box-orient: vertical;
+  } @else if $value == column-reverse {
+    -webkit-box-direction: reverse;
+    -webkit-box-orient: vertical;
+  } @else {
+    -webkit-box-direction: normal;
+    -webkit-box-orient: horizontal;
+  }
+  -webkit-flex-direction: $value;
+  -moz-flex-direction: $value;
+  -ms-flex-direction: $value;
+  flex-direction: $value;
+}
+// Shorter version:
+@mixin flex-dir($args...) { @include flex-direction($args...); }
+
+//----------------------------------------------------------------------
+
+// Flexbox Wrap
+//
+// The 'flex-wrap' property controls whether the flex container is single-line
+// or multi-line, and the direction of the cross-axis, which determines
+// the direction new lines are stacked in.
+//
+// Values: nowrap | wrap | wrap-reverse
+// Default: nowrap
+//
+// http://w3.org/tr/css3-flexbox/#flex-wrap-property
+
+@mixin flex-wrap($value: nowrap) {
+  // No Webkit Box fallback.
+  -webkit-flex-wrap: $value;
+  -moz-flex-wrap: $value;
+  @if $value == nowrap {
+    -ms-flex-wrap: none;
+  } @else {
+    -ms-flex-wrap: $value;
+  }
+  flex-wrap: $value;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox Flow (shorthand)
+//
+// The 'flex-flow' property is a shorthand for setting the 'flex-direction'
+// and 'flex-wrap' properties, which together define the flex container's
+// main and cross axes.
+//
+// Values: <flex-direction> | <flex-wrap>
+// Default: row nowrap
+//
+// http://w3.org/tr/css3-flexbox/#flex-flow-property
+
+@mixin flex-flow($values: (row nowrap)) {
+  // No Webkit Box fallback.
+  -webkit-flex-flow: $values;
+  -moz-flex-flow: $values;
+  -ms-flex-flow: $values;
+  flex-flow: $values;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox Order
+//
+// The 'order' property controls the order in which flex items appear within
+// their flex container, by assigning them to ordinal groups.
+//
+// Default: 0
+//
+// http://w3.org/tr/css3-flexbox/#order-property
+
+@mixin order($int: 0) {
+  -ms-flex-order: $int;
+  -webkit-order: $int;
+  -moz-order: $int;
+  order: $int;
+  -webkit-box-ordinal-group: $int + 1;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox Grow
+//
+// The 'flex-grow' property sets the flex grow factor. Negative numbers
+// are invalid.
+//
+// Default: 0
+//
+// http://w3.org/tr/css3-flexbox/#flex-grow-property
+
+@mixin flex-grow($int: 0) {
+  -webkit-box-flex: $int;
+  -webkit-flex-grow: $int;
+  -moz-flex-grow: $int;
+  -ms-flex-positive: $int;
+  flex-grow: $int;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox Shrink
+//
+// The 'flex-shrink' property sets the flex shrink factor. Negative numbers
+// are invalid.
+//
+// Default: 1
+//
+// http://w3.org/tr/css3-flexbox/#flex-shrink-property
+
+@mixin flex-shrink($int: 1) {
+  -webkit-flex-shrink: $int;
+  -moz-flex-shrink: $int;
+  -ms-flex-negative: $int;
+  flex-shrink: $int;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox Basis
+//
+// The 'flex-basis' property sets the flex basis. Negative lengths are invalid.
+//
+// Values: Like "width"
+// Default: auto
+//
+// http://www.w3.org/TR/css3-flexbox/#flex-basis-property
+
+@mixin flex-basis($value: auto) {
+  -webkit-flex-basis: $value;
+  -moz-flex-basis: $value;
+  -ms-flex-preferred-size: $value;
+  flex-basis: $value;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox "Flex" (shorthand)
+//
+// The 'flex' property specifies the components of a flexible length: the
+// flex grow factor and flex shrink factor, and the flex basis. When an
+// element is a flex item, 'flex' is consulted instead of the main size
+// property to determine the main size of the element. If an element is
+// not a flex item, 'flex' has no effect.
+//
+// Values: none | <flex-grow> <flex-shrink> || <flex-basis>
+// Default: See individual properties (1 1 0).
+//
+// http://w3.org/tr/css3-flexbox/#flex-property
+
+@mixin flex($fg: 1, $fs: null, $fb: null) {
+
+  // Set a variable to be used by box-flex properties
+  $fg-boxflex: $fg;
+
+  // Box-Flex only supports a flex-grow value so let's grab the
+  // first item in the list and just return that.
+  @if type-of($fg) == "list" {
+    $fg-boxflex: nth($fg, 1);
+  }
+
+  -webkit-box-flex: $fg-boxflex;
+  -webkit-flex: $fg $fs $fb;
+  -moz-box-flex: $fg-boxflex;
+  -moz-flex: $fg $fs $fb;
+  -ms-flex: $fg $fs $fb;
+  flex: $fg $fs $fb;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox Justify Content
+//
+// The 'justify-content' property aligns flex items along the main axis
+// of the current line of the flex container. This is done after any flexible
+// lengths and any auto margins have been resolved. Typically it helps distribute
+// extra free space leftover when either all the flex items on a line are
+// inflexible, or are flexible but have reached their maximum size. It also
+// exerts some control over the alignment of items when they overflow the line.
+//
+// Note: 'space-*' values not supported in older syntaxes.
+//
+// Values: flex-start | flex-end | center | space-between | space-around
+// Default: flex-start
+//
+// http://w3.org/tr/css3-flexbox/#justify-content-property
+
+@mixin justify-content($value: flex-start) {
+  @if $value == flex-start {
+    -webkit-box-pack: start;
+    -ms-flex-pack: start;
+  } @else if $value == flex-end {
+    -webkit-box-pack: end;
+    -ms-flex-pack: end;
+  } @else if $value == space-between {
+    -webkit-box-pack: justify;
+    -ms-flex-pack: justify;
+  } @else if $value == space-around {
+    -ms-flex-pack: distribute;
+  } @else {
+    -webkit-box-pack: $value;
+    -ms-flex-pack: $value;
+  }
+  -webkit-justify-content: $value;
+  -moz-justify-content: $value;
+  justify-content: $value;
+}
+// Shorter version:
+@mixin flex-just($args...) { @include justify-content($args...); }
+
+//----------------------------------------------------------------------
+
+// Flexbox Align Items
+//
+// Flex items can be aligned in the cross axis of the current line of the
+// flex container, similar to 'justify-content' but in the perpendicular
+// direction. 'align-items' sets the default alignment for all of the flex
+// container's items, including anonymous flex items. 'align-self' allows
+// this default alignment to be overridden for individual flex items. (For
+// anonymous flex items, 'align-self' always matches the value of 'align-items'
+// on their associated flex container.)
+//
+// Values: flex-start | flex-end | center | baseline | stretch
+// Default: stretch
+//
+// http://w3.org/tr/css3-flexbox/#align-items-property
+
+@mixin align-items($value: stretch) {
+  @if $value == flex-start {
+    -webkit-box-align: start;
+    -ms-flex-align: start;
+  } @else if $value == flex-end {
+    -webkit-box-align: end;
+    -ms-flex-align: end;
+  } @else {
+    -webkit-box-align: $value;
+    -ms-flex-align: $value;
+  }
+  -webkit-align-items: $value;
+  -moz-align-items: $value;
+  align-items: $value;
+}
+
+//----------------------------------
+
+// Flexbox Align Self
+//
+// Values: auto | flex-start | flex-end | center | baseline | stretch
+// Default: auto
+
+@mixin align-self($value: auto) {
+  // No Webkit Box Fallback.
+  -webkit-align-self: $value;
+  -moz-align-self: $value;
+  @if $value == flex-start {
+    -ms-flex-item-align: start;
+  } @else if $value == flex-end {
+    -ms-flex-item-align: end;
+  } @else {
+    -ms-flex-item-align: $value;
+  }
+  align-self: $value;
+}
+
+//----------------------------------------------------------------------
+
+// Flexbox Align Content
+//
+// The 'align-content' property aligns a flex container's lines within the
+// flex container when there is extra space in the cross-axis, similar to
+// how 'justify-content' aligns individual items within the main-axis. Note,
+// this property has no effect when the flexbox has only a single line.
+//
+// Values: flex-start | flex-end | center | space-between | space-around | stretch
+// Default: stretch
+//
+// http://w3.org/tr/css3-flexbox/#align-content-property
+
+@mixin align-content($value: stretch) {
+  // No Webkit Box Fallback.
+  -webkit-align-content: $value;
+  -moz-align-content: $value;
+  @if $value == flex-start {
+    -ms-flex-line-pack: start;
+  } @else if $value == flex-end {
+    -ms-flex-line-pack: end;
+  } @else {
+    -ms-flex-line-pack: $value;
+  }
+  align-content: $value;
+}
diff --git a/_sass/common/classes/_grid.scss b/_sass/common/classes/_grid.scss
new file mode 100644
index 0000000..655c254
--- /dev/null
+++ b/_sass/common/classes/_grid.scss
@@ -0,0 +1,80 @@
+$grid-columns: 12;
+
+.grid-container {
+  @include overflow(hidden);
+}
+.cell {
+  min-width: 0;
+}
+
+@mixin make-cell($columns) {
+  @if $columns == "auto" {
+    @include flex(1 1 0);
+    width: auto;
+  } @else if $columns == "shrink" {
+    @include flex(0 0 auto);
+    width: auto;
+  } @else if $columns == "stretch" {
+    @include flex(1);
+  } @else {
+    @include flex(none);
+    width: percentage($columns / $grid-columns);
+  }
+}
+
+@mixin make-grid-cell($columns, $breakpoint) {
+  @include media-breakpoint-up($breakpoint) {
+    .cell--#{breakpoint-infix($breakpoint)}#{$columns} {
+      @include make-cell($columns);
+    }
+  }
+}
+
+.grid {
+  @include flexbox();
+  @include flex-wrap(wrap);
+  & > {
+    @each $breakpoint in map-keys($responsive) {
+      @for $i from 1 through $grid-columns {
+        @include make-grid-cell($i, $breakpoint);
+      }
+      @include make-grid-cell("auto", $breakpoint);
+      @include make-grid-cell("shrink", $breakpoint);
+      @include make-grid-cell("stretch", $breakpoint);
+    }
+  }
+}
+
+.grid--reverse {
+  flex-direction: row-reverse;
+}
+
+@mixin make-grid() {
+  $types: ("p");
+  $directions: ("x", "y", "");
+  $spacers: (0, 1, 2, 3, 4, 5);
+
+  @each $type in $types {
+    @each $direction in $directions {
+      @each $spacer in $spacers {
+        @if $direction == "" {
+          .grid--#{$type}-#{$spacer} {
+            @include make-spacing("m", "", $spacer, true);
+            .cell {
+              @include make-spacing($type, "", $spacer);
+            }
+          }
+        } @else {
+          .grid--#{$type}#{$direction}-#{$spacer} {
+            @include make-spacing("m", $direction, $spacer, true);
+            .cell {
+              @include make-spacing($type, $direction, $spacer);
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+@include make-grid();
diff --git a/_sass/common/classes/_horizontal-rules.scss b/_sass/common/classes/_horizontal-rules.scss
new file mode 100644
index 0000000..74882cf
--- /dev/null
+++ b/_sass/common/classes/_horizontal-rules.scss
@@ -0,0 +1,14 @@
+@mixin horizontal-rules() {
+  &::before {
+    display: block;
+    font-size: map-get($base, font-size-h2);
+    color: $text-color-l;
+    text-align: center;
+    letter-spacing: map-get($spacers, 4);
+    content: "...";
+  }
+}
+
+.horizontal-rules {
+  @include horizontal-rules();
+}
diff --git a/_sass/common/classes/_link.scss b/_sass/common/classes/_link.scss
new file mode 100644
index 0000000..5e0cb48
--- /dev/null
+++ b/_sass/common/classes/_link.scss
@@ -0,0 +1,12 @@
+@mixin link-colors($clr, $hover-clr: default, $active-clr: default, $focus-clr: null, $theme: default, $ignore-path: false) {
+  @include plain() {
+    text-decoration: none;
+  }
+  @include hover() {
+    text-decoration: underline;
+  }
+  @include active() {
+    text-decoration: none;
+  }
+  @include clickable($clr, null, $hover-clr, null, $active-clr, null, $focus-clr, null, $theme, $ignore-path);
+}
diff --git a/_sass/common/classes/_media.scss b/_sass/common/classes/_media.scss
new file mode 100644
index 0000000..e17544e
--- /dev/null
+++ b/_sass/common/classes/_media.scss
@@ -0,0 +1,17 @@
+@mixin media-breakpoint-down($name, $breakpoints: default) {
+  @if $breakpoints == default {
+    $breakpoints: $responsive;
+  }
+  @media (max-width: map-get($breakpoints, $name) - 1) {
+    @content;
+  }
+}
+
+@mixin media-breakpoint-up($name, $breakpoints: default) {
+  @if $breakpoints == default {
+    $breakpoints: $responsive;
+  }
+  @media (min-width: map-get($breakpoints, $name)) {
+    @content;
+  }
+}
diff --git a/_sass/common/classes/_overflow.scss b/_sass/common/classes/_overflow.scss
new file mode 100644
index 0000000..6529bf0
--- /dev/null
+++ b/_sass/common/classes/_overflow.scss
@@ -0,0 +1,26 @@
+@mixin overflow($overflow: auto, $direction: default) {
+  @if $direction == default {
+    overflow: $overflow;
+  } @else if $direction == "x" {
+    @if $overflow == auto {
+      overflow: hidden;
+    }
+    overflow-x: $overflow;
+  } @else if $direction == "y" {
+    @if $overflow == auto {
+      overflow: hidden;
+    }
+    overflow-y: $overflow;
+  }
+  @if $overflow == auto {
+    -webkit-overflow-scrolling: touch;
+  }
+}
+
+.of-auto {
+  @include overflow(auto);
+}
+
+.of-hidden {
+  @include overflow(hidden);
+}
diff --git a/_sass/common/classes/_pseudo.scss b/_sass/common/classes/_pseudo.scss
new file mode 100644
index 0000000..53310a9
--- /dev/null
+++ b/_sass/common/classes/_pseudo.scss
@@ -0,0 +1,33 @@
+@mixin plain() {
+  &,
+  &:link,
+  &:visited {
+    @content;
+  }
+}
+
+@mixin hover() {
+  .root[data-is-touch="false"] &:hover {
+    @content;
+  }
+}
+
+@mixin active() {
+  .root[data-is-touch] &.active,
+  .root[data-is-touch] &:active {
+    @content;
+  }
+}
+
+@mixin focus() {
+  .root[data-is-touch] &.focus {
+    @content;
+  }
+}
+
+@mixin disabled() {
+  &.disabled,
+  &:disabled {
+    @content;
+  }
+}
diff --git a/_sass/common/classes/_shadow.scss b/_sass/common/classes/_shadow.scss
new file mode 100644
index 0000000..e28b9ca
--- /dev/null
+++ b/_sass/common/classes/_shadow.scss
@@ -0,0 +1,22 @@
+@mixin box-shadow($level: default, $color: default) {
+  @if $color == default {
+    $color: #000;
+  }
+  @if $level == 0 {
+    box-shadow: none;
+  }
+  @if $level == 1 or $level == default {
+    box-shadow: 0 4px 8px rgba($color, .23), 0 1px 3px rgba($color, .08), 0 6px 12px rgba($color, .02);
+  }
+  @if $level == 2 {
+    box-shadow: 0 8px 16px rgba($color, .23), 0 2px 6px rgba($color, .08), 0 12px 24px rgba($color, .02);
+  }
+}
+
+.box-shadow-1 {
+  @include box-shadow();
+}
+
+.box-shadow-2 {
+  @include box-shadow(2);
+}
diff --git a/_sass/common/classes/_spacing.scss b/_sass/common/classes/_spacing.scss
new file mode 100644
index 0000000..c07fdce
--- /dev/null
+++ b/_sass/common/classes/_spacing.scss
@@ -0,0 +1,81 @@
+@mixin make-spacing($property, $side, $spacer, $negative: false) {
+
+  $css_property: null;
+  $css_sides: null;
+
+  @if ($property == "m") {
+    $css_property: "margin";
+  } @else if ($property == "p") {
+    $css_property: "padding";
+  }
+
+  @if ($side == "t") {
+    $css_sides: ("top");
+  }
+  @else if ($side == "b") {
+    $css_sides: ("bottom");
+  }
+  @else if ($side == "l") {
+    $css_sides: ("left");
+  }
+  @else if ($side == "r") {
+    $css_sides: ("right");
+  }
+  @else if ($side == "x") {
+    $css_sides: ("left", "right");
+  }
+  @else if ($side == "y") {
+    $css_sides: ("top", "bottom");
+  }
+  @else if ($side == "") {
+    $css_sides: ("");
+  }
+
+  @each $side in $css_sides {
+    @if ($spacer == "auto") {
+      @if ($side == "") {
+        #{$css_property}: auto;
+      } @else {
+        #{$css_property}-#{$side}: auto;
+      }
+    } @else {
+      @if ($side == "") {
+        @if ($negative == true) {
+          #{$css_property}: - map-get($spacers, $spacer);
+        } @else {
+          #{$css_property}: map-get($spacers, $spacer);
+        }
+      } @else {
+        @if ($negative == true) {
+          #{$css_property}-#{$side}: - map-get($spacers, $spacer);
+        } @else {
+          #{$css_property}-#{$side}: map-get($spacers, $spacer);
+        }
+      }
+    }
+  }
+}
+
+@mixin make-spacings() {
+  $propertys: ("m", "p");
+  $sides: ("t", "b", "l", "r", "x", "y", "");
+  $spacers: (0, 1, 2, 3, 4, 5);
+
+  @each $property in $propertys {
+    @each $side in $sides {
+      @each $spacer in $spacers {
+        .#{$property}#{$side}-#{$spacer} {
+          @include make-spacing($property, $side, $spacer);
+        }
+      }
+    }
+  }
+
+  @each $side in $sides {
+    .m#{$side}-auto {
+      @include make-spacing("m", $side, "auto");
+    }
+  }
+}
+
+@include make-spacings();
diff --git a/_sass/common/classes/_split-line.scss b/_sass/common/classes/_split-line.scss
new file mode 100644
index 0000000..4434c6f
--- /dev/null
+++ b/_sass/common/classes/_split-line.scss
@@ -0,0 +1,24 @@
+@mixin split-line($direction: default, $width: default, $color: default) {
+  @if $direction == default {
+    $direction: top;
+  }
+  @if $color == default {
+    $color: $border-color-l;
+  }
+  @if $width == default {
+    $width: 1px;
+  }
+  border: 0 solid $color;
+  @if $direction == top {
+    border-top-width: $width;
+  }
+  @if $direction == right {
+    border-right-width: $width;
+  }
+  @if $direction == bottom {
+    border-bottom-width: $width;
+  }
+  @if $direction == left {
+    border-left-width: $width;
+  }
+}
diff --git a/_sass/common/classes/_text.scss b/_sass/common/classes/_text.scss
new file mode 100644
index 0000000..ac36726
--- /dev/null
+++ b/_sass/common/classes/_text.scss
@@ -0,0 +1,37 @@
+@mixin text-light {
+  color: $text-color-theme-light;
+  h1, h2, h3 {
+    color: $text-color-theme-light-d;
+  }
+  h4, h5 {
+    color: $text-color-theme-light;
+  }
+  h6 {
+    color: $text-color-theme-light-l;
+  }
+  a:not(.button) {
+    @include link-colors($text-color-theme-light, $main-color-1);
+  }
+}
+@mixin text-dark {
+  color: $text-color-theme-dark;
+  h1, h2, h3 {
+    color: $text-color-theme-dark-d;
+  }
+  h4, h5 {
+    color: $text-color-theme-dark;
+  }
+  h6 {
+    color: $text-color-theme-dark-l;
+  }
+  a:not(.button) {
+    @include link-colors($text-color-theme-dark, $main-color-1);
+  }
+}
+
+.text--light {
+  @include text-light();
+}
+.text--dark {
+  @include text-dark();
+}
diff --git a/_sass/common/classes/_transform.scss b/_sass/common/classes/_transform.scss
new file mode 100644
index 0000000..a552879
--- /dev/null
+++ b/_sass/common/classes/_transform.scss
@@ -0,0 +1,4 @@
+@mixin transform($value) {
+  -webkit-transform: $value;
+  transform: $value;
+}
diff --git a/_sass/common/classes/_transition.scss b/_sass/common/classes/_transition.scss
new file mode 100644
index 0000000..abbe08b
--- /dev/null
+++ b/_sass/common/classes/_transition.scss
@@ -0,0 +1,4 @@
+@mixin transition($value) {
+  -webkit-transition: $value;
+  transition: $value;
+}
diff --git a/_sass/common/classes/_user-select.scss b/_sass/common/classes/_user-select.scss
new file mode 100644
index 0000000..104cbb5
--- /dev/null
+++ b/_sass/common/classes/_user-select.scss
@@ -0,0 +1,6 @@
+@mixin user-select($value) {
+  -webkit-user-select: $value;
+  -moz-user-select: $value;
+  -ms-user-select: $value;
+  user-select: $value;
+}
diff --git a/_sass/common/components/_button.scss b/_sass/common/components/_button.scss
new file mode 100644
index 0000000..08ce7a9
--- /dev/null
+++ b/_sass/common/components/_button.scss
@@ -0,0 +1,163 @@
+@mixin button() {
+  display: inline-block;
+  font-weight: map-get($button, font-weight);
+  line-height: 1 !important;
+  text-decoration: none !important;
+  cursor: pointer;
+  outline: none;
+  @include user-select(none);
+  svg {
+    width: 1rem;
+    height: 1rem;
+  }
+  @include disabled() {
+    cursor: not-allowed;
+  }
+}
+
+.button {
+  @include button();
+}
+
+.button--primary {
+  @include clickable($text-color-1, $main-color-1);
+}
+
+.button--secondary {
+  @include clickable($text-color-3, $main-color-3);
+}
+
+.button--success {
+  @include clickable($text-color-function, $green);
+}
+
+.button--info {
+  @include clickable($text-color-function, $blue);
+}
+
+.button--warning {
+  @include clickable($text-color-function, $yellow);
+}
+
+.button--error {
+  @include clickable($text-color-function, $red);
+}
+
+.button--theme-light {
+  @include clickable($text-color-theme-dark, $main-color-theme-light);
+}
+
+.button--theme-dark {
+  @include clickable($text-color-theme-light, $main-color-theme-dark);
+}
+
+.button--outline-primary {
+  color: $main-color-1;
+  border: 1px solid $main-color-1;
+  @include clickable($main-color-1, transparent, $text-color-1, $main-color-1);
+}
+
+.button--outline-secondary {
+  color: $main-color-3;
+  border: 1px solid $main-color-3;
+  @include clickable($main-color-3, transparent, $text-color-3, $main-color-3);
+}
+
+.button--outline-success {
+  color: $green;
+  border: 1px solid $green;
+  @include clickable($green, transparent, $text-color-function, $green);
+}
+
+.button--outline-info {
+  color: $blue;
+  border: 1px solid $blue;
+  @include clickable($blue, transparent, $text-color-function, $blue);
+}
+
+.button--outline-warning {
+  color: $yellow;
+  border: 1px solid $yellow;
+  @include clickable($yellow, transparent, $text-color-function, $yellow);
+}
+
+.button--outline-error {
+  color: $red;
+  border: 1px solid $red;
+  @include clickable($red, transparent, $text-color-function, $red);
+}
+
+.button--outline-theme-light {
+  color: $main-color-theme-light;
+  border: 1px solid $main-color-theme-light;
+  @include clickable($main-color-theme-light, transparent, $text-color-theme-dark, $main-color-theme-light);
+}
+
+.button--outline-theme-dark {
+  color: $main-color-theme-dark;
+  border: 1px solid $main-color-theme-dark;
+  @include clickable($main-color-theme-dark, transparent, $text-color-theme-light, $main-color-theme-dark);
+}
+
+.button--pill {
+  border-radius: map-get($button, pill-radius);
+  @extend .button--md;
+}
+
+.button--rounded {
+  border-radius: map-get($base, border-radius);
+  @extend .button--md;
+}
+
+.button--circle {
+  @include inline-flex();
+  @include justify-content(center);
+  @include align-items(center);
+  border-radius: 50%;
+  @extend .button--md;
+}
+
+.button--md {
+  padding: map-get($button, padding-y) map-get($button, padding-x);
+  font-size: map-get($base, font-size);
+  &.button--circle {
+    width: map-get($button, circle-diameter);
+    height: map-get($button, circle-diameter);
+  }
+}
+
+.button--xs {
+  padding: map-get($button, padding-y-xs) map-get($button, padding-x-xs);
+  font-size: map-get($base, font-size-xs);
+  &.button--circle {
+    width: map-get($button, circle-diameter-xs);
+    height: map-get($button, circle-diameter-xs);
+  }
+}
+
+.button--sm {
+  padding: map-get($button, padding-y-sm) map-get($button, padding-x-sm);
+  font-size: map-get($base, font-size-sm);
+  &.button--circle {
+    width: map-get($button, circle-diameter-sm);
+    height: map-get($button, circle-diameter-sm);
+  }
+}
+
+.button--lg {
+  padding: map-get($button, padding-y-lg) map-get($button, padding-x-lg);
+  font-size: map-get($base, font-size-lg);
+  &.button--circle {
+    width: map-get($button, circle-diameter-lg);
+    height: map-get($button, circle-diameter-lg);
+  }
+}
+
+.button--xl {
+  padding: map-get($button, padding-y-xl) map-get($button, padding-x-xl);
+  font-size: map-get($base, font-size-xl);
+  &.button--circle {
+    width: map-get($button, circle-diameter-xl);
+    height: map-get($button, circle-diameter-xl);
+  }
+}
diff --git a/_sass/common/components/_card.scss b/_sass/common/components/_card.scss
new file mode 100644
index 0000000..2431461
--- /dev/null
+++ b/_sass/common/components/_card.scss
@@ -0,0 +1,103 @@
+
+.card {
+  max-width: 18rem;
+  border-radius: map-get($base, border-radius);
+  @include box-shadow();
+  @include transition(box-shadow map-get($animation, duration) map-get($animation, timing-function));
+  & > :first-child {
+    border-top-left-radius: map-get($base, border-radius);
+    border-top-right-radius: map-get($base, border-radius);
+  }
+  & > :last-child {
+    border-bottom-right-radius: map-get($base, border-radius);
+    border-bottom-left-radius: map-get($base, border-radius);
+  }
+}
+
+.cell {
+  & > .card {
+    max-width: unset;
+  }
+}
+
+.card__content {
+  padding: map-get($spacers, 2) map-get($spacers, 3);
+}
+
+.card__header, .card__header > a {
+  @include link-colors($text-color-d, $main-color-1);
+}
+
+.card__image {
+  position: relative;
+  width: 100%;
+  & > img {
+    display: block;
+    width: 100%;
+    height: auto;
+    border-radius: inherit;
+  }
+  & > .overlay {
+    position: absolute;
+    width: 100%;
+    max-height: 100%;
+    padding: map-get($spacers, 2);
+    a {
+      text-decoration: none !important;
+    }
+  }
+  & > .overlay, & > .overlay--top {
+    top: 0;
+    bottom: auto;
+    border-top-left-radius: inherit;
+    border-top-right-radius: inherit;
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+  & > .overlay--bottom {
+    top: auto;
+    bottom: 0;
+    border-top-left-radius: 0;
+    border-top-right-radius: 0;
+    border-bottom-right-radius: inherit;
+    border-bottom-left-radius: inherit;
+  }
+  & > .overlay--full {
+    top: 0;
+    bottom: 0;
+  }
+  & > .overlay, & > .overlay--dark {
+    @extend .text--dark;
+    background-color: rgba(#000, .4);
+  }
+  & > .overlay--light {
+    @extend .text--light;
+    background: rgba(#fff, .4);
+  }
+}
+
+.card--clickable {
+  cursor: pointer;
+  @include hover() {
+    @include box-shadow(2);
+    .card__image {
+      & > img {
+        height: inherit;
+      }
+    }
+  }
+  @include transition(map-get($clickable, transition));
+}
+
+.card--flat {
+  @include box-shadow(0);
+  .card__image {
+    & > img {
+      border-radius: map-get($base, border-radius);
+    }
+  }
+  .card__content {
+    padding-top: 0;
+    padding-left: 0;
+  }
+}
diff --git a/_sass/common/components/_gallery.scss b/_sass/common/components/_gallery.scss
new file mode 100644
index 0000000..689eeae
--- /dev/null
+++ b/_sass/common/components/_gallery.scss
@@ -0,0 +1,21 @@
+.gallery {
+  height: 100%;
+  @include flexbox();
+  @include flex-direction(column);
+}
+
+.gallery__swiper {
+  @include flex(1);
+}
+
+.gallery-item {
+  @include flexbox();
+  @include align-items(center);
+  @include justify-content(center);
+  height: 100%;
+  overflow: hidden;
+}
+
+.gallery-item__main {
+  display: block;
+}
diff --git a/_sass/common/components/_hero.scss b/_sass/common/components/_hero.scss
new file mode 100644
index 0000000..81a72cc
--- /dev/null
+++ b/_sass/common/components/_hero.scss
@@ -0,0 +1,70 @@
+.hero {
+  background-position: 50% 50%;
+  @include flexbox();
+  @include flex-direction(column);
+  @include justify-content(center);
+  h1 { font-size: map-get($base, font-size-h1-xl); }
+  h2 { font-size: map-get($base, font-size-h2-xl); }
+  h3 { font-size: map-get($base, font-size-h3-xl); }
+  h4 { font-size: map-get($base, font-size-h4-xl); }
+  h5 { font-size: map-get($base, font-size-h5-xl); }
+  h6 { font-size: map-get($base, font-size-h6-xl); }
+  p  { font-size: map-get($base, font-size-xl); }
+  @include media-breakpoint-down(lg) {
+    h1 { font-size: map-get($base, font-size-h1-lg); }
+    h2 { font-size: map-get($base, font-size-h2-lg); }
+    h3 { font-size: map-get($base, font-size-h3-lg); }
+    h4 { font-size: map-get($base, font-size-h4-lg); }
+    h5 { font-size: map-get($base, font-size-h5-lg); }
+    h6 { font-size: map-get($base, font-size-h6-lg); }
+    p  { font-size: map-get($base, font-size-lg); }
+  }
+  @include media-breakpoint-down(md) {
+    h1 { font-size: map-get($base, font-size-h1-sm); }
+    h2 { font-size: map-get($base, font-size-h2-sm); }
+    h3 { font-size: map-get($base, font-size-h3-sm); }
+    h4 { font-size: map-get($base, font-size-h4-sm); }
+    h5 { font-size: map-get($base, font-size-h5-sm); }
+    h6 { font-size: map-get($base, font-size-h6-sm); }
+    p  { font-size: map-get($base, font-size); }
+  }
+  background-size: cover;
+
+}
+
+.hero--center {
+  text-align: center;
+  .menu {
+    @extend .menu--center;
+  }
+}
+
+.hero--light {
+  @extend .text--light;
+}
+
+.hero--dark {
+  @extend .text--dark;
+}
+
+.hero__content {
+  margin: map-get($spacers, 5);
+  @include media-breakpoint-down(lg) {
+    margin: map-get($spacers, 5) map-get($spacers, 4);
+  }
+  @include media-breakpoint-down(md) {
+    margin: map-get($spacers, 4) map-get($spacers, 3);
+  }
+}
+
+.heros {
+  & > .hero {
+    margin: map-get($spacers, 5);
+    @include media-breakpoint-down(lg) {
+      margin: map-get($spacers, 3);
+    }
+    @include media-breakpoint-down(md) {
+      margin: map-get($spacers, 2) 0;
+    }
+  }
+}
diff --git a/_sass/common/components/_image.scss b/_sass/common/components/_image.scss
new file mode 100644
index 0000000..9d1a220
--- /dev/null
+++ b/_sass/common/components/_image.scss
@@ -0,0 +1,19 @@
+.image {
+  max-width: 100%;
+  @extend .image--md;
+}
+.image--md {
+  width: map-get($image, width);
+}
+.image--xl {
+  width: map-get($image, width-xl);
+}
+.image--lg {
+  width: map-get($image, width-lg);
+}
+.image--sm {
+  width: map-get($image, width-sm);
+}
+.image--xs {
+  width: map-get($image, width-xs);
+}
diff --git a/_sass/common/components/_item.scss b/_sass/common/components/_item.scss
new file mode 100644
index 0000000..a1a9fd0
--- /dev/null
+++ b/_sass/common/components/_item.scss
@@ -0,0 +1,100 @@
+.item {
+  @include flexbox();
+  @include media-breakpoint-down(md) {
+    @include flex-direction(column);
+  }
+}
+
+.item__image {
+  margin-right: map-get($spacers, 3);
+  & + .item__content {
+    & > :first-child {
+      margin-top: 0;
+      & > :first-child {
+        margin-top: 0;
+      }
+    }
+  }
+  @include media-breakpoint-down(md) {
+    margin-right: 0;
+  }
+}
+
+.item__content {
+  @include flex(1);
+  min-width: 0;
+}
+
+a > .item__header, a.item__header, .item__header > a {
+  @include link-colors($text-color-d, $main-color-1);
+}
+
+.item__meta {
+  color: $text-color-l;
+}
+
+.item__description {
+  &, .article__content {
+    font-size: map-get($base, font-size-sm);
+    line-height: map-get($base, line-height);
+    @include block-elements() {
+      margin-top: map-get($spacers, 2);
+      margin-bottom: map-get($spacers, 2);
+    }
+    @include heading-elements() {
+      margin-top: map-get($spacers, 3);
+    }
+    h1, h2, h3 {
+      color: $text-color;
+    }
+    h1, h2 {
+      padding: 0;
+      border: none;
+    }
+    h1 {
+      font-size: map-get($base, font-size-h1-xs);
+    }
+    h2 {
+      font-size: map-get($base, font-size-h2-xs);
+    }
+    h3 {
+      font-size: map-get($base, font-size-h3-xs);
+    }
+    h4 {
+      font-size: map-get($base, font-size-h4-xs);
+    }
+    h5 {
+      font-size: map-get($base, font-size-h5-xs);
+    }
+    h6 {
+      font-size: map-get($base, font-size-h6-xs);
+    }
+    img {
+      max-height: 32rem;
+      @include media-breakpoint-down(md) {
+        max-height: 14rem;
+      }
+    }
+  }
+}
+
+.items {
+  & > .item {
+    &:not(:last-child) {
+      margin-bottom: map-get($spacers, 2);
+    }
+  }
+}
+
+.items--divided {
+  & > .item {
+    &:not(:first-child) {
+      padding-top: map-get($spacers, 4);
+    }
+    &:not(:last-child) {
+      padding-bottom: map-get($spacers, 4);
+      @include split-line(bottom);
+    }
+    list-style-type: none;
+  }
+}
diff --git a/_sass/common/components/_menu.scss b/_sass/common/components/_menu.scss
new file mode 100644
index 0000000..222676a
--- /dev/null
+++ b/_sass/common/components/_menu.scss
@@ -0,0 +1,67 @@
+@mixin menu-direction($direction: default) {
+  @if $direction == default {
+    $direction: "horizontal";
+  }
+  @if $direction == "vertical" {
+    @include flex-direction(column);
+  } @else {
+    @include flex-direction(row);
+  }
+}
+
+@mixin menu($horizontal-spacer: default, $horizontal-item-vertical-spacer: default, $wrap: default) {
+  @if $horizontal-spacer == default {
+    $horizontal-spacer: map-get($menu, horizontal-spacer);
+  }
+  @if $horizontal-item-vertical-spacer == default {
+    $horizontal-item-vertical-spacer: map-get($menu, horizontal-item-vertical-spacer);
+  }
+  @if $wrap == default {
+    $wrap: wrap;
+  }
+  @include flexbox();
+  @include flex-wrap($wrap);
+  margin-top: 0;
+  margin-bottom: 0;
+  & > li {
+    @if $horizontal-item-vertical-spacer {
+      margin-top: map-get($spacers, $horizontal-item-vertical-spacer);
+      margin-bottom: map-get($spacers, $horizontal-item-vertical-spacer);
+    }
+    margin-right: map-get($spacers, $horizontal-spacer);
+    list-style-type: none;
+    &:last-child {
+      margin-right: 0;
+    }
+  }
+}
+
+.menu {
+  @include menu();
+  @include menu-direction();
+  @include align-items(center);
+}
+
+.menu--vertical {
+  @include menu-direction("vertical");
+  @include align-items(normal);
+  & > li {
+    margin-right: 0;
+  }
+}
+
+.menu--inline {
+  @include inline-flex();
+}
+
+.menu--center {
+  @include justify-content(center);
+}
+
+.menu--nowrap {
+  @include flex-wrap(nowrap);
+}
+
+.menu--grow {
+  @include flex-grow(1);
+}
diff --git a/_sass/common/components/_modal.scss b/_sass/common/components/_modal.scss
new file mode 100644
index 0000000..cd71628
--- /dev/null
+++ b/_sass/common/components/_modal.scss
@@ -0,0 +1,39 @@
+@mixin modal($z-index: default, $color: default, $background-color: default) {
+  @if $z-index == default {
+    $z-index: map-get($z-indexes, modal);
+  }
+  @if $color == default {
+    $color: $text-color-theme-dark;
+  }
+  @if $background-color == default {
+    $background-color: $mask-color;
+  }
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: $z-index;
+  width: 100%;
+  height: 100%;
+  color: $color;
+  touch-action: none;
+  background-color: $background-color;
+  opacity: 0;
+  @include transform(translate(100%, 0));
+  @include transition(#{opacity map-get($animation, duration) map-get($animation, timing-function),
+  transform 0s map-get($animation, duration) map-get($animation, timing-function)});
+}
+@mixin modal--show() {
+  opacity: 1;
+  @include transform(translate(0, 0));
+  @include transition(#{opacity map-get($animation, duration) map-get($animation, timing-function)});
+}
+
+.modal {
+  @include modal();
+}
+.modal--show {
+  @include modal--show();
+}
+.modal--overflow {
+  @include overflow(auto);
+}
diff --git a/_sass/common/components/_swiper.scss b/_sass/common/components/_swiper.scss
new file mode 100644
index 0000000..3493a62
--- /dev/null
+++ b/_sass/common/components/_swiper.scss
@@ -0,0 +1,48 @@
+.swiper {
+  position: relative;
+  @include overflow(hidden);
+}
+
+.swiper__wrapper, .swiper__slide {
+  width: 100%;
+  height: 100%;
+}
+
+.swiper__wrapper {
+  @include flexbox();
+}
+
+.swiper__wrapper--animation {
+  @include transition(transform map-get($animation, duration) map-get($animation, timing-function));
+}
+
+.swiper__slide {
+  @include flex-shrink(0);
+  & > img {
+    max-width: 100%;
+  }
+}
+
+.swiper__button {
+  position: absolute;
+  top: 50%;
+  @extend .button, .button--circle;
+  @include transform(translate(0, -50%));
+  @include clickable($text-color-d, rgba($main-color-3, .4));
+}
+
+.swiper--light .swiper__button {
+  @include clickable($text-color-theme-light, rgba($main-color-theme-dark, .4));
+}
+
+.swiper--dark .swiper__button {
+  @include clickable($text-color-theme-dark, rgba($main-color-theme-light, .4));
+}
+
+.swiper__button--prev {
+  left: 10px;
+}
+
+.swiper__button--next {
+  right: 10px;
+}
diff --git a/_sass/common/components/_toc.scss b/_sass/common/components/_toc.scss
new file mode 100644
index 0000000..9fd1421
--- /dev/null
+++ b/_sass/common/components/_toc.scss
@@ -0,0 +1,124 @@
+ul.toc {
+  display: block;
+  margin: 0;
+  color: $text-color;
+  list-style-type: none;
+  & > li {
+    margin: map-get($spacers, 1) / 2 0;
+    a {
+      display: inline-block;
+      margin: map-get($spacers, 1) / 4 0;
+      text-decoration: none !important;
+    }
+  }
+  .toc-h1,
+  .toc-h2,
+  .toc-h3,
+  .toc-h4,
+  .toc-h5,
+  .toc-h6 {
+    a {
+      @include link-colors($text-color, $main-color-1);
+    }
+    &.active {
+      a {
+        @include link-colors($main-color-1);
+      }
+    }
+  }
+
+  .toc-h2,
+  .toc-h3,
+  .toc-h4,
+  .toc-h5,
+  .toc-h6 {
+    &, a {
+      font-size: map-get($base, font-size-xs);
+      font-weight: map-get($base, font-weight);
+      line-height: map-get($base, line-height-xs);
+    }
+  }
+  .toc-h1 {
+    @include split-line(bottom);
+    padding: map-get($spacers, 2) 0 map-get($spacers, 1) 0;
+    margin-bottom: map-get($spacers, 2);
+    color: $text-color-d;
+    &, a {
+      font-size: map-get($base, font-size-sm);
+      font-weight: map-get($base, font-weight-bold);
+      line-height: map-get($base, line-height-sm);
+    }
+    a {
+      @include link-colors($text-color-d, $main-color-1);
+    }
+  }
+  .toc-h2 {
+    &, a {
+      font-weight: map-get($base, font-weight-bold);
+    }
+  }
+  .toc-h3 {
+    margin-left: map-get($spacers, 3);
+  }
+  .toc-h4 {
+    margin-left: map-get($spacers, 3) * 2;
+  }
+  .toc-h5,
+  .toc-h6 {
+    margin-left: map-get($spacers, 3) * 3;
+  }
+  .toc-h6 {
+    color: $text-color-l;
+    a {
+      @include link-colors($text-color-l, $main-color-1);
+    }
+  }
+}
+
+ul.toc--ellipsis {
+  & > li {
+    @include overflow(hidden);
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+}
+
+ul.toc--navigator {
+  & > li {
+    a {
+      padding-left: map-get($spacers, 2);
+      margin: map-get($spacers, 1) 0;
+    }
+    &.active {
+      a {
+        margin-left: -4px;
+        @include split-line(left, 4px, $main-color-1);
+      }
+    }
+  }
+  .toc-h2,
+  .toc-h3,
+  .toc-h4 {
+    color: $text-color-l;
+    a {
+      @include link-colors($text-color-l);
+    }
+  }
+  .toc-h1 {
+    &, a {
+      font-size: map-get($base, font-size);
+      line-height: map-get($base, line-height);
+    }
+    color: $text-color;
+    a {
+      @include link-colors($text-color-d);
+    }
+  }
+  .toc-h2 {
+    &, a {
+      font-size: map-get($base, font-size-sm);
+      font-weight: map-get($base, font-weight-bold);
+      line-height: map-get($base, line-height-sm);
+    }
+  }
+}
diff --git a/_sass/components/_article-content.scss b/_sass/components/_article-content.scss
new file mode 100644
index 0000000..6dbda0d
--- /dev/null
+++ b/_sass/components/_article-content.scss
@@ -0,0 +1,221 @@
+.article__content {
+  line-height: map-get($base, line-height-lg);
+  word-wrap: break-word;
+  @media print {
+    line-height: map-get($base, line-height);
+  }
+  @include block-elements() {
+    margin: map-get($spacers, 3) 0;
+    @media print {
+      margin: map-get($spacers, 2) 0;
+    }
+  }
+  @include heading-elements() {
+    position: relative;
+    margin-top: map-get($spacers, 4);
+    @media print {
+      margin-top: map-get($spacers, 3);
+    }
+    & > .anchor {
+      @include link-colors($border-color, $main-color-1);
+      margin-left: map-get($spacers, 1);
+      text-decoration: none;
+      visibility: hidden;
+      opacity: 0;
+      & > i {
+        font-size: map-get($base, font-size-sm);
+      }
+    }
+    @include hover() {
+      & > .anchor {
+        cursor: pointer;
+        visibility: visible;
+        opacity: 1;
+      }
+    }
+  }
+  h1,
+  h2 {
+    @include split-line(bottom);
+  }
+  hr {
+    border: none;
+    @include horizontal-rules();
+  }
+  blockquote {
+    padding-left: map-get($spacers, 3);
+    font-size: map-get($base, font-size-sm);
+    color: $text-color-l;
+    @include split-line(left, 4px, $border-color);
+    p {
+      margin: map-get($spacers, 2) 0;
+    }
+    & > :last-child {
+      margin-bottom: 0;
+    }
+  }
+  img:not(.emoji) {
+    max-width: 100%;
+    vertical-align: middle;
+  }
+  .emoji {
+    display: inline-block;
+    width: map-get($base, line-height-lg) * .7rem;
+    height: map-get($base, line-height-lg) * .7rem;
+    vertical-align: text-bottom;
+  }
+  .footnotes {
+    @include split-line();
+    margin-top: map-get($spacers, 5);
+    @media print {
+      margin-top: map-get($spacers, 2) * 2;
+    }
+  }
+  code {
+    padding: map-get($spacers, 1) map-get($spacers, 2);
+    background-color: $text-background-color;
+    border-radius: map-get($base, border-radius);
+    span {
+      padding: 0;
+      margin: 0;
+    }
+  }
+  pre {
+    @include overflow(auto);
+    & > code {
+      padding: 0;
+      word-wrap: normal;
+      background-color: transparent;
+      &.language-mermaid, &.language-chart {
+        svg {
+          width: 100%;
+        }
+        display: none;
+        &[data-processed] {
+          display: block;
+        }
+      }
+    }
+  }
+  .highlighter-rouge > .highlight, figure.highlight {
+    & > pre {
+      padding: map-get($spacers, 3) 0 map-get($spacers, 3) map-get($spacers, 3);
+      margin: 0;
+      background-color: $text-background-color;
+      border-radius: map-get($base, border-radius);
+      & > code {
+        display: block;
+      }
+    }
+  }
+  figure.highlight {
+    &::before {
+      display: block;
+      padding: map-get($spacers, 2) map-get($spacers, 3) map-get($spacers, 2) 0;
+      font-weight: map-get($base, font-weight-bold);
+      color: $decorate-color;
+      text-align: right;
+      text-transform: uppercase;
+      content: attr(data-lang);
+      background-color: $text-background-color;
+      border-top-left-radius: map-get($base, border-radius);
+      border-top-right-radius: map-get($base, border-radius);
+    }
+    & > pre {
+      padding-top: 0;
+      border-top-left-radius: 0;
+      border-top-right-radius: 0;
+      & > code {
+        & > .rouge-table {
+          width: auto;
+          margin: 0 0 #{- map-get($spacers, 3)} #{- map-get($spacers, 3)};
+          tbody, tr, td {
+            padding-top: 0;
+            padding-bottom: 0;
+            border: none;
+          }
+          & > tbody {
+            @include flexbox;
+            & > tr {
+              width: 100%;
+              @include flexbox;
+              & > .code {
+                padding: 0 0 map-get($spacers, 3) map-get($spacers, 2);
+                @include overflow(auto);
+              }
+            }
+          }
+          tbody td {
+            &.gl {
+              padding-left: map-get($spacers, 3);
+            }
+            & > pre {
+              display: block;
+              margin: 0;
+              border-radius: 0;
+              @include overflow(auto);
+              &.lineno {
+                color: $text-color-l;
+                @include user-select(none);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  ul, ol {
+    margin-left: map-get($spacers, 4);
+    ul, ol {
+      margin-top: 0;
+      margin-bottom: 0;
+    }
+    li {
+      p {
+        margin: map-get($spacers, 2);
+        @media print {
+          margin: map-get($spacers, 1);
+        }
+      }
+    }
+  }
+  dl {
+    dt, dd {
+      p {
+        margin: map-get($spacers, 2);
+        @media print {
+          margin: map-get($spacers, 1);
+        }
+      }
+    }
+    dt {
+      font-weight: map-get($base, font-weight-bold);
+    }
+    dd {
+      margin-left: 2rem;
+    }
+  }
+  ul.task-list {
+    margin-left: 0;
+    list-style-type: none;
+    ul, ol {
+      margin-left: map-get($spacers, 4);
+    }
+  }
+  table {
+    display: block;
+    width: 100%;
+    border-collapse: collapse;
+    @include overflow(auto);
+    thead, tfoot {
+      background-color: $text-background-color;
+    }
+    th, td {
+      padding: map-get($spacers, 2);
+      border: 1px solid $border-color-l;
+    }
+    th {
+      font-weight: map-get($base, font-weight-bold);
+    }
+  }
+}
diff --git a/_sass/components/_article-footer.scss b/_sass/components/_article-footer.scss
new file mode 100644
index 0000000..575bc8d
--- /dev/null
+++ b/_sass/components/_article-footer.scss
@@ -0,0 +1,17 @@
+.article__footer {
+  margin: map-get($spacers, 4) 0;
+  font-size: map-get($base, font-size-sm);
+}
+
+.article__license, .article__subscribe {
+  a {
+    @include link-colors($text-color, $main-color-1);
+  }
+}
+
+.article__license {
+  color: $text-color-l;
+  img {
+    height: map-get($base, font-size) * 1.6;
+  }
+}
diff --git a/_sass/components/_article-header.scss b/_sass/components/_article-header.scss
new file mode 100644
index 0000000..002cc8c
--- /dev/null
+++ b/_sass/components/_article-header.scss
@@ -0,0 +1,50 @@
+.article__header {
+  margin-top: map-get($spacers, 5);
+  margin-bottom: map-get($spacers, 4);
+  @include media-breakpoint-down(md) {
+    margin-top: map-get($spacers, 4);
+  }
+  header, h1 {
+    display: inline;
+  }
+  h1 {
+    word-wrap: break-word;
+  }
+  .split-space {
+    @include user-select(none);
+  }
+  .edit-on-github {
+    text-decoration: none !important;
+  }
+}
+
+.article__header--overlay {
+  .overlay {
+    min-height: 36rem;
+    padding-top: map-get($spacers, 5) * 2;
+    padding-bottom: map-get($spacers, 5) * 2;
+    @include media-breakpoint-down(md) {
+      min-height: 29rem;
+      padding-top: map-get($spacers, 5);
+      padding-bottom: map-get($spacers, 5);
+    }
+  }
+  .overlay__excerpt {
+    font-size: map-get($base, font-size-h3-xl);
+    @include media-breakpoint-down(lg) {
+      font-size: map-get($base, font-size-h3-lg);
+    }
+    @include media-breakpoint-down(md) {
+      font-size: map-get($base, font-size-h3-sm);
+    }
+    font-weight: map-get($base, font-weight-bold);
+  }
+
+  .article__header {
+    margin-top: 0;
+  }
+}
+
+.article__header--cover {
+  width: 100%;
+}
diff --git a/_sass/components/_article-info.scss b/_sass/components/_article-info.scss
new file mode 100644
index 0000000..bebf9b5
--- /dev/null
+++ b/_sass/components/_article-info.scss
@@ -0,0 +1,25 @@
+.article__info {
+  font-size: map-get($base, font-size-sm);
+  color: $text-color-l;
+  .left-col {
+    float: left;
+    @include media-breakpoint-down(md) {
+      float: none;
+    }
+  }
+  .right-col {
+    float: right;
+    margin-left: map-get($button, padding-x-sm);
+    @include media-breakpoint-down(md) {
+      float: none;
+    }
+    & > li {
+      &:not(:last-child) {
+        @include split-line(right, default, $text-color-l);
+        padding-right: map-get($spacers, 2);
+        margin-right: map-get($spacers, 2);
+        line-height: map-get($base, line-height-xs);
+      }
+    }
+  }
+}
diff --git a/_sass/components/_article-list.scss b/_sass/components/_article-list.scss
new file mode 100644
index 0000000..c59550d
--- /dev/null
+++ b/_sass/components/_article-list.scss
@@ -0,0 +1,18 @@
+.article-list {
+  .item__meta {
+    padding: 0 map-get($spacers, 3) 0 0;
+    font-family: map-get($base, font-family-code);
+    font-size: map-get($base, font-size-sm);
+    white-space: nowrap;
+  }
+  &.grid--sm {
+    .card__header {
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+  }
+}
+.article-list__group-header {
+  margin-top: map-get($spacers, 3);
+}
diff --git a/_sass/components/_author-links.scss b/_sass/components/_author-links.scss
new file mode 100644
index 0000000..efe09c2
--- /dev/null
+++ b/_sass/components/_author-links.scss
@@ -0,0 +1,43 @@
+.author-links {
+  & > ul {
+    margin: 0;
+    & > li > {
+      .mail-button {
+        @include clickable($text-color-1, $mail-color);
+      }
+      .facebook-button {
+        @include clickable($text-color-1, $facebook-color);
+      }
+      .twitter-button {
+        @include clickable($text-color-1, $twitter-color);
+      }
+      .weibo-button {
+        @include clickable($text-color-1, $weibo-color);
+      }
+      .googlepluse-button {
+        @include clickable($text-color-1, $google-plus-color);
+      }
+      .telegram-button {
+        @include clickable($text-color-1, $telegram-color);
+      }
+      .medium-button {
+        @include clickable($text-color-1, $medium-color);
+      }
+      .zhihu-button {
+        @include clickable($text-color-1, $zhihu-color);
+      }
+      .douban-button {
+        @include clickable($text-color-1, $douban-color);
+      }
+      .linkedin-button {
+        @include clickable($text-color-1, $linkedin-color);
+      }
+      .github-button {
+        @include clickable($text-color-1, $github-color);
+      }
+      .npm-button {
+        @include clickable($text-color-1, $npm-color);
+      }
+    }
+  }
+}
diff --git a/_sass/components/_author-profile.scss b/_sass/components/_author-profile.scss
new file mode 100644
index 0000000..b506715
--- /dev/null
+++ b/_sass/components/_author-profile.scss
@@ -0,0 +1,26 @@
+.author-profile {
+  max-width: 25rem;
+  padding: map-get($spacers, 2) map-get($spacers, 3);
+  margin: map-get($spacers, 4) 0;
+  font-size: map-get($base, font-size-sm);
+  background-color: $text-background-color;
+  @include media-breakpoint-down(md) {
+    text-align: center;
+  }
+}
+.author-profile__avatar {
+  width: 5rem;
+  height: 5rem;
+  margin-top: map-get($spacers, 2);
+  border-radius: 50%;
+}
+.author-profile__name {
+  font-size: map-get($base, font-size-lg);
+  font-weight: map-get($base, font-weight-bold);
+  a {
+    @include link-colors($text-color, $main-color-1);
+  }
+}
+.author-profile__links {
+  @include overflow(auto);
+}
diff --git a/_sass/components/_extensions.scss b/_sass/components/_extensions.scss
new file mode 100644
index 0000000..7c83f75
--- /dev/null
+++ b/_sass/components/_extensions.scss
@@ -0,0 +1,35 @@
+.extensions {
+  margin: map-get($spacers, 3) 0;
+  @extend .d-print-none;
+}
+
+.extensions--video, .extensions--slide, .extensions--demo {
+  position: relative;
+  width: 100%;
+  padding: 0;
+  & > iframe {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.extensions--video {
+  padding-top: percentage(315 / 560);
+}
+
+.extensions--slide {
+  padding-top: percentage(487 / 599);
+}
+
+.extensions--demo {
+  min-height: 340px;
+  padding-top: percentage(315 / 560);
+}
+
+.extensions--audio {
+  display: block;
+  max-width: 100% !important;
+}
diff --git a/_sass/components/_footer.scss b/_sass/components/_footer.scss
new file mode 100644
index 0000000..63ed8fe
--- /dev/null
+++ b/_sass/components/_footer.scss
@@ -0,0 +1,33 @@
+/**
+ * Site Info
+ */
+
+.footer {
+  @include flexbox();
+  @include align-items(center);
+  color: $footer-text-color;
+  background: $footer-background;
+  a {
+    @include link-colors ($footer-text-color, $main-color-1);
+  }
+  .site-info {
+    font-size: map-get($base, font-size-xs);
+    text-align: center;
+    .menu {
+      line-height: map-get($base, line-height-xs);
+      & > * {
+        &:not(:last-child) {
+          @include split-line(right, default, $footer-text-color);
+          padding-right: map-get($spacers, 1);
+          margin-right: map-get($spacers, 1);
+        }
+      }
+    }
+  }
+}
+.footer__author-links {
+  @include overflow(auto);
+  .author-links {
+    text-align: center;
+  }
+}
diff --git a/_sass/components/_header.scss b/_sass/components/_header.scss
new file mode 100644
index 0000000..44d108d
--- /dev/null
+++ b/_sass/components/_header.scss
@@ -0,0 +1,123 @@
+.header {
+  background: $header-background;
+  a {
+    font-weight: map-get($base, font-weight);
+    text-decoration: none !important;
+    @include link-colors($header-text-color, $main-color-1);
+  }
+  .main {
+    @include flexbox();
+    @include media-breakpoint-down(md) {
+      @include flex-direction(column);
+    }
+  }
+}
+
+.header--dark {
+  @extend .text--dark;
+  background: rgba(#000, .15);
+  .navigation__item--active {
+    &::after {
+      @include split-line(bottom, 4px, $text-color-theme-dark);
+    }
+  }
+}
+
+.header--light {
+  @extend .text--light;
+  background: rgba(#fff, .15);
+  .navigation__item--active {
+    &::after {
+      @include split-line(bottom, 4px, $text-color-theme-light);
+    }
+  }
+}
+
+.header__title {
+  @include menu(3, 0);
+  @include align-items(center);
+  @include flex-wrap(nowrap);
+  @include flex(1);
+  height: map-get($layout, header-height);
+  margin-right: map-get($spacers, 3);
+  white-space: nowrap;
+  @include media-breakpoint-down(md) {
+    height: auto;
+    margin-right: 0;
+  }
+  & > .header__brand {
+    @include flex(1);
+    @include media-breakpoint-down(md) {
+      height: map-get($layout, header-height-sm);
+    }
+  }
+  & > .search-button {
+    display: none;
+    margin-left: map-get($spacers, 2);
+    @include media-breakpoint-down(md) {
+      @include flexbox();
+    }
+  }
+}
+
+.header__brand {
+  @include flexbox();
+  @include align-items(center);
+  & > svg {
+    width: map-get($base, font-size-h4) * 1.6;
+    height: map-get($base, font-size-h4) * 1.6;
+    margin-right: map-get($spacers, 3);
+    vertical-align: middle;
+    @include media-breakpoint-down(md) {
+      width: map-get($base, font-size-h4) * 1.2;
+      height: map-get($base, font-size-h4) * 1.2;
+    }
+  }
+  & > a {
+    display: inline-block;
+    font-size: map-get($base, font-size-h4);
+    @include media-breakpoint-down(md) {
+      font-size: map-get($base, font-size-h4-small);
+    }
+  }
+}
+
+.navigation {
+  @include overflow(auto, "x");
+  & > ul {
+    height: map-get($layout, header-height);
+    padding-bottom: 0;
+    margin: 0;
+    @include media-breakpoint-down(md) {
+      padding-bottom: 4px;
+      margin: -4px 0 0 0;
+    }
+    @include menu(3, 2, nowrap);
+    @include align-items(center);
+    @include media-breakpoint-down(md) {
+      height: auto;
+    }
+    .search-button {
+      @include media-breakpoint-down(md) {
+        display: none;
+      }
+    }
+  }
+}
+
+.navigation__item {
+  &::after {
+    display: block;
+    margin-bottom: -4px;
+    content: "";
+    @include split-line(bottom, 4px, transparent);
+  }
+}
+.navigation__item--active {
+  a {
+    @include link-colors($main-color-1, $main-color-1);
+  }
+  &::after {
+    @include split-line(bottom, 4px, $main-color-1);
+  }
+}
diff --git a/_sass/components/_lightbox.scss b/_sass/components/_lightbox.scss
new file mode 100644
index 0000000..4dad32b
--- /dev/null
+++ b/_sass/components/_lightbox.scss
@@ -0,0 +1,7 @@
+.popup-image {
+  cursor: pointer;
+  @include hover() {
+    @include box-shadow(2);
+  }
+  @include transition(map-get($clickable, transition));
+}
diff --git a/_sass/components/_main.scss b/_sass/components/_main.scss
new file mode 100644
index 0000000..265c727
--- /dev/null
+++ b/_sass/components/_main.scss
@@ -0,0 +1,28 @@
+.main {
+  width: 100%;
+  max-width: map-get($layout, content-max-width);
+  padding: 0 map-get($spacers, 5);
+  margin: 0 auto;
+  @include media-breakpoint-down(lg) {
+    padding: 0 map-get($spacers, 4);
+  }
+  @include media-breakpoint-down(md) {
+    padding: 0 map-get($spacers, 3);
+  }
+}
+
+.has-aside {
+  .main {
+    max-width: map-get($layout, content-max-width) + map-get($layout, aside-width);
+    @include media-breakpoint-down(lg) {
+      max-width: map-get($layout, content-max-width);
+    }
+  }
+}
+
+.full-width {
+  .main {
+    width: 100%;
+    max-width: 100%;
+  }
+}
diff --git a/_sass/components/_search.scss b/_sass/components/_search.scss
new file mode 100644
index 0000000..d28dabc
--- /dev/null
+++ b/_sass/components/_search.scss
@@ -0,0 +1,186 @@
+.search {
+  @include overflow(auto);
+
+}
+.search--google-custom-search-engine {
+  .main {
+    padding-top: map-get($spacers, 4);
+    padding-bottom: map-get($spacers, 4);
+    @include media-breakpoint-down(md) {
+      position: absolute;
+      padding: 0;
+    }
+  }
+}
+
+.search__header {
+  margin-top: map-get($spacers, 4);
+  font-size: map-get($base, font-size-h1);
+  font-weight: map-get($base, font-weight-bold);
+  color: $text-color-d;
+  .search--light & {
+    color: $text-color-theme-light-d;
+  }
+  .search--dark & {
+    color: $text-color-theme-dark-d;
+  }
+  @include media-breakpoint-down(md) {
+    display: none;
+  }
+}
+
+.search-bar {
+  @include flexbox();
+  margin: map-get($spacers, 3) 0 map-get($spacers, 4) 0;
+}
+
+.search-box {
+  position: relative;
+  width: 100%;
+  max-width: 22rem;
+  @include media-breakpoint-down(md) {
+    width: 100%;
+    max-width: none;
+  }
+  & > input {
+    display: inline-block;
+    width: 100%;
+    height: $button-height-lg;
+    padding: 0 2rem;
+    margin: 0;
+    line-height: 1 !important;
+    color: $text-color;
+    background-color: transparent;
+    border: 2px solid $border-color;
+    border-radius: map-get($button, pill-radius);
+    -webkit-appearance: none; /* fix iOS don't display box-shadow properly */
+    @include transition(box-shadow map-get($animation, duration) map-get($animation, timing-function));
+    @include focus {
+      box-shadow: 0 0 0 2px rgba($border-color, .4);
+    }
+    .search--light & {
+      color: $text-color-theme-light;
+      border-color: $text-color-theme-light;
+      @include focus {
+        box-shadow: 0 0 0 2px rgba($text-color-theme-light, .4);
+      }
+    }
+    .search--dark & {
+      color: $text-color-theme-dark;
+      border-color: $text-color-theme-dark;
+      @include focus {
+        box-shadow: 0 0 0 2px rgba($text-color-theme-dark, .4);
+      }
+    }
+  }
+  & > .search-box__icon-search {
+    color: $text-color-l;
+    .search--light & {
+      color: $text-color-theme-light-l;
+    }
+    .search--dark & {
+      color: $text-color-theme-dark-l;
+    }
+  }
+  & > .search-box__icon-clear {
+    & > a {
+      @include link-colors($text-color);
+      .search--light & {
+        @include link-colors($text-color-theme-light);
+      }
+      .search--dark & {
+        @include link-colors($text-color-theme-dark);
+      }
+      cursor: pointer;
+    }
+  }
+  & > .search-box__icon-search, & > .search-box__icon-clear {
+    position: absolute;
+    width: $button-height-lg;
+    height: $button-height-lg;
+    line-height: $button-height-lg;
+    text-align: center;
+    vertical-align: middle;
+  }
+  &.not-empty > .search-box__icon-clear {
+    display: block;
+  }
+  & > .search-box__icon-clear {
+    top: 0;
+    right: 0;
+    display: none;
+  }
+  & > .search-box__icon-search {
+    top: 0;
+    left: 0;
+  }
+}
+
+.search__cancel {
+  margin-left: map-get($spacers, 2);
+  font-weight: map-get($base, font-weight-bold);
+  white-space: nowrap;
+}
+
+.search-result {
+  margin: map-get($spacers, 4) 0;
+  font-size: map-get($base, font-size-sm);
+  line-height: map-get($base, line-height-sm);
+}
+
+.search-result__header {
+  margin: map-get($spacers, 3) 0 map-get($spacers, 2) 0;
+  font-size: map-get($base, font-size-lg);
+  font-weight: map-get($base, font-weight-bold);
+  color: $text-color-l;
+  text-transform: uppercase;
+  .search--light & {
+    color: $text-color-theme-light-l;
+  }
+  .search--dark & {
+    color: $text-color-theme-dark-l;
+  }
+}
+
+.search-result__item {
+  list-style-type: none;
+  a {
+    padding: map-get($spacers, 1) map-get($spacers, 3);
+    @include transition(none);
+    @include clickable($text-color, transparent, $text-color-3, $main-color-3);
+    .search--light & {
+      @include clickable($text-color-theme-light, transparent, $text-color-theme-dark, $main-color-theme-light);
+    }
+    .search--dark & {
+      @include clickable($text-color-theme-dark, transparent, $text-color-theme-light, $main-color-theme-dark);
+    }
+  }
+  &.active {
+    a {
+      @include plain() {
+        color: $text-color-3;
+        background-color: $main-color-3;
+        .search--light & {
+          color: $text-color-theme-dark;
+          background-color: $main-color-theme-light;
+        }
+        .search--dark & {
+          color: $text-color-theme-light;
+          background-color: $main-color-theme-dark;
+        }
+      }
+      @include active() {
+        @include transition(map-get($clickable, transition));
+      }
+    }
+  }
+}
+
+// google search
+.gsc-control-cse {
+  *,
+  ::before,
+  ::after {
+    box-sizing: initial;
+  }
+}
diff --git a/_sass/components/_tags.scss b/_sass/components/_tags.scss
new file mode 100644
index 0000000..946b1b6
--- /dev/null
+++ b/_sass/components/_tags.scss
@@ -0,0 +1,24 @@
+.site-tags {
+  .tag-button {
+    @include clickable($text-color-3, $main-color-3, default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);
+    & > .tag-button__count {
+      display: inline-block;
+      margin-left: map-get($spacers, 1);
+      font-size: map-get($base, font-size-xs);
+      line-height: 1;
+      vertical-align: top;
+    }
+  }
+  .tag-button-1 {
+    @include clickable($text-color-1, rgba($main-color-1, .4), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);
+  }
+  .tag-button-2 {
+    @include clickable($text-color-1, rgba($main-color-1, .55), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);
+  }
+  .tag-button-3 {
+    @include clickable($text-color-1, rgba($main-color-1, .7), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);
+  }
+  .tag-button-4 {
+    @include clickable($text-color-1, rgba($main-color-1, .9), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);
+  }
+}
diff --git a/_sass/custom.scss b/_sass/custom.scss
new file mode 100644
index 0000000..aa7b944
--- /dev/null
+++ b/_sass/custom.scss
@@ -0,0 +1,3 @@
+/* start custom scss snippet */
+
+/* end custom scss snippet */
diff --git a/_sass/layout/_404.scss b/_sass/layout/_404.scss
new file mode 100644
index 0000000..e206f76
--- /dev/null
+++ b/_sass/layout/_404.scss
@@ -0,0 +1,14 @@
+.layout--404 {
+  .sign {
+    display: table;
+    margin: map-get($spacers, 4) auto;
+    margin-top: map-get($spacers, 5);
+    h1 {
+      font-size: map-get($base, font-size-xl) * 4;
+      line-height: 1;
+    }
+    p {
+      font-size: map-get($base, font-size-xl) * 1.2;
+    }
+  }
+}
diff --git a/_sass/layout/_archive.scss b/_sass/layout/_archive.scss
new file mode 100644
index 0000000..7dc417f
--- /dev/null
+++ b/_sass/layout/_archive.scss
@@ -0,0 +1,5 @@
+.layout--archive {
+  & > .layout--archive__result {
+    margin: map-get($spacers, 4) 0;
+  }
+}
diff --git a/_sass/layout/_article.scss b/_sass/layout/_article.scss
new file mode 100644
index 0000000..dd83384
--- /dev/null
+++ b/_sass/layout/_article.scss
@@ -0,0 +1,29 @@
+.article__sharing {
+  margin: map-get($spacers, 4) 0;
+}
+.article__section-navigator {
+  padding-top: map-get($spacers, 3);
+  margin: map-get($spacers, 4) 0 map-get($spacers, 3) 0;
+  word-wrap: break-word;
+  @include split-line(top, 4px);
+  & > .previous, & > .next {
+    width: 50%;
+    & > span {
+      font-weight: map-get($base, font-weight-bold);
+      color: $text-color-l;
+    }
+    & > a {
+      display: block;
+      @include link-colors($text-color, $main-color-1);
+    }
+  }
+  & > .previous {
+    float: left;
+    padding-right: map-get($spacers, 2);
+  }
+  & > .next {
+    float: right;
+    padding-left: map-get($spacers, 2);
+    text-align: right;
+  }
+}
diff --git a/_sass/layout/_articles.scss b/_sass/layout/_articles.scss
new file mode 100644
index 0000000..85f258c
--- /dev/null
+++ b/_sass/layout/_articles.scss
@@ -0,0 +1,17 @@
+.layout--articles {
+  margin: map-get($spacers, 4) 0;
+  margin-top: map-get($spacers, 5);
+  @include media-breakpoint-down(md) {
+    margin-top: map-get($spacers, 4);
+  }
+  .card__header {
+    font-size: map-get($base, font-size);
+  }
+  .card__image {
+    & > .overlay {
+      &, .card__header {
+        font-size: map-get($base, font-size-sm);
+      }
+    }
+  }
+}
diff --git a/_sass/layout/_base.scss b/_sass/layout/_base.scss
new file mode 100644
index 0000000..6200ec5
--- /dev/null
+++ b/_sass/layout/_base.scss
@@ -0,0 +1,6 @@
+.icon {
+  display: block;
+  > svg {
+    display: block;
+  }
+}
diff --git a/_sass/layout/_home.scss b/_sass/layout/_home.scss
new file mode 100644
index 0000000..298e6b9
--- /dev/null
+++ b/_sass/layout/_home.scss
@@ -0,0 +1,15 @@
+.layout--home {
+  .pagination {
+    margin: map-get($spacers, 4) 0;
+  }
+  .pagination__menu {
+    max-width: 100%;
+    @include overflow(auto);
+  }
+  .pagination__omit {
+    color: $text-color-l;
+  }
+  .items {
+    margin-top: map-get($spacers, 4) * 1.5;
+  }
+}
diff --git a/_sass/layout/_landing.scss b/_sass/layout/_landing.scss
new file mode 100644
index 0000000..752d4e7
--- /dev/null
+++ b/_sass/layout/_landing.scss
@@ -0,0 +1,23 @@
+.layout--landing {
+  .heros {
+    max-width: map-get($layout, content-max-width) * 2;
+    margin-right: auto;
+    margin-left: auto;
+  }
+  .hero {
+    img {
+      display: block;
+      width: 100%;
+      margin: 0 auto;
+    }
+  }
+  .hero__content {
+    margin-bottom: 0;
+  }
+  .hero__cover {
+    max-width: map-get($layout, content-max-width);
+  }
+  .hero__cover--full-width {
+    max-width: none;
+  }
+}
diff --git a/_sass/layout/_page.scss b/_sass/layout/_page.scss
new file mode 100644
index 0000000..bb42331
--- /dev/null
+++ b/_sass/layout/_page.scss
@@ -0,0 +1,165 @@
+body,
+html,
+.root,
+.layout--page {
+  height: 100%;
+}
+
+.layout--page {
+  &.layout--page--sidebar {
+    .page__viewport,
+    .page__grid {
+      height: 100%;
+    }
+    @include media-breakpoint-down(lg) {
+      .page__main {
+        @include overflow(unset);
+      }
+    }
+  }
+}
+
+.page__main {
+  height: 100%;
+  color: $text-color;
+  .col-aside {
+    display: none;
+    & > aside {
+      position: absolute;
+      width: map-get($layout, aside-width);
+      @include overflow(hidden);
+    }
+  }
+}
+
+.page__main-inner {
+  position: relative;
+  @include flexbox();
+  @include flex-direction(column);
+  min-height: 100%;
+  background-color: $background-color;
+}
+
+.page__content {
+  @include flex(1);
+  width: 100%;
+  margin: 0 auto;
+  @media print {
+    padding-bottom: 0;
+  }
+}
+.hide-footer {
+  .page__content {
+    padding-bottom: 0;
+  }
+}
+
+.page__comments {
+  margin: map-get($spacers, 4) 0;
+}
+
+.page__aside {
+  .toc-aside {
+    padding: map-get($spacers, 5) 0 map-get($spacers, 3) map-get($spacers, 5);
+  }
+}
+
+.page__actions {
+  position: fixed;
+  bottom: map-get($spacers, 5);
+  left: map-get($spacers, 3);
+  z-index: map-get($z-indexes, actions);
+  display: none;
+}
+
+.page__sidebar {
+  z-index: map-get($z-indexes, sidebar);
+  display: block;
+  width: 80%;
+  max-width: map-get($layout, sidebar-width);
+  height: 100%;
+  background-color: $background-color;
+  @include split-line(right);
+  @include transition(transform map-get($animation, duration));
+  @include overflow(auto);
+  .sidebar-toc {
+    padding: map-get($spacers, 3) map-get($spacers, 3) map-get($spacers, 4) map-get($spacers, 4);
+  }
+}
+.sidebar-button {
+  @include clickable($text-color-d, rgba($main-color-3, .75));
+}
+
+.page__mask {
+  @include modal(map-get($z-indexes, mask));
+  cursor: pointer;
+}
+.layout--page--sidebar {
+  .page__main {
+    @include overflow(auto);
+    @media print {
+      @include overflow(unset);
+    }
+  }
+}
+
+.has-aside {
+  .col-aside {
+    position: relative;
+    display: block;
+    width: map-get($layout, aside-width);
+    & > aside {
+      &.fixed {
+        position: fixed;
+        -webkit-font-smoothing: subpixel-antialiased;
+      }
+    }
+    @include media-breakpoint-down(lg) {
+      display: none;
+    }
+  }
+}
+
+@include media-breakpoint-down(lg) {
+  .page__sidebar {
+    position: fixed;
+    @include transform(translate(- map-get($layout, sidebar-width), 0));
+  }
+
+  .page__actions {
+    display: block;
+  }
+
+  .show-sidebar {
+    .page__actions {
+      visibility: hidden;
+    }
+    .page__sidebar {
+      @include transform(translate(0));
+    }
+    .page__mask {
+      @include modal--show();
+    }
+  }
+}
+
+.hero--light {
+  .article__info {
+    color: $text-color-theme-light;
+  }
+}
+.hero--dark {
+  .article__info {
+    color: $text-color-theme-dark;
+  }
+}
+
+.page__main--immersive {
+  .page__header {
+    position: absolute;
+    width: 100%;
+  }
+  .hero__content {
+    padding-top: map-get($layout, header-height);
+  }
+}
diff --git a/_sass/skins/_chocolate.scss b/_sass/skins/_chocolate.scss
new file mode 100644
index 0000000..b2098d5
--- /dev/null
+++ b/_sass/skins/_chocolate.scss
@@ -0,0 +1,74 @@
+///
+// Skin: Chocolate
+// Author: Tian Qi
+// Email: kitian616@outlook.com
+///
+
+// main colors
+$main-color-1:     #563a20;
+$text-color-1:     rgba(#fff, .85);
+
+$main-color-2:     #8a2827;
+$text-color-2:     rgba(#fff, .85);
+
+$main-color-3:     #b49b92;
+$text-color-3:     rgba(#fff, .85);
+
+$main-color-theme-light: rgba(#000, .9);
+$main-color-theme-dark:  rgba(#fff, .9);
+
+// page background
+$background-color: #d2c2bc;
+
+// text colors
+$text-color-theme-light-d: rgba(#000, .95);
+$text-color-theme-light:   rgba(#000, .85);
+$text-color-theme-light-l: rgba(#000, .5);
+
+$text-color-theme-dark-d:  #fff;
+$text-color-theme-dark:    rgba(#fff, .95);
+$text-color-theme-dark-l:  rgba(#fff, .85);
+
+$text-color-d:     $text-color-theme-light-d;
+$text-color:       $text-color-theme-light;
+$text-color-l:     $text-color-theme-light-l;
+
+$text-background-color: rgba(#000, .05);
+
+// header and footer colors
+$header-text-color: $text-color-3;
+$header-background: $main-color-3;
+
+$footer-text-color: $text-color-3;
+$footer-background: $main-color-3;
+
+// border and shadow colors
+$border-color:     $main-color-3;
+$border-color-l:   mix(#000, $background-color, 10%);
+$decorate-color:   rgba(#000, .1);
+$mask-color:       rgba(#000, .9);
+$select-color:     rgba($main-color-3, .5);
+
+// function colors
+$green:           #5baa34;
+$blue:            #1c7cd4;
+$yellow:          #c9771f;
+$red:             #da3d45;
+$text-color-function: rgba(#fff, .85);
+
+// logo colors
+$mail-color:       #0072c5;
+$facebook-color:   #4267b2;
+$twitter-color:    #1da1f2;
+$weibo-color:      #e6162d;
+$google-plus-color:#ea4335;
+$telegram-color:   #32afed;
+$medium-color:     #000;
+$zhihu-color:      #0084ff;
+$douban-color:     #42bd56;
+$linkedin-color:   #1074af;
+$github-color:     #000;
+$npm-color:        #fff;
+
+// highlight colors
+@import "skins/highlight/tomorrow-night-eighties";
diff --git a/_sass/skins/_dark.scss b/_sass/skins/_dark.scss
new file mode 100644
index 0000000..7250a87
--- /dev/null
+++ b/_sass/skins/_dark.scss
@@ -0,0 +1,74 @@
+///
+// Skin: Dark
+// Author: Tian Qi
+// Email: kitian616@outlook.com
+///
+
+// main colors
+$main-color-1:     #ff9500;
+$text-color-1:     rgba(#fff, .8);
+
+$main-color-2:     #ff006a;
+$text-color-2:     rgba(#fff, .8);
+
+$main-color-3:     #202020;
+$text-color-3:     rgba(#fff, .8);
+
+$main-color-theme-light: rgba(#000, .8);
+$main-color-theme-dark:  rgba(#fff, .8);
+
+// page background
+$background-color: #121212;
+
+// text colors
+$text-color-theme-light-d: #000;
+$text-color-theme-light:   #222;
+$text-color-theme-light-l: #888;
+
+$text-color-theme-dark-d:  rgba(#fff, .8);
+$text-color-theme-dark:    rgba(#fff, .7);
+$text-color-theme-dark-l:  rgba(#fff, .5);
+
+$text-color-d:     $text-color-theme-dark-d;
+$text-color:       $text-color-theme-dark;
+$text-color-l:     $text-color-theme-dark-l;
+
+$text-background-color: rgba(#fff, .05);
+
+// header and footer colors
+$header-text-color: $text-color-3;
+$header-background: $main-color-3;
+
+$footer-text-color: $text-color-3;
+$footer-background: $main-color-3;
+
+// border and shadow colors
+$border-color:     mix(#fff, $background-color, 20%);
+$border-color-l:   mix(#fff, $background-color, 10%);
+$decorate-color:   rgba(#fff, .1);
+$mask-color:       rgba(#000, .9);
+$select-color:     rgba($main-color-1, .5);
+
+// function colors
+$green:           #5baa34;
+$blue:            #1c7cd4;
+$yellow:          #c9771f;
+$red:             #da3d45;
+$text-color-function: rgba(#fff, .8);
+
+// logo colors
+$mail-color:       #0072c5;
+$facebook-color:   #4267b2;
+$twitter-color:    #1da1f2;
+$weibo-color:      #e6162d;
+$google-plus-color:#ea4335;
+$telegram-color:   #32afed;
+$medium-color:     #000;
+$zhihu-color:      #0084ff;
+$douban-color:     #42bd56;
+$linkedin-color:   #1074af;
+$github-color:     #000;
+$npm-color:        #fff;
+
+// highlight colors
+@import "skins/highlight/tomorrow-night";
diff --git a/_sass/skins/_default.scss b/_sass/skins/_default.scss
new file mode 100644
index 0000000..fc28935
--- /dev/null
+++ b/_sass/skins/_default.scss
@@ -0,0 +1,74 @@
+///
+// Skin: Default
+// Author: Tian Qi
+// Email: kitian616@outlook.com
+///
+
+// main colors
+$main-color-1:     #fc4d50;
+$text-color-1:     #fff;
+
+$main-color-2:     #fca24d;
+$text-color-2:     #fff;
+
+$main-color-3:     #f2f2f2;
+$text-color-3:     #333;
+
+$main-color-theme-light: rgba(#000, .9);
+$main-color-theme-dark:  rgba(#fff, .9);
+
+// page background
+$background-color: #fff;
+
+// text colors
+$text-color-theme-light-d: #000;
+$text-color-theme-light:   #222;
+$text-color-theme-light-l: #888;
+
+$text-color-theme-dark-d:  #fff;
+$text-color-theme-dark:    rgba(#fff, .95);
+$text-color-theme-dark-l:  rgba(#fff, .85);
+
+$text-color-d:     $text-color-theme-light-d;
+$text-color:       $text-color-theme-light;
+$text-color-l:     $text-color-theme-light-l;
+
+$text-background-color: rgba(#000, .05);
+
+// header and footer colors
+$header-text-color: $text-color-3;
+$header-background: $main-color-3;
+
+$footer-text-color: $text-color-3;
+$footer-background: $main-color-3;
+
+// border and shadow colors
+$border-color:     mix(#000, $background-color, 20%);
+$border-color-l:   mix(#000, $background-color, 10%);
+$decorate-color:   rgba(#000, .1);
+$mask-color:       rgba(#000, .9);
+$select-color:     rgba($main-color-1, .5);
+
+// function colors
+$green:           #52c41a;
+$blue:            #1890ff;
+$yellow:          #fa8c16;
+$red:             #f5222d;
+$text-color-function: #fff;
+
+// logo colors
+$mail-color:       #0072c5;
+$facebook-color:   #4267b2;
+$twitter-color:    #1da1f2;
+$weibo-color:      #e6162d;
+$google-plus-color:#ea4335;
+$telegram-color:   #32afed;
+$medium-color:     #000;
+$zhihu-color:      #0084ff;
+$douban-color:     #42bd56;
+$linkedin-color:   #1074af;
+$github-color:     #000;
+$npm-color:        #fff;
+
+// highlight colors
+@import "skins/highlight/tomorrow";
diff --git a/_sass/skins/_forest.scss b/_sass/skins/_forest.scss
new file mode 100644
index 0000000..df2c63a
--- /dev/null
+++ b/_sass/skins/_forest.scss
@@ -0,0 +1,74 @@
+///
+// Skin: Forest
+// Author: Tian Qi
+// Email: kitian616@outlook.com
+///
+
+// main colors
+$main-color-1:     #bb6170;
+$text-color-1:     #fff;
+
+$main-color-2:     #f3c584;
+$text-color-2:     #fff;
+
+$main-color-3:     #7cc7bb;
+$text-color-3:     #fff;
+
+$main-color-theme-light: rgba(#000, .9);
+$main-color-theme-dark:  rgba(#fff, .9);
+
+// page background
+$background-color: #f8fcfb;
+
+// text colors
+$text-color-theme-light-d: #325f74;
+$text-color-theme-light:   #3e758f;
+$text-color-theme-light-l: #619dbb;
+
+$text-color-theme-dark-d:  #fff;
+$text-color-theme-dark:    rgba(#fff, .95);
+$text-color-theme-dark-l:  rgba(#fff, .85);
+
+$text-color-d:     $text-color-theme-light-d;
+$text-color:       $text-color-theme-light;
+$text-color-l:     $text-color-theme-light-l;
+
+$text-background-color: rgba(#000, .05);
+
+// header and footer colors
+$header-text-color: $text-color-3;
+$header-background: $main-color-3;
+
+$footer-text-color: $text-color-3;
+$footer-background: $main-color-3;
+
+// border and shadow colors
+$border-color:     #3e758f;
+$border-color-l:   mix(#000, $background-color, 10%);
+$decorate-color:   rgba(#bb6170, .15);
+$mask-color:       rgba(#000, .9);
+$select-color:     rgba($main-color-1, .5);
+
+// function colors
+$green:           #52c41a;
+$blue:            #1890ff;
+$yellow:          #fa8c16;
+$red:             #f5222d;
+$text-color-function: #fff;
+
+// logo colors
+$mail-color:       #0072c5;
+$facebook-color:   #4267b2;
+$twitter-color:    #1da1f2;
+$weibo-color:      #e6162d;
+$google-plus-color:#ea4335;
+$telegram-color:   #32afed;
+$medium-color:     #000;
+$zhihu-color:      #0084ff;
+$douban-color:     #42bd56;
+$linkedin-color:   #1074af;
+$github-color:     #000;
+$npm-color:        #fff;
+
+// highlight colors
+@import "skins/highlight/tomorrow";
diff --git a/_sass/skins/_ocean.scss b/_sass/skins/_ocean.scss
new file mode 100644
index 0000000..c4da252
--- /dev/null
+++ b/_sass/skins/_ocean.scss
@@ -0,0 +1,74 @@
+///
+// Skin: Ocean
+// Author: Tian Qi
+// Email: kitian616@outlook.com
+///
+
+// main colors
+$main-color-1:     #0366d6;
+$text-color-1:     #fff;
+
+$main-color-2:     #a5917f;
+$text-color-2:     #fff;
+
+$main-color-3:     #f1f8ff;
+$text-color-3:     #0366d6;
+
+$main-color-theme-light: rgba(#000, .9);
+$main-color-theme-dark:  rgba(#fff, .9);
+
+// page background
+$background-color: #fff;
+
+// text colors
+$text-color-theme-light-d: rgba(#000, .95);
+$text-color-theme-light:   rgba(#000, .85);
+$text-color-theme-light-l: rgba(#000, .5);
+
+$text-color-theme-dark-d:  #fff;
+$text-color-theme-dark:    rgba(#fff, .95);
+$text-color-theme-dark-l:  rgba(#fff, .85);
+
+$text-color-d:     $text-color-theme-light-d;
+$text-color:       $text-color-theme-light;
+$text-color-l:     $text-color-theme-light-l;
+
+$text-background-color: rgba(#000, .05);
+
+// header and footer colors
+$header-text-color: $text-color-3;
+$header-background: $main-color-3;
+
+$footer-text-color: $text-color-3;
+$footer-background: $main-color-3;
+
+// border and shadow colors
+$border-color:     mix(#000, $background-color, 20%);
+$border-color-l:   mix(#000, $background-color, 10%);
+$decorate-color:   rgba(#000, .1);
+$mask-color:       rgba(#000, .9);
+$select-color:     rgba($main-color-1, .5);
+
+// function colors
+$green:           #52c41a;
+$blue:            #1890ff;
+$yellow:          #fa8c16;
+$red:             #f5222d;
+$text-color-function: #fff;
+
+// logo colors
+$mail-color:       #0072c5;
+$facebook-color:   #4267b2;
+$twitter-color:    #1da1f2;
+$weibo-color:      #e6162d;
+$google-plus-color:#ea4335;
+$telegram-color:   #32afed;
+$medium-color:     #000;
+$zhihu-color:      #0084ff;
+$douban-color:     #42bd56;
+$linkedin-color:   #1074af;
+$github-color:     #000;
+$npm-color:        #fff;
+
+// highlight colors
+@import "skins/highlight/tomorrow-night-blue";
diff --git a/_sass/skins/_orange.scss b/_sass/skins/_orange.scss
new file mode 100644
index 0000000..4ffdbb1
--- /dev/null
+++ b/_sass/skins/_orange.scss
@@ -0,0 +1,74 @@
+///
+// Skin: Orange
+// Author: Tian Qi
+// Email: kitian616@outlook.com
+///
+
+// main colors
+$main-color-1:     #f92651;
+$text-color-1:     #fff;
+
+$main-color-2:     #fdb824;
+$text-color-2:     #fff;
+
+$main-color-3:     #ff8a64;
+$text-color-3:     #fff;
+
+$main-color-theme-light: rgba(#000, .9);
+$main-color-theme-dark:  rgba(#fff, .9);
+
+// page background
+$background-color: #fffdfa;
+
+// text colors
+$text-color-theme-light-d: rgba(#000, .95);
+$text-color-theme-light:   rgba(#000, .85);
+$text-color-theme-light-l: rgba(#000, .5);
+
+$text-color-theme-dark-d:  rgba(#fff, .95);
+$text-color-theme-dark:    rgba(#fff, .85);
+$text-color-theme-dark-l:  rgba(#fff, .65);
+
+$text-color-d:     $text-color-theme-light-d;
+$text-color:       $text-color-theme-light;
+$text-color-l:     $text-color-theme-light-l;
+
+$text-background-color: rgba(#000, .05);
+
+// header and footer colors
+$header-text-color: $text-color-3;
+$header-background: linear-gradient(60deg, #ffa650 0%, #ff7b50 100%);
+
+$footer-text-color: $text-color-3;
+$footer-background: linear-gradient(60deg, #ffa650 0%, #ff7b50 100%);
+
+// border and shadow colors
+$border-color:     mix($main-color-1, $background-color, 50%);
+$border-color-l:   mix(#000, $background-color, 10%);
+$decorate-color:   rgba(#000, .1);
+$mask-color:       rgba(#000, .9);
+$select-color:     rgba($main-color-3, .5);
+
+// function colors
+$green:           #52c41a;
+$blue:            #1890ff;
+$yellow:          #fa8c16;
+$red:             #f5222d;
+$text-color-function: #fff;
+
+// logo colors
+$mail-color:       #0072c5;
+$facebook-color:   #4267b2;
+$twitter-color:    #1da1f2;
+$weibo-color:      #e6162d;
+$google-plus-color:#ea4335;
+$telegram-color:   #32afed;
+$medium-color:     #000;
+$zhihu-color:      #0084ff;
+$douban-color:     #42bd56;
+$linkedin-color:   #1074af;
+$github-color:     #000;
+$npm-color:        #fff;
+
+// highlight colors
+@import "skins/highlight/tomorrow-night-eighties";
diff --git a/_sass/skins/highlight/_default.scss b/_sass/skins/highlight/_default.scss
new file mode 100644
index 0000000..e69de29
diff --git a/_sass/skins/highlight/_tomorrow-night-blue.scss b/_sass/skins/highlight/_tomorrow-night-blue.scss
new file mode 100644
index 0000000..473cbff
--- /dev/null
+++ b/_sass/skins/highlight/_tomorrow-night-blue.scss
@@ -0,0 +1,2 @@
+@import "./tomorrow/night-blue";
+@import "./tomorrow/highlight";
diff --git a/_sass/skins/highlight/_tomorrow-night-bright.scss b/_sass/skins/highlight/_tomorrow-night-bright.scss
new file mode 100644
index 0000000..05af36c
--- /dev/null
+++ b/_sass/skins/highlight/_tomorrow-night-bright.scss
@@ -0,0 +1,2 @@
+@import "./tomorrow/night-bright";
+@import "./tomorrow/highlight";
diff --git a/_sass/skins/highlight/_tomorrow-night-eighties.scss b/_sass/skins/highlight/_tomorrow-night-eighties.scss
new file mode 100644
index 0000000..4144a5e
--- /dev/null
+++ b/_sass/skins/highlight/_tomorrow-night-eighties.scss
@@ -0,0 +1,2 @@
+@import "./tomorrow/night-eighties";
+@import "./tomorrow/highlight";
diff --git a/_sass/skins/highlight/_tomorrow-night.scss b/_sass/skins/highlight/_tomorrow-night.scss
new file mode 100644
index 0000000..2cb5d72
--- /dev/null
+++ b/_sass/skins/highlight/_tomorrow-night.scss
@@ -0,0 +1,2 @@
+@import "./tomorrow/night";
+@import "./tomorrow/highlight";
diff --git a/_sass/skins/highlight/_tomorrow.scss b/_sass/skins/highlight/_tomorrow.scss
new file mode 100644
index 0000000..90aaf3b
--- /dev/null
+++ b/_sass/skins/highlight/_tomorrow.scss
@@ -0,0 +1,2 @@
+@import "./tomorrow/default";
+@import "./tomorrow/highlight";
diff --git a/_sass/skins/highlight/tomorrow/_default.scss b/_sass/skins/highlight/tomorrow/_default.scss
new file mode 100644
index 0000000..c739cf7
--- /dev/null
+++ b/_sass/skins/highlight/tomorrow/_default.scss
@@ -0,0 +1,10 @@
+$highlight-background   : #f7f7f7;
+$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;
diff --git a/_sass/skins/highlight/tomorrow/_highlight.scss b/_sass/skins/highlight/tomorrow/_highlight.scss
new file mode 100644
index 0000000..c026a44
--- /dev/null
+++ b/_sass/skins/highlight/tomorrow/_highlight.scss
@@ -0,0 +1,74 @@
+figure.highlight::before {
+  color: $highlight-comment !important;
+  background-color: $highlight-background !important;
+}
+pre.lineno {
+  color: $highlight-comment !important;
+}
+.highlight > pre {
+  color: $highlight-foreground;
+  background-color: $highlight-background !important;
+  .c   { color: $highlight-comment; } /* Comment */
+  .err { color: $highlight-red; } /* Error */
+  .k   { color: $highlight-purple; } /* Keyword */
+  .l   { color: $highlight-orange; } /* Literal */
+  .n   { color: $highlight-foreground; } /* Name */
+  .o   { color: $highlight-aqua; } /* Operator */
+  .p   { color: $highlight-foreground; } /* Punctuation */
+  .cm  { color: $highlight-comment; } /* Comment.Multiline */
+  .cp  { color: $highlight-comment; } /* Comment.Preproc */
+  .c1  { color: $highlight-comment; } /* Comment.Single */
+  .cs  { color: $highlight-comment; } /* Comment.Special */
+  .gd  { color: $highlight-red; } /* Generic.Deleted */
+  .ge  { font-style: italic; } /* Generic.Emph */
+  .gh  { font-weight: bold; color: $highlight-foreground; } /* Generic.Heading */
+  .gi  { color: $highlight-green; } /* Generic.Inserted */
+  .gp  { font-weight: bold; color: $highlight-comment; } /* Generic.Prompt */
+  .gs  { font-weight: bold; } /* Generic.Strong */
+  .gu  { font-weight: bold; color: $highlight-aqua; } /* Generic.Subheading */
+  .kc  { color: $highlight-purple; } /* Keyword.Constant */
+  .kd  { color: $highlight-purple; } /* Keyword.Declaration */
+  .kn  { color: $highlight-aqua; } /* Keyword.Namespace */
+  .kp  { color: $highlight-purple; } /* Keyword.Pseudo */
+  .kr  { color: $highlight-purple; } /* Keyword.Reserved */
+  .kt  { color: $highlight-yellow; } /* Keyword.Type */
+  .ld  { color: $highlight-green; } /* Literal.Date */
+  .m   { color: $highlight-orange; } /* Literal.Number */
+  .s   { color: $highlight-green; } /* Literal.String */
+  .na  { color: $highlight-blue; } /* Name.Attribute */
+  .nb  { color: $highlight-foreground; } /* Name.Builtin */
+  .nc  { color: $highlight-yellow; } /* Name.Class */
+  .no  { color: $highlight-red; } /* Name.Constant */
+  .nd  { color: $highlight-aqua; } /* Name.Decorator */
+  .ni  { color: $highlight-foreground; } /* Name.Entity */
+  .ne  { color: $highlight-red; } /* Name.Exception */
+  .nf  { color: $highlight-blue; } /* Name.Function */
+  .nl  { color: $highlight-foreground; } /* Name.Label */
+  .nn  { color: $highlight-yellow; } /* Name.Namespace */
+  .nx  { color: $highlight-blue; } /* Name.Other */
+  .py  { color: $highlight-foreground; } /* Name.Property */
+  .nt  { color: $highlight-aqua; } /* Name.Tag */
+  .nv  { color: $highlight-red; } /* Name.Variable */
+  .ow  { color: $highlight-aqua; } /* Operator.Word */
+  .w   { color: $highlight-foreground; } /* Text.Whitespace */
+  .mf  { color: $highlight-orange; } /* Literal.Number.Float */
+  .mh  { color: $highlight-orange; } /* Literal.Number.Hex */
+  .mi  { color: $highlight-orange; } /* Literal.Number.Integer */
+  .mo  { color: $highlight-orange; } /* Literal.Number.Oct */
+  .sb  { color: $highlight-green; } /* Literal.String.Backtick */
+  .sc  { color: $highlight-foreground; } /* Literal.String.Char */
+  .sd  { color: $highlight-comment; } /* Literal.String.Doc */
+  .s2  { color: $highlight-green; } /* Literal.String.Double */
+  .se  { color: $highlight-orange; } /* Literal.String.Escape */
+  .sh  { color: $highlight-green; } /* Literal.String.Heredoc */
+  .si  { color: $highlight-orange; } /* Literal.String.Interpol */
+  .sx  { color: $highlight-green; } /* Literal.String.Other */
+  .sr  { color: $highlight-green; } /* Literal.String.Regex */
+  .s1  { color: $highlight-green; } /* Literal.String.Single */
+  .ss  { color: $highlight-green; } /* Literal.String.Symbol */
+  .bp  { color: $highlight-foreground; } /* Name.Builtin.Pseudo */
+  .vc  { color: $highlight-red; } /* Name.Variable.Class */
+  .vg  { color: $highlight-red; } /* Name.Variable.Global */
+  .vi  { color: $highlight-red; } /* Name.Variable.Instance */
+  .il  { color: $highlight-orange; } /* Literal.Number.Integer.Long */
+}
diff --git a/_sass/skins/highlight/tomorrow/_night-blue.scss b/_sass/skins/highlight/tomorrow/_night-blue.scss
new file mode 100644
index 0000000..74fbf7f
--- /dev/null
+++ b/_sass/skins/highlight/tomorrow/_night-blue.scss
@@ -0,0 +1,10 @@
+$highlight-background   :#002451;
+$highlight-foreground   :#fff;
+$highlight-comment      :#7285b7;
+$highlight-red          :#ff9da4;
+$highlight-orange       :#ffc58f;
+$highlight-yellow       :#ffeead;
+$highlight-green        :#d1f1a9;
+$highlight-aqua         :#9ff;
+$highlight-blue         :#bbdaff;
+$highlight-purple       :#ebbbff;
diff --git a/_sass/skins/highlight/tomorrow/_night-bright.scss b/_sass/skins/highlight/tomorrow/_night-bright.scss
new file mode 100644
index 0000000..39d6cfc
--- /dev/null
+++ b/_sass/skins/highlight/tomorrow/_night-bright.scss
@@ -0,0 +1,10 @@
+$highlight-background   :#000;
+$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;
diff --git a/_sass/skins/highlight/tomorrow/_night-eighties.scss b/_sass/skins/highlight/tomorrow/_night-eighties.scss
new file mode 100644
index 0000000..4bd0ddb
--- /dev/null
+++ b/_sass/skins/highlight/tomorrow/_night-eighties.scss
@@ -0,0 +1,10 @@
+$highlight-background   :#2d2d2d;
+$highlight-foreground   :#ccc;
+$highlight-comment      :#999;
+$highlight-red          :#f2777a;
+$highlight-orange       :#f99157;
+$highlight-yellow       :#fc6;
+$highlight-green        :#9c9;
+$highlight-aqua         :#6cc;
+$highlight-blue         :#69c;
+$highlight-purple       :#c9c;
diff --git a/_sass/skins/highlight/tomorrow/_night.scss b/_sass/skins/highlight/tomorrow/_night.scss
new file mode 100644
index 0000000..98a0294
--- /dev/null
+++ b/_sass/skins/highlight/tomorrow/_night.scss
@@ -0,0 +1,10 @@
+$highlight-background   : #1d1f21;
+$highlight-foreground   : #c5c8c6;
+$highlight-comment      : #969896;
+$highlight-red          : #c66;
+$highlight-orange       : #de935f;
+$highlight-yellow       : #f0c674;
+$highlight-green        : #b5bd68;
+$highlight-aqua         : #8abeb7;
+$highlight-blue         : #81a2be;
+$highlight-purple       : #b294bb;
diff --git a/_site/404.html b/_site/404.html
index 624abfc..c701b84 100644
--- a/_site/404.html
+++ b/_site/404.html
@@ -1,143 +1,842 @@
-<!DOCTYPE html>
-<html>
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Page Not Found - Stop Talking, Start Doing</title>
 
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Page Not Found « Stop Talking, Start Doing</title>
-  <meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+<meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
 ">
+<link rel="canonical" href="http://localhost:4000/404.html"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
 
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//404.html">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
 
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
 
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
     });
-  </script>
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
 </head>
-
-
   <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport cell cell--auto">
 
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">Page Not Found</h1>
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
   </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
 
-  <article class="post-content">
-    <p>Where am I and where should I go?</p>
+              <div class="col-aside d-print-none js-col-aside"></div>
 
-  </article>
-
-  
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
 
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/WebPage"><div class="article__header"><header><h1>Page Not Found</h1></header></div><meta itemprop="headline" content="Page Not Found"><meta itemprop="author" content="Pengzhan Hao"/><div class="js-article-content"><p>Where am I and where should I go?</p>
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
 
+<!-- end custom main bottom snippet -->
 </div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
 </div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
+        </a>
+      </li></ul>
 </div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
 </div>
-        </div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
       </div>
     </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
+  </div>
 </footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
 
-<script src="/js/easybook.js"></script>
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
 
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
   </body>
-
 </html>
+
diff --git a/_site/LICENSE b/_site/LICENSE
deleted file mode 100644
index bfcc8aa..0000000
--- a/_site/LICENSE
+++ /dev/null
@@ -1,8 +0,0 @@
-The MIT License (MIT)
-Copyright (c) 2016 laobubu
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/_site/README.md b/_site/README.md
deleted file mode 100644
index f9fed30..0000000
--- a/_site/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-My Personal Blog
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-写点啥呢？感觉自己真是开坑狂魔。
-准备开三个新坑吧，除去现在还在更新的科研进度，接下来我要开两个新坑介绍自己的两个项目，以及一个摄影的图坑。
diff --git a/_site/about.html b/_site/about.html
new file mode 100644
index 0000000..b05ee7c
--- /dev/null
+++ b/_site/about.html
@@ -0,0 +1,990 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>About - Stop Talking, Start Doing</title>
+
+<meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+">
+<link rel="canonical" href="http://localhost:4000/about.html"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item navigation__item--active"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1>About</h1></header></div><meta itemprop="headline" content="About"><meta itemprop="author" content="Pengzhan Hao"/><div class="js-article-content"><div class="layout--article"><!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
+<div class="article__content" itemprop="articleBody"><h1 id="pengzhan-hao">Pengzhan Hao</h1>
+
+<p><strong>Position:</strong>         Research Assistant in MOSLab<br />
+<strong>Education:</strong>      Doctoral Student of SUNY at Binghamton<br />
+<strong>Email:</strong>              phao3 at binghamton dot edu<br />
+<strong>Address:</strong><br />
+                        MOSLab, H-6 Engineering Building<br />
+                        Binghamton University<br />
+                        4400 Vestal Parkway East<br />
+                        Binghamton, NY 13902</p>
+
+<h2 id="education">Education</h2>
+
+<ul>
+  <li>2017.08 -                 Ph.D. in Computer Science, Binghamton University, NY, USA</li>
+  <li>2015.08 - 2017.05   M.E in Computer Science, Binghamton University, NY, USA</li>
+  <li>2011.08 - 2015.06   B.E in Software Engineering, Beihang University, Beijing, China</li>
+</ul>
+
+<h2 id="experience">Experience</h2>
+
+<ul>
+  <li>2016.10 -    <strong><em>Research Assistant</em></strong> @ Mobile and Operating System Lab, Binghamton University
+    <ul>
+      <li>Advised by Professor <a href="https://buzhangy.github.io/">Yifan Zhang</a></li>
+      <li>Edge-based distributed deep learning
+        <ul>
+          <li>Implemented a system for time-sensitive, edge-based distributed neural network training scenarios with state-of-the-art performance.</li>
+          <li>Applied empirical experiments to show potential opportunities in Edge-based/Mobile-based distributed neural network training.</li>
+          <li>Investigated heterogeneous-aware training tasks scheduling problem.</li>
+        </ul>
+      </li>
+      <li>Edge Computing
+        <ul>
+          <li>Envision edge computing’s work-flow in end device performance(latency, traffic) improving.</li>
+          <li>Applied empirical experiments on different edge computing work-flow and propose/implement related solutions.</li>
+          <li>Design and implement an edge-based multi-tier system for decreasing bandwidth usage from endpoint mobile device.</li>
+        </ul>
+      </li>
+    </ul>
+  </li>
+  <li>2013.10 - 2014.09   <strong><em>Research Intern</em></strong> @ Advanced computer application technology engineering Research Center, Ministry of Education, China
+    <ul>
+      <li>Analyzed real-time routing problem and reliable algorithm design</li>
+      <li>Led and developed a routing system mostly backend server program</li>
+      <li>Participated in vehicle internet research</li>
+      <li>Supervised by Juhua Pu, Zhang Xiong, Related project: Urban Computing</li>
+    </ul>
+  </li>
+  <li>2013.10 - 2014.01   <strong><em>Research Intern</em></strong> @ Institute of Software, Chinese Academy of Sciences, China
+    <ul>
+      <li>Analyzed mobile OS kernel and Localized portion with C language</li>
+      <li>Supervised by Cangzhou Yuan</li>
+    </ul>
+  </li>
+</ul>
+
+<h2 id="research-projects">Research projects</h2>
+
+<ul>
+  <li><a href="https://github.com/CoderSherlock/dlib-exper">EDDL: Edge-based distributed deep learning</a></li>
+  <li><a href="https://github.com/bumoslab/EdgeCourier">Edge Courier: Edge-involved Cloud file synchronization service</a>      <em>Original repository(private)</em></li>
+  <li>Real time routing planner      <em>Original repository(private)</em>
+    <ul>
+      <li><a href="https://github.com/CoderSherlock/Project-OSCF.git">Map preprocessing driver</a></li>
+    </ul>
+  </li>
+</ul>
+
+<h2 id="publications">Publications</h2>
+
+<ul>
+  <li>
+    <p><strong>EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.</strong>
+<strong>Pengzhan Hao</strong>, and Yifan Zhang
+The Sixth ACM/IEEE Symposium on Edge Computing (<strong>ACM/IEEE SEC</strong>)<br />
+San Jose, CA, USA, 2021.</p>
+  </li>
+  <li>
+    <p><strong><a href="/static/2021-10/eta-infocom18.pdf">A Case for Web Service Bandwidth Reduction on Mobile Devices with Edge-hosted Personal Services</a></strong>
+Yongshu Bai, <strong>Pengzhan Hao</strong>, and Yifan Zhang
+The 37th IEEE International Conference on Computer Communications (<strong>IEEE INFOCOM</strong>)<br />
+Honolulu, HI, USA, 2018.</p>
+  </li>
+  <li>
+    <p><strong><a href="/static/2018-02/a7-hao.pdf">EdgeCourier: An Edge-hosted Personal Service for Low-bandwidth Document Synchronization in Mobile Cloud Storage Services</a></strong> <strong>[<a href="/">slide</a>]</strong><br />
+<strong>Pengzhan Hao</strong>, Yongshu Bai, Xin Zhang, and Yifan Zhang<br />
+The 2nd ACM/IEEE Symposium on Edge Computing (<strong>ACM/IEEE SEC</strong>)<br />
+San Jose, CA, USA, 2017.</p>
+  </li>
+  <li>
+    <p><strong><a href="/static/2017-07/p169-zhang.pdf">Poster: Securing Device Inputs for Smartphones Using Hypervisor Based Approach</a></strong><br />
+Xin Zhang, Yongshu Bai, <strong>Pengzhan Hao</strong>, and Yifan Zhang<br />
+The 15th ACM International Conference on Mobile Systems, Applications, and Services (<strong>ACM MobiSys</strong>)<br />
+Niagara Falls, NY, USA, 2017.</p>
+  </li>
+  <li>
+    <p><strong><a href="/static/2017-07/p163-hao.pdf">Poster: EPS - Edge-hosted Personal Services for Mobile Users</a> [<a href="/static/2017-07/eps_poster.pdf">poster</a>]</strong><br />
+<strong>Pengzhan Hao</strong>, Yongshu Bai, Xin Zhang, and Yifan Zhang<br />
+The 15th ACM International Conference on Mobile Systems, Applications, and Services (<strong>ACM MobiSys</strong>)<br />
+Niagara Falls, NY, USA, 2017.</p>
+  </li>
+</ul>
+
+<h2 id="teaching">Teaching</h2>
+
+<ul>
+  <li>Operating system (Graduate level)</li>
+  <li>Operating system (Undergraduate level)</li>
+  <li>Introduction to distributed system (Graduate level)</li>
+</ul>
+
+<h2 id="fun">Fun</h2>
+</div><div class="d-print-none"><footer class="article__footer"><!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
+</footer>
+</div>
+
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
+</script>
+</div></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/about/index.html b/_site/about/index.html
deleted file mode 100644
index 50c0760..0000000
--- a/_site/about/index.html
+++ /dev/null
@@ -1,255 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>About « Stop Talking, Start Doing</title>
-  <meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
-">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//about/">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">About</h1>
-  </header>
-
-  <article class="post-content">
-    <h1 id="pengzhan-hao">Pengzhan Hao</h1>
-
-<p><strong>Position:</strong>         Research Assistant in MOSLab<br />
-<strong>Education:</strong>      Doctoral Student of SUNY at Binghamton<br />
-<strong>Email:</strong>              phao3 at binghamton dot edu<br />
-<strong>Address:</strong><br />
-                        MOSLab, H-6 Engineering Building<br />
-                        Binghamton University<br />
-                        4400 Vestal Parkway East<br />
-                        Binghamton, NY 13902</p>
-
-<h2 id="education">Education</h2>
-
-<ul>
-  <li>2017.08 -                 Ph.D. in Computer Science, Binghamton University, NY, USA</li>
-  <li>2015.08 - 2017.05   M.E in Computer Science, Binghamton University, NY, USA</li>
-  <li>2011.08 - 2015.06   B.E in Software Engineering, Beihang University, Beijing, China</li>
-</ul>
-
-<h2 id="experience">Experience</h2>
-
-<ul>
-  <li>2016.10 -    <strong><em>Research Assistant</em></strong> @ Mobile and Operating System Lab, Binghamton University
-    <ul>
-      <li>Advised by Professor <a href="https://buzhangy.github.io/">Yifan Zhang</a></li>
-      <li>Edge-based distributed deep learning
-        <ul>
-          <li>Implemented a system for time-sensitive, edge-based distributed neural network training scenarios with state-of-the-art performance.</li>
-          <li>Applied empirical experiments to show potential opportunities in Edge-based/Mobile-based distributed neural network training.</li>
-          <li>Investigated heterogeneous-aware training tasks scheduling problem.</li>
-        </ul>
-      </li>
-      <li>Edge Computing
-        <ul>
-          <li>Envision edge computing’s work-flow in end device performance(latency, traffic) improving.</li>
-          <li>Applied empirical experiments on different edge computing work-flow and propose/implement related solutions.</li>
-          <li>Design and implement an edge-based multi-tier system for decreasing bandwidth usage from endpoint mobile device.</li>
-        </ul>
-      </li>
-    </ul>
-  </li>
-  <li>2013.10 - 2014.09   <strong><em>Research Intern</em></strong> @ Advanced computer application technology engineering Research Center, Ministry of Education, China
-    <ul>
-      <li>Analyzed real-time routing problem and reliable algorithm design</li>
-      <li>Led and developed a routing system mostly backend server program</li>
-      <li>Participated in vehicle internet research</li>
-      <li>Supervised by Juhua Pu, Zhang Xiong, Related project: Urban Computing</li>
-    </ul>
-  </li>
-  <li>2013.10 - 2014.01   <strong><em>Research Intern</em></strong> @ Institute of Software, Chinese Academy of Sciences, China
-    <ul>
-      <li>Analyzed mobile OS kernel and Localized portion with C language</li>
-      <li>Supervised by Cangzhou Yuan</li>
-    </ul>
-  </li>
-</ul>
-
-<h2 id="research-projects">Research projects</h2>
-
-<ul>
-  <li><a href="https://github.com/CoderSherlock/dlib-exper">EDDL: Edge-based distributed deep learning</a></li>
-  <li><a href="https://github.com/bumoslab/EdgeCourier">Edge Courier: Edge-involved Cloud file synchronization service</a>      <em>Original repository(private)</em></li>
-  <li>Real time routing planner      <em>Original repository(private)</em>
-    <ul>
-      <li><a href="https://github.com/CoderSherlock/Project-OSCF.git">Map preprocessing driver</a></li>
-    </ul>
-  </li>
-</ul>
-
-<h2 id="publications">Publications</h2>
-
-<ul>
-  <li>
-    <p><strong>EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.</strong>
-<strong>Pengzhan Hao</strong>, and Yifan Zhang
-The Sixth ACM/IEEE Symposium on Edge Computing (<strong>ACM/IEEE SEC</strong>)<br />
-San Jose, CA, USA, 2021.</p>
-  </li>
-  <li>
-    <p><strong><a href="/static/2021-10/eta-infocom18.pdf">A Case for Web Service Bandwidth Reduction on Mobile Devices with Edge-hosted Personal Services</a></strong>
-Yongshu Bai, <strong>Pengzhan Hao</strong>, and Yifan Zhang
-The 37th IEEE International Conference on Computer Communications (<strong>IEEE INFOCOM</strong>)<br />
-Honolulu, HI, USA, 2018.</p>
-  </li>
-  <li>
-    <p><strong><a href="/static/2018-02/a7-hao.pdf">EdgeCourier: An Edge-hosted Personal Service for Low-bandwidth Document Synchronization in Mobile Cloud Storage Services</a></strong> <strong>[<a href="/">slide</a>]</strong><br />
-<strong>Pengzhan Hao</strong>, Yongshu Bai, Xin Zhang, and Yifan Zhang<br />
-The 2nd ACM/IEEE Symposium on Edge Computing (<strong>ACM/IEEE SEC</strong>)<br />
-San Jose, CA, USA, 2017.</p>
-  </li>
-  <li>
-    <p><strong><a href="/static/2017-07/p169-zhang.pdf">Poster: Securing Device Inputs for Smartphones Using Hypervisor Based Approach</a></strong><br />
-Xin Zhang, Yongshu Bai, <strong>Pengzhan Hao</strong>, and Yifan Zhang<br />
-The 15th ACM International Conference on Mobile Systems, Applications, and Services (<strong>ACM MobiSys</strong>)<br />
-Niagara Falls, NY, USA, 2017.</p>
-  </li>
-  <li>
-    <p><strong><a href="/static/2017-07/p163-hao.pdf">Poster: EPS - Edge-hosted Personal Services for Mobile Users</a> [<a href="/static/2017-07/eps_poster.pdf">poster</a>]</strong><br />
-<strong>Pengzhan Hao</strong>, Yongshu Bai, Xin Zhang, and Yifan Zhang<br />
-The 15th ACM International Conference on Mobile Systems, Applications, and Services (<strong>ACM MobiSys</strong>)<br />
-Niagara Falls, NY, USA, 2017.</p>
-  </li>
-</ul>
-
-<h2 id="teaching">Teaching</h2>
-
-<ul>
-  <li>Operating system (Graduate level)</li>
-  <li>Operating system (Undergraduate level)</li>
-  <li>Introduction to distributed system (Graduate level)</li>
-</ul>
-
-<h2 id="fun">Fun</h2>
-
-  </article>
-
-  
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/archive.html b/_site/archive.html
new file mode 100644
index 0000000..3a51fc0
--- /dev/null
+++ b/_site/archive.html
@@ -0,0 +1,1015 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Archive - Stop Talking, Start Doing</title>
+
+<meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+">
+<link rel="canonical" href="http://localhost:4000/archive"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/WebPage"><div class="article__header"><header><h1>Archive</h1></header></div><meta itemprop="headline" content="Archive"><meta itemprop="author" content="Pengzhan Hao"/><div class="js-article-content"><div class="layout--archive js-all"><div class="site-tags js-tags">
+  <ul class="menu">
+    <li>
+      <button type="button" class="button button--secondary button--pill tag-button tag-button--all" data-encode="">
+        Show All<div class="tag-button__count">6</div>
+      </button>
+    </li><li><button type="button" class="button button--pill tag-button tag-button-1" data-encode="Nonsense">
+          <span>Nonsense</span><div class="tag-button__count">1</div>
+        </button>
+      </li><li><button type="button" class="button button--pill tag-button tag-button-2" data-encode="Research">
+          <span>Research</span><div class="tag-button__count">2</div>
+        </button>
+      </li><li><button type="button" class="button button--pill tag-button tag-button-1" data-encode="visualization">
+          <span>visualization</span><div class="tag-button__count">1</div>
+        </button>
+      </li><li><button type="button" class="button button--pill tag-button tag-button-1" data-encode="xv6">
+          <span>xv6</span><div class="tag-button__count">1</div>
+        </button>
+      </li></ul>
+</div>
+<div class="js-result layout--archive__result d-none"><div class="article-list items"><section><h2 class="article-list__group-header">2021</h2><ul class="items"><li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="Research">
+        <div class="item__content"><span class="item__meta">Oct 13</span><a itemprop="headline" class="item__header" href="/posts/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></div>
+      </li></ul></section><section><h2 class="article-list__group-header">2020</h2><ul class="items"><li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="visualization">
+        <div class="item__content"><span class="item__meta">Sep 15</span><a itemprop="headline" class="item__header" href="/posts/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></div>
+      </li></ul></section><section><h2 class="article-list__group-header">2017</h2><ul class="items"><li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="xv6">
+        <div class="item__content"><span class="item__meta">Jul 28</span><a itemprop="headline" class="item__header" href="/posts/intro-xv6">Xv6 introduction</a></div>
+      </li></ul></section><section><h2 class="article-list__group-header">2016</h2><ul class="items"><li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="Research">
+        <div class="item__content"><span class="item__meta">Oct 28</span><a itemprop="headline" class="item__header" href="/posts/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></div>
+      </li><li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="">
+        <div class="item__content"><span class="item__meta">Oct 27</span><a itemprop="headline" class="item__header" href="/posts/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></div>
+      </li><li class="item" itemscope itemtype="http://schema.org/BlogPosting" data-tags="Nonsense">
+        <div class="item__content"><span class="item__meta">Oct 26</span><a itemprop="headline" class="item__header" href="/posts/welcome-to-my-blog">Stop Talking is the worst title of one blog</a></div>
+      </li></div>
+</div>
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  function queryString() {
+    // This function is anonymous, is executed immediately and
+    // the return value is assigned to QueryString!
+    var i = 0, queryObj = {}, pair;
+    var queryStr = window.location.search.substring(1);
+    var queryArr = queryStr.split('&');
+    for (i = 0; i < queryArr.length; i++) {
+      pair = queryArr[i].split('=');
+      // If first entry with this name
+      if (typeof queryObj[pair[0]] === 'undefined') {
+        queryObj[pair[0]] = pair[1];
+        // If second entry with this name
+      } else if (typeof queryObj[pair[0]] === 'string') {
+        queryObj[pair[0]] = [queryObj[pair[0]], pair[1]];
+        // If third or later entry with this name
+      } else {
+        queryObj[pair[0]].push(pair[1]);
+      }
+    }
+    return queryObj;
+  }
+
+  var setUrlQuery = (function() {
+    var baseUrl =  window.location.href.split('?')[0];
+    return function(query) {
+      if (typeof query === 'string') {
+        window.history.replaceState(null, '', baseUrl + query);
+      } else {
+        window.history.replaceState(null, '', baseUrl);
+      }
+    };
+  })();
+
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $tags = $('.js-tags');
+    var $articleTags = $tags.find('button');
+    var $tagShowAll = $tags.find('.tag-button--all');
+    var $result = $('.js-result');
+    var $sections = $result.find('section');
+    var sectionArticles = [];
+    var $lastFocusButton = null;
+    var sectionTopArticleIndex = [];
+    var hasInit = false;
+
+    $sections.each(function() {
+      sectionArticles.push($(this).find('.item'));
+    });
+
+    function init() {
+      var i, index = 0;
+      for (i = 0; i < $sections.length; i++) {
+        sectionTopArticleIndex.push(index);
+        index += $sections.eq(i).find('.item').length;
+      }
+      sectionTopArticleIndex.push(index);
+    }
+
+    function searchButtonsByTag(_tag/*raw tag*/) {
+      if (!_tag) {
+        return $tagShowAll;
+      }
+      var _buttons = $articleTags.filter('[data-encode="' + _tag + '"]');
+      if (_buttons.length === 0) {
+        return $tagShowAll;
+      }
+      return _buttons;
+    }
+    function buttonFocus(target) {
+      if (target) {
+        target.addClass('focus');
+        $lastFocusButton && !$lastFocusButton.is(target) && $lastFocusButton.removeClass('focus');
+        $lastFocusButton = target;
+      }
+    }
+
+    function tagSelect (tag/*raw tag*/, target) {
+      var result = {}, $articles;
+      var i, j, k, _tag;
+
+      for (i = 0; i < sectionArticles.length; i++) {
+        $articles = sectionArticles[i];
+        for (j = 0; j < $articles.length; j++) {
+          if (tag === '' || tag === undefined) {
+            result[i] || (result[i] = {});
+            result[i][j] = true;
+          } else {
+            var tags = $articles.eq(j).data('tags').split(',');
+            for (k = 0; k < tags.length; k++) {
+              if (tags[k] === tag) {
+                result[i] || (result[i] = {});
+                result[i][j] = true; break;
+              }
+            }
+          }
+        }
+      }
+
+      for (i = 0; i < sectionArticles.length; i++) {
+        result[i] && $sections.eq(i).removeClass('d-none');
+        result[i] || $sections.eq(i).addClass('d-none');
+        for (j = 0; j < sectionArticles[i].length; j++) {
+          if (result[i] && result[i][j]) {
+            sectionArticles[i].eq(j).removeClass('d-none');
+          } else {
+            sectionArticles[i].eq(j).addClass('d-none');
+          }
+        }
+      }
+
+      hasInit || ($result.removeClass('d-none'), hasInit = true);
+
+
+      if (target) {
+        buttonFocus(target);
+        _tag = target.attr('data-encode');
+        if (_tag === '' || typeof _tag !== 'string') {
+          setUrlQuery();
+        } else {
+          setUrlQuery('?tag=' + _tag);
+        }
+      } else {
+        buttonFocus(searchButtonsByTag(tag));
+      }
+    }
+
+    var query = queryString(), _tag = query.tag;
+    init(); tagSelect(_tag);
+    $tags.on('click', 'button', function() {
+      tagSelect($(this).data('encode'), $(this));
+    });
+
+  });
+})();
+</script>
+
+
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/archivers/charles-is-not-a-good-tool.html b/_site/archivers/charles-is-not-a-good-tool.html
deleted file mode 100644
index bf8ad92..0000000
--- a/_site/archivers/charles-is-not-a-good-tool.html
+++ /dev/null
@@ -1,185 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Using charles proxy to monitor mobile SSL traffics « Stop Talking, Start Doing</title>
-  <meta name="description" content="In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL t...">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//archivers/charles-is-not-a-good-tool">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">Using charles proxy to monitor mobile SSL traffics</h1>
-    <p class="post-meta">Oct 27, 2016</p>
-  </header>
-
-  <article class="post-content">
-    <p>In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.<br />
-My current solution is using AP to forward all SSL traffic to a proxy, <a href="https://www.charlesproxy.com/">charles proxy</a> is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.</p>
-
-<h3 id="preparations">Preparations</h3>
-<ul>
-  <li>Monitor device situation: Linux Machine with wireless adapter</li>
-  <li>Download the newest version(4.0.1) of charles</li>
-  <li>Target android devices with root privilege</li>
-</ul>
-
-<h3 id="install-charles-and-configuration">Install Charles and Configuration</h3>
-
-<ul>
-  <li>You have to install charles first. After downloading the charles proxy, you have to unzip it and configure some basic settings.</li>
-</ul>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># open charles first</span>
-./bin/charles  
-</code></pre></div></div>
-<ul>
-  <li>Save charles’ private key and public key</li>
-</ul>
-
-<p>In Help -&gt; SSL Proxying -&gt; Export Charles Root Certificate and Private Key, enter a password and save the public and private key in *.p12 format.<br />
-You also need to save charles Root Certificate, it also contains in the same menu. For convience, save it as *.pem format.</p>
-
-<ul>
-  <li>Set Proxy and SSL Proxy</li>
-</ul>
-
-  </article>
-  
-  
-
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = 'codersherlockblog'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-
-
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/archivers/eddl-how-do-we-train-on-limited-edge-devices.html b/_site/archivers/eddl-how-do-we-train-on-limited-edge-devices.html
deleted file mode 100644
index f872f24..0000000
--- a/_site/archivers/eddl-how-do-we-train-on-limited-edge-devices.html
+++ /dev/null
@@ -1,233 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>EDDL: How do we train neural networks on limited edge devices - PART 1 « Stop Talking, Start Doing</title>
-  <meta name="description" content="This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Compu...">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//archivers/eddl-how-do-we-train-on-limited-edge-devices">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">EDDL: How do we train neural networks on limited edge devices - PART 1</h1>
-    <p class="post-meta">Oct 13, 2021</p>
-  </header>
-
-  <article class="post-content">
-    <p>This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
-As the first part of the introductions, I focus only on the motivation and summary of our works.
-More details in design and implementation can be found in late posts.</p>
-
-<p><img src="/static/2021-10/edgelearn-1.png" height="250" /></p>
-
-<h2 id="why-do-we-need-training-on-edge">Why do we need training on edge?</h2>
-
-<p>Cloud is not trustworthy anymore. More and more facts supports that breach on cloud happens frequently than before.
-Nowadays, with more generated personal sensitive data has been uploaded to the cloud center, tech company know better to someones than user themselves.</p>
-
-<p>Researchers, no matter in industry on academia, are working in a way that still learning from users’ data but also keeping raw sensitive data under users’ control.
-Many publications already showed feasibility of only sharing after-trained model instead of raw data.
-One recent popular study on this is google’s <a href="https://ai.googleblog.com/2017/04/federated-learning-collaborative.html">federated learning</a>.</p>
-
-<p>During investigated this problem, we found that let end user train their own data is safe, but sacrifice efficiency.
-Since one end device has limited resources, training time and power consumption can be disappointing.
-We believe there must have a leverage between privacy and efficiency in some target scenarios.</p>
-
-<p>Fortunately, we observed that users who belongs to the same campus, plant, firm and community always share similar interests.
-Therefore, these co-located users have similar demands in using AI-involved routines.
-Also, co-located users are easily targeted by same type of threats, such as ransomware to financial practitioners.</p>
-
-<p>Think about this, sending features of a new malware app to cloud services in order to train a neural networks used by antivirus program.
-This process may takes long time and small amount of samples may not be recognized by the global neural networks model.
-With a customized local model trained and deployed on the edge can successfully counter the problem.
-With edge training as a supplement of cloud training can achieve better response time and let the whole system more flexible.</p>
-
-<h2 id="why-training-on-edge-is-hard">Why training on edge is hard?</h2>
-
-<p>Since all co-located users’ device can be used for an edge training, issues and challenges occur as deploying this distributed system.</p>
-
-<p>The first challenge is <strong>struggling workers</strong>.
-Training devices are heterogeneity, from limited IoT camera to high-end media center with powerful GPU.
-They are not designed to do machine learnings.
-So, a good edge-based distributed learning framework must can handle variety speeds in training tasks.</p>
-
-<p>The second challenge is how to <strong>scale up</strong> clusters.
-In a campus, thousands and more devices may contribute computing resources to the same training tasks.
-However, these devices may located in far not matter in physical or in network topology. 
-How can we well use them well, without struggled with endless transmission time remains a challenge.</p>
-
-<p>The third issue is frequently <strong>joining and exiting</strong> of devices.
-We can’t rely on each devices to faithfully working on training tasks rather than their original workload.
-Smartly schedule work balance and handle join/exit issues also need under consideration.</p>
-
-<h2 id="our-proposal">Our proposal</h2>
-
-<ul>
-  <li>
-    <p>Dynamic training data distribution and runtime profiler</p>
-
-    <p>We design a dynamic training data distribution mechanism that helps to both the first and the third challenges.
-  Preprocessing data can be transmitted without leakage of raw sensitive information. 
-  This can helps with struggling workers who can train small batches in order to upload parameters with a similar training time.
-  Also, for extremely slow devices, join and exit of devices cases, dynamic data distribution and profiler can helps with keep global training parameters from polluted and staleness.</p>
-
-    <p>To counter heterogeneity’s, more approaches were applied in our later research.
-  More details were introduced to runtime profiler in the later works.</p>
-  </li>
-  <li>
-    <p>Asynchronous and synchronous aggregation enabled</p>
-
-    <p>In our findings, asynchronous and synchronous parameter update have their pros and cons. 
-  Keeping sync all the time leads struggling worker issue unsolvable.
-  However, async’s harm to accuracy and convergence time also need attentions.
-  To carefully chose between these two update policies at the runtime is what we proposed to make use of their own advantages.</p>
-  </li>
-  <li>
-    <p>Leader role splitting</p>
-
-    <p>The idea is to let worker devices with higher bandwidth taking leader role during training.
-  Parameter updating does not require much computation but only need bandwidth. 
-  Devices with sufficient bandwidth can also work as virtual leader devices.
-  This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.</p>
-  </li>
-</ul>
-
-  </article>
-  
-  
-
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = 'codersherlockblog'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-
-
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/archivers/generate-word-cloud-with-chinese-fenci.html b/_site/archivers/generate-word-cloud-with-chinese-fenci.html
deleted file mode 100644
index 9456c02..0000000
--- a/_site/archivers/generate-word-cloud-with-chinese-fenci.html
+++ /dev/null
@@ -1,316 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries « Stop Talking, Start Doing</title>
-  <meta name="description" content="Let’s generate a word cloud like this. Don’t understand the language is not a big deal.If your written language is based on latin alphabet(or other language ...">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//archivers/generate-word-cloud-with-chinese-fenci">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</h1>
-    <p class="post-meta">Sep 15, 2020</p>
-  </header>
-
-  <article class="post-content">
-    <p>Let’s generate a word cloud like this. 
-Don’t understand the language is not a big deal.
-If your written language is based on latin alphabet(or other language has space between words), skip tokenization.</p>
-
-<p><img src="/static/2020-09/2020-06-28.png" height="250" /></p>
-
-<h2 id="background">Background</h2>
-
-<p>Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used <a href="https://tt-rss.org/">TinyTinyRSS</a>, or as ttrss, a popular RSS client which friendly to docker. Thanks to developer <a href="https://ttrss.henry.wang/#about">HenryQW</a>, a well-written Nginx-based docker configuration is already available in docker hub. With more feeds were added, I found some feeds does not need to be checked everyday. Thus I was thinking to create a script to automatically list all keywords appears in a last period and generate a heat map kind figure of it.</p>
-
-<p>Before you go further, I’ll tell you all my settings to give readers a general overview.</p>
-
-<p>My first step is to read all text-based information from TTRSS’s PostgreSQL database. With information, I used a Chinese-NLP library, <a href="https://github.com/fxsjy/jieba">jieba</a>, to extract all keyword with their occurrences frequency. By using <a href="https://github.com/amueller/word_cloud">WordCloud</a>, a python library, word cloud figure is generated and present. More details will be discussed in later sections.</p>
-
-<h2 id="get-rss-feeds-text">Get RSS feeds’ text</h2>
-
-<p>My first thought is generating a keyword heat map for economy news of a last week. Since this blog post are more skewed to Chinese tokenization and draw the word cloud figure. I’ll leave my code here just in case. The SQL connector I used is <a href="https://pypi.org/project/psycopg2/">psycopg2</a>, an easy-use PostgreSQL library.</p>
-
-<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-	<span class="bp">self</span><span class="p">.</span><span class="n">dbe</span> <span class="o">=</span> <span class="n">psycopg2</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span>
-    	<span class="n">host</span><span class="o">=</span><span class="n">DB_HOST</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="n">DB_PORT</span><span class="p">,</span> <span class="n">database</span><span class="o">=</span><span class="n">DB_NAME</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">DB_USER</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="n">DB_PASS</span><span class="p">)</span>
-
-<span class="k">def</span> <span class="nf">get_1w_of_feed_byid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
-	<span class="n">cur</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">dbe</span><span class="p">.</span><span class="n">cursor</span><span class="p">()</span>
-    <span class="n">cur</span><span class="p">.</span><span class="n">execute</span><span class="p">(</span><span class="s">'SELECT content FROM public.ttrss_entries </span><span class="se">\
-</span><span class="s">    	where date_updated &gt; now() - interval </span><span class="se">\'</span><span class="s">1 week</span><span class="se">\'</span><span class="s"> AND id in ( </span><span class="se">\
-</span><span class="s">        select int_id from DB_TABLE_NAME </span><span class="se">\
-</span><span class="s">        where feed_id='</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span> <span class="o">+</span> <span class="s">' </span><span class="se">\
-</span><span class="s">        ) </span><span class="se">\
-</span><span class="s">        ORDER BY id ASC '</span>
-        <span class="p">)</span>
-	<span class="n">rows</span> <span class="o">=</span> <span class="n">cur</span><span class="p">.</span><span class="n">fetchall</span><span class="p">()</span>
-	<span class="k">return</span> <span class="n">rows</span>
-</code></pre></div></div>
-
-<p>Most arguments are intuitive and easy to understand. The only exception is argument of function <em>get_1w_of_feed_byid</em>. This <strong>id</strong> is the feed index of my subscriptions.</p>
-
-<h2 id="tokenize-with-frequency">Tokenize with frequency</h2>
-
-<p>Two popular tokenization library were used, and I chose <a href="https://github.com/fxsjy/jieba">jieba</a> after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks.</p>
-
-<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">remove_biaodian</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
-    <span class="n">punct</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="s">u''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐､﹒
-                ﹔﹕﹖﹗﹚﹜﹞！），．：；？｜｝︴︶︸︺︼︾﹀﹂﹄﹏､～￠
-                々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖（［｛￡￥〝︵︷︹︻
-                ︽︿﹁﹃﹙﹛﹝（｛“‘-—_…'''</span><span class="p">)</span>
-    <span class="n">ret</span> <span class="o">=</span> <span class="s">""</span>
-    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
-        <span class="k">if</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">punct</span><span class="p">:</span>
-            <span class="n">ret</span> <span class="o">+=</span> <span class="s">''</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">ret</span> <span class="o">+=</span> <span class="n">x</span>
-    <span class="k">return</span> <span class="n">ret</span>
-</code></pre></div></div>
-
-<p>After we have an all characters string, we can call jieba. By using the function <em>jieba.posseg.cut</em> with or without paddle, we can have a word list and their “part of speech”.  As you can see in the following code, I also did two more works.</p>
-
-<p>First, in the if statement, I only kept all nouns with some categories. Category abbreviation such as “nr” and “ns” represent different “part of speech”, I attached with categories I used in the following table. For more details you can find in this <a href="https://github.com/fxsjy/jieba">link</a>.</p>
-
-<p>The second work is only keeping words with length longer than 2 characters. In Chinese, there’s no space between words such as Latin writing systems. Since then, some single-character-words such as conjunction words are easy to be misrecognized as specialty-noun.  And this misrecognition will cause more single-character being regarded as specialty-noun. I am not able to improve NLP method, so I used a easy way to fix this by removing any words less than 2 characters.</p>
-
-<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">jieba.posseg</span> <span class="k">as</span> <span class="n">pseg</span>
-
-<span class="k">def</span> <span class="nf">get_noun_jieba</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
-	<span class="n">content</span> <span class="o">=</span> <span class="n">remove_biaodian</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
-	<span class="n">words</span> <span class="o">=</span> <span class="n">pseg</span><span class="p">.</span><span class="n">cut</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>	<span class="c1"># Invoking jieba.posseg.cut function 
-</span>
-	<span class="n">ret</span> <span class="o">=</span> <span class="p">[]</span>
-	<span class="k">for</span> <span class="n">word</span><span class="p">,</span> <span class="n">flag</span> <span class="ow">in</span> <span class="n">words</span><span class="p">:</span>
-		<span class="c1"># print(word, flag)
-</span>		<span class="k">if</span> <span class="n">flag</span> <span class="ow">in</span> <span class="p">[</span><span class="s">'nr'</span><span class="p">,</span> <span class="s">'ns'</span><span class="p">,</span> <span class="s">'nt'</span><span class="p">,</span> <span class="s">'nw'</span><span class="p">,</span> <span class="s">'nz'</span><span class="p">,</span> <span class="s">'PER'</span><span class="p">,</span> <span class="s">'ORG'</span><span class="p">,</span> <span class="s">'x'</span><span class="p">]:</span>   <span class="c1"># LOC
-</span>			<span class="n">ret</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
-	<span class="k">return</span> <span class="p">[</span><span class="n">remove_biaodian</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">ret</span> <span class="k">if</span> <span class="n">i</span><span class="p">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">!=</span> <span class="s">""</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">remove_biaodian</span><span class="p">(</span><span class="n">i</span><span class="p">.</span><span class="n">strip</span><span class="p">()))</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">]</span>
-</code></pre></div></div>
-
-<ul>
-  <li>Word category names and abbreviations</li>
-</ul>
-
-<table>
-  <thead>
-    <tr>
-      <th>Abbreviation</th>
-      <th>Category name/ Part of speech</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>nr</td>
-      <td>People name noun</td>
-    </tr>
-    <tr>
-      <td>ns</td>
-      <td>Location name noun</td>
-    </tr>
-    <tr>
-      <td>nt</td>
-      <td>Organization name noun</td>
-    </tr>
-    <tr>
-      <td>nw</td>
-      <td>Arts work noun</td>
-    </tr>
-    <tr>
-      <td>nz</td>
-      <td>Other noun</td>
-    </tr>
-    <tr>
-      <td>PER</td>
-      <td>People name noun</td>
-    </tr>
-    <tr>
-      <td>ORG</td>
-      <td>Location name noun</td>
-    </tr>
-    <tr>
-      <td>x</td>
-      <td>Non-morpheme word</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>With all words extracted, we can easily calculate their frequencies.  After this, we can using the following line of code to print a sorted result to verify correctness.</p>
-
-<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">noun</span> <span class="o">=</span> <span class="n">seg</span><span class="p">.</span><span class="n">get_noun_jieba</span><span class="p">(</span><span class="n">test_content</span><span class="p">)</span>
-<span class="c1"># ... Calculate frequency of above word list ...
-</span><span class="k">print</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">a_dict</span><span class="p">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
-</code></pre></div></div>
-
-<h2 id="draw-word-cloud">Draw word cloud</h2>
-
-<p>With a keyword and frequency dictionary(data structure), we can just call built-in functions from wordcloud library to generate the figure.</p>
-
-<p>First we need to initialize an instance of wordcloud class. As you can see in my code, I set it with 6 parameters. Width and Height of the canvas, maximum amount of words used to generate the figure, the font of words, background color and margin between any two words.</p>
-
-<p>After having the instance, we call function <em>generate_from_frequencies</em> and pass keyword dictionary to it. The return value of this function is an bitmap image, which we can use <a href="https://matplotlib.org/">matplotlib</a> to plot it to your screen.</p>
-
-<p>I tested my plot on ubuntu-subsystem on Windows 10, unfortunately matplotlib under subsystem depends on x11 window manager and its not default available on windows. We need to install an  x11 manager to support. <a href="https://sourceforge.net/projects/xming/">Xming</a> is the one I used.</p>
-
-<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">wordcloud</span> <span class="kn">import</span> <span class="n">WordCloud</span>
-<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
-
-<span class="n">font_path</span> <span class="o">=</span> <span class="s">"./font/haipai.ttf"</span>
-<span class="n">output_path</span> <span class="o">=</span> <span class="s">"./font/out.png"</span>
-
-
-<span class="k">def</span> <span class="nf">show_figure_with_frequency</span><span class="p">(</span><span class="n">keywords</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
-    <span class="n">wc</span> <span class="o">=</span> <span class="n">WordCloud</span><span class="p">(</span><span class="n">width</span><span class="o">=</span><span class="mi">828</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">1792</span><span class="p">,</span> <span class="n">max_words</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">font_path</span><span class="o">=</span><span class="n">font_path</span><span class="p">,</span>
-                   <span class="n">background_color</span><span class="o">=</span><span class="s">"white"</span><span class="p">,</span> <span class="n">margin</span><span class="o">=</span><span class="mi">1</span><span class="p">).</span><span class="n">generate_from_frequencies</span><span class="p">(</span><span class="n">keywords</span><span class="p">)</span>
-    <span class="n">plt</span><span class="p">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">wc</span><span class="p">)</span>
-    <span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">'off'</span><span class="p">)</span>
-    <span class="n">plt</span><span class="p">.</span><span class="n">show</span><span class="p">()</span>
-</code></pre></div></div>
-
-<p>If everything work fine, a word cloud figure will show up in a new window. My version looks like this.</p>
-
-<p><img src="/static/2020-09/2020-06-28.png" height="150" /></p>
-
-<p>This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.</p>
-
-
-  </article>
-  
-  
-
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = 'codersherlockblog'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-
-
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/archivers/hello.html b/_site/archivers/hello.html
deleted file mode 100644
index 308ce86..0000000
--- a/_site/archivers/hello.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Stop Talking is the worst title of one blog « Stop Talking, Start Doing</title>
-  <meta name="description" content="">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//archivers/hello">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">Stop Talking is the worst title of one blog</h1>
-    <p class="post-meta">Oct 26, 2016</p>
-  </header>
-
-  <article class="post-content">
-    
-
-  </article>
-  
-  
-
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = 'codersherlockblog'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-
-
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/archivers/intro-xv6.html b/_site/archivers/intro-xv6.html
deleted file mode 100644
index 4889d95..0000000
--- a/_site/archivers/intro-xv6.html
+++ /dev/null
@@ -1,231 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Xv6 introduction « Stop Talking, Start Doing</title>
-  <meta name="description" content="In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching...">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//archivers/intro-xv6">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">Xv6 introduction</h1>
-    <p class="post-meta">Jul 28, 2017</p>
-  </header>
-
-  <article class="post-content">
-    <p>In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
-Understand system call and know how to implement a simple one will be coved as the first half.
-In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.</p>
-
-<h2 id="xv6-systemcall">Xv6 Systemcall</h2>
-
-<p>To invoke a system call, we have to first define a user mode function to be the interface of the kernel instruction  in file <em>user.h</em>.</p>
-
-<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">function</span> <span class="p">(</span><span class="kt">void</span><span class="p">);</span>
-</code></pre></div></div>
-
-<p>This interface-like function will then pass the function name, in this case function, to <em>usys.S</em>. When using user mode function in programs, <em>usys.S</em> will generate a reference to SYS_function and push system call number of this function into %eax. After that, system can know from <em>syscall.c</em> and determining whether this system call is available. We must define same name system function and add it into <em>syscall.h</em> and <em>syscall.c</em>.</p>
-
-<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define SYS_function ##  // ## is the system call number
-</span><span class="p">[</span><span class="n">SYS_function</span><span class="p">]</span>  <span class="n">sys_function</span> <span class="c1">// real system function name</span>
-<span class="k">extern</span> <span class="kt">int</span> <span class="nf">sys_function</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span> <span class="c1">// real system function declaration</span>
-</code></pre></div></div>
-
-<p>After adding these sentences to syscall files, we can implement real function in specific place where you want to make the function works well.</p>
-
-<p>Sometimes, we need to pass variables among system calls. In this case, variables’ values are not necessary and even can’t be pass directly into system_function. When invoke a system call function, all variables of this system call will be pushed into current process’ stack. In file <em>syscall.c</em>, multiple functions are provided to get these variables from the process. I won’t waste time on explaining how to use these functions especially when elegant and detailed comments were written in source codes. However, I will explain concepts and how process organized and works in xv6 in future articles.</p>
-
-<h2 id="debug-xv6-with-gdb">Debug xv6 with gdb</h2>
-
-<p>Please make sure that you have used gdb before.
-If you never used gdb, you may write a simple 50-100 lines c code and practice how to use gdb first.</p>
-
-<ul>
-  <li><a href="https://sourceware.org/gdb/current/onlinedocs/gdb/">GDB Manual</a></li>
-  <li><a href="https://darkdust.net/files/GDB%20Cheat%20Sheet.pdf">GDB cheatsheet (pdf)</a></li>
-</ul>
-
-<p>To make sure xv6 gdb enabled, please check if <em>.gdbinit.tmpl</em> file exist.
-This file is used for generate <em>.gdbinit</em> file which you can late consider it as a configuration for gdb.</p>
-
-<p>Before running the xv6 instance in QEMU, one more thing you need to know is that using gdb to debug xv6 must be attached remotely.
-This is because xv6 was running within QEMU, and emulator is virtually gapped from the host device.
-Later when you start debugging, QEMU will open a gdb server to let gdb client connect to.</p>
-
-<p>Once you want to start, using following command to compile and run xv6</p>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>make qemu-nox-gdb
-<span class="k">***</span> Now run <span class="s1">'gdb'</span><span class="nb">.</span>
-qemu-system-i386 <span class="nt">-nographic</span> <span class="nt">-drive</span> <span class="nv">file</span><span class="o">=</span>fs.img,index<span class="o">=</span>1,media<span class="o">=</span>disk,format<span class="o">=</span>raw <span class="nt">-drive</span> <span class="nv">file</span><span class="o">=</span>xv6.img,index<span class="o">=</span>0,media<span class="o">=</span>disk,format<span class="o">=</span>raw <span class="nt">-smp</span> 2 7
-</code></pre></div></div>
-
-<p>At this moment, it feels xv6 was stuck, this is because QEMU is ready to be connected by the gdb client.
-You may use the <em>.gdbinit</em> to automatically finish this remote connection by simple typein following command in another terminal.</p>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>gdb <span class="nt">-x</span> .gdbinit
-GNU gdb <span class="o">(</span>Debian 8.2.1-2+b3<span class="o">)</span> 8.2.1
-
-...
-
-The target architecture is assumed to be i8086
-<span class="o">[</span>f000:fff0]    0xffff0: ljmp   <span class="nv">$0x3630</span>,<span class="nv">$0xf000e05b</span>
-0x0000fff0 <span class="k">in</span> ?? <span class="o">()</span>
-+ symbol-file kernel
-warning: A handler <span class="k">for </span>the OS ABI <span class="s2">"GNU/Linux"</span> is not built into this configuration
-of GDB.  Attempting to <span class="k">continue </span>with the default i8086 settings.
-
-<span class="o">(</span>gdb<span class="o">)</span> 
-</code></pre></div></div>
-
-<p>Now within this gdb client shell, type ‘c’ to continue the xv6, and you will see xv6 start execution in the first terminal.</p>
-
-<p>At this moment, you may add breakpoints to your code to see if your code is correctly implemented or not.</p>
-
-<p><strong>One more thing</strong>, if you open <em>.gdbinit</em> file, you’ll find that it by default connect to a localhost target.
-If you are working on some other environment that target and client were not placed in the same device, change the localhost to ip address correspondingly.
-Using ssh may connect to different physical devices under same domain name, this is because load balancer were used. To check ip address, search command <em>ip</em>.</p>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>target remote localhost:28467
-<span class="c"># target remote [ip-addr]:28467</span>
-</code></pre></div></div>
-
-  </article>
-  
-  
-
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = 'codersherlockblog'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-
-
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/archivers/some-of-my-previews-exper-work.html b/_site/archivers/some-of-my-previews-exper-work.html
deleted file mode 100644
index 5e30875..0000000
--- a/_site/archivers/some-of-my-previews-exper-work.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Some of my previews experiment works: 2016 « Stop Talking, Start Doing</title>
-  <meta name="description" content="This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//archivers/some-of-my-previews-exper-work">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">Some of my previews experiment works: 2016</h1>
-    <p class="post-meta">Oct 28, 2016</p>
-  </header>
-
-  <article class="post-content">
-    <p>This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.</p>
-
-<h1 id="2016-10">2016-10</h1>
-
-<h2 id="time-experiment-of-rsync">Time Experiment of rsync</h2>
-
-<p>Patch is based on rsync with version 3.1.2. [<a href="https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz">Rsync</a>|<a href="/static/2016-10/rsync/rsync-3.1.2-time.patch">Patch</a>]</p>
-
-<h3 id="how-to-collect-data">How to collect data</h3>
-
-<p>Basically, everything of transmission time and computation time will be output with overall time will be printed on the console.
-But we also need some bash script to collect data through different size of random size and with different modification through them.</p>
-
-<ul>
-  <li>Start from 8K to 64M, modify at beginning, [<a href="/static/2016-10/rsync/small2Big_change_at_begin.sh">Bash script</a>]</li>
-  <li>Start from 8K to 64M, modify at last, [<a href="/static/2016-10/rsync/small2Big_change_at_last.sh">Bash script</a>]</li>
-  <li>Start from 8K to 64M, modify at random place with a (slow) python script, [<a href="/static/2016-10/rsync/small2Big_change_at_anyplace.sh">Bash script</a>|<a href="/static/2016-10/rsync/addbyte.py">Python program</a>]</li>
-</ul>
-
-<h2 id="time-experiment-of-seafile">Time Experiment of seafile</h2>
-
-<p>Patch is based on seafile 5.1.4. You can find the release from <a href="https://github.com/haiwen/seafile/releases">seafile official repo</a>. You may follow official compile instructions from <a href="https://manual.seafile.com/build_seafile/linux.html">here</a>. [<a href="">Patch <strong>no longer avaiable, new version at following sections</strong></a>]</p>
-
-<h3 id="how-to-collect-data-1">How to collect data</h3>
-
-<p>We also need everything be done using scripting. But this time I only design added some distance between two increasing files’ sizes.</p>
-
-<ul>
-  <li>Start from 8K to 16M, 4 times increasing, modify at beginning/ at 1024 different places with python script. [<a href="/static/2016-11/seafile/trans.sh">Bash Script</a>|<a href="/static/2016-11/seafile/addbyte.py">Python program</a>]</li>
-  <li>After using this auto testing script, everything of output will be marked in log files of seafile, which located in <strong>~/.ccnet/log/seafile.log</strong></li>
-  <li>We need to use this simple awk code and vim operation to extract data.</li>
-</ul>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># CDC: content defined chucks</span>
-<span class="c"># HUT: Http upload traffic</span>
-<span class="c"># ALL: overall time of one commit &amp; upload</span>
-<span class="nb">awk</span> <span class="s1">'/CDC|HUT|ALL/ {print $4,$5}'</span> ~/.ccnet/log/seafile.log <span class="o">&gt;</span> results.stat
-</code></pre></div></div>
-
-<h3 id="install-seafile-on-odroid-xu">Install Seafile on odroid xu</h3>
-
-<p>Due to failure of my cross-compile to seafile on android. I used develop board as a replacement experiment platform for ARM-seafile testing. I used a <a href="http://www.hardkernel.com/main/products/prdt_info.php?g_code=G137510300620">odroid xu</a> as hardware standard. Because all I need is an ARM platform, only an ARM-Ubuntu is enough for me. But develop prototype on a board is much fun than coding, I won’t address much this time. But I’ll start a blog telling some really cool stuff I made for a strange aim.</p>
-
-<p>To install a ubuntu with GUI is my all preparation work. I found to way to do this.</p>
-
-<ul>
-  <li>
-    <p><a href="http://www.armhf.com/boards/odroid-xu/">armhf</a> is a website for arm-based ubuntu. It has a detailed instruction to follow at <a href="http://www.armhf.com/boards/odroid-xu/odroid-sd-install/">here</a>. They also provide ubuntu 12.04/ 14.04 and debian 7.5 to choose. But unfortunately odroid xu’s hdmi output doesn’t supported by ubuntu native firmware. So install ubuntu-desktop might can’t be boot up for video output.</p>
-  </li>
-  <li>
-    <p>Burn images is much easy to install a pre-complied ubuntu system. I found this on odroid xu’s forum, which contains xubuntu image [<a href="http://odroid.in/ubuntu_14.04lts/ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz">download</a>] for odroid xu. With this image, you just need to use dd command to write whole system mirror into sdcard.</p>
-  </li>
-</ul>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># If .img end with xz, use this command to uncompress first</span>
-unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz    
-<span class="c"># Burn image into SD-card</span>
-<span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img <span class="nv">of</span><span class="o">=</span>/dev/sdb <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">conv</span><span class="o">=</span>fsync
-<span class="nb">sync</span>
-</code></pre></div></div>
-
-<h1 id="2016-11">2016-11</h1>
-
-<h2 id="android-kernel">Android Kernel</h2>
-
-<h3 id="how-to-build-an-android-kernel">How to build an Android Kernel?</h3>
-
-<p>Generally, I won’t tell anything in this parts, just mark some related links, and point out some mistakes or error solutions.</p>
-
-<ul>
-  <li>
-    <p><a href="http://source.android.com/source/building-kernels.html#figuring-out-which-kernel-to-build">Google Official Guide</a>
-– If you don’t have AOSP sources, you have to download prebuilt toolchains which recommended in this guide might not be correct. Use following links to choose your fitting tools.
-— <a href="https://android.googlesource.com/?format=HTML">ASOP git root</a>, under sub class “/platform/prebuilts/gcc”</p>
-  </li>
-  <li>
-    <p><a href="https://softwarebakery.com/building-the-android-kernel-on-linux">Packing and Flashing a Boot.img</a> <strong>[highly recommend]</strong></p>
-  </li>
-</ul>
-
-<h1 id="2016-12">2016-12</h1>
-
-<h2 id="android-kernel-1">Android Kernel</h2>
-
-<h3 id="how-to-compile-with-ftrace">How to compile with ftrace?</h3>
-
-<p>If we want to debug under android, ftrace is a great tool for working. But, ftrace is not available in android if we used default configure file. Android kernel configuration is in <strong>arch/arm64/kernel/configs</strong>. We need to add few lines under that.</p>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">CONFIG_STRICT_MEMORY_RWX</span><span class="o">=</span>y
-<span class="nv">CONFIG_FUNCTION_TRACER</span><span class="o">=</span>y
-<span class="nv">CONFIG_FUNCTION_GRAPH_TRACER</span><span class="o">=</span>y
-<span class="nv">CONFIG_DYNAMIC_FTRACE</span><span class="o">=</span>y
-<span class="nv">CONFIG_PERSISTENT_TRACER</span><span class="o">=</span>y
-<span class="nv">CONFIG_IRQSOFF_TRACER</span><span class="o">=</span>y
-<span class="nv">CONFIG_PREEMPT_TRACER</span><span class="o">=</span>y
-<span class="nv">CONFIG_SCHED_TRACER</span><span class="o">=</span>y
-<span class="nv">CONFIG_STACK_TRACER</span><span class="o">=</span>y
-</code></pre></div></div>
-
-<h3 id="how-to-extract-android-images-dump-an-image">How to extract android images: Dump an image</h3>
-
-<p>If we want to hold a rooted status after flashing boot, we need to extract an image from android devices. We can first use following command to find which blocks belongs to. According to some references, <a href="http://forum.xda-developers.com/showthread.php?t=2450045">this article</a> provide three ways to dump an image, I picked one for easy using.</p>
-
-<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb shell
-<span class="nb">ls</span> <span class="nt">-al</span> /dev/block/platform/<span class="nv">$SOME</span><span class="se">\_</span>DEVICE../../by-name <span class="c"># {Partitions} -&gt; {Device Block}</span>
-
-<span class="c"># dump file</span>
-su
-<span class="nb">dd </span><span class="k">if</span><span class="o">=</span>/dev/block/mmcblk0p37 <span class="nv">of</span><span class="o">=</span>/sdcard/boot.img
-</code></pre></div></div>
-
-  </article>
-  
-  
-
-<div class="post-comments">
-  <div id="disqus_thread"></div>
-  <script type="text/javascript">
-      var disqus_shortname = 'codersherlockblog'; // required: replace example with your forum shortname
-      (function() {
-          var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-          dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-      })();
-  </script>
-</div>
-
-
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/assets/android-chrome-192x192.png b/_site/assets/android-chrome-192x192.png
new file mode 100644
index 0000000..91cdd01
Binary files /dev/null and b/_site/assets/android-chrome-192x192.png differ
diff --git a/_site/assets/android-chrome-512x512.png b/_site/assets/android-chrome-512x512.png
new file mode 100644
index 0000000..5c072f9
Binary files /dev/null and b/_site/assets/android-chrome-512x512.png differ
diff --git a/_site/assets/apple-touch-icon.png b/_site/assets/apple-touch-icon.png
new file mode 100644
index 0000000..fe848f4
Binary files /dev/null and b/_site/assets/apple-touch-icon.png differ
diff --git a/_site/assets/browserconfig.xml b/_site/assets/browserconfig.xml
new file mode 100644
index 0000000..86a2869
--- /dev/null
+++ b/_site/assets/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+    <msapplication>
+        <tile>
+            <square150x150logo src="assets/mstile-150x150.png"/>
+            <TileColor>#b91d47</TileColor>
+        </tile>
+    </msapplication>
+</browserconfig>
diff --git a/_site/assets/css/main.css b/_site/assets/css/main.css
new file mode 100644
index 0000000..24d32d7
--- /dev/null
+++ b/_site/assets/css/main.css
@@ -0,0 +1,2634 @@
+figure.highlight::before { color: #8e908c !important; background-color: #f7f7f7 !important; }
+
+pre.lineno { color: #8e908c !important; }
+
+.highlight > pre { color: #4d4d4c; background-color: #f7f7f7 !important; /* Comment */ /* Error */ /* Keyword */ /* Literal */ /* Name */ /* Operator */ /* Punctuation */ /* Comment.Multiline */ /* Comment.Preproc */ /* Comment.Single */ /* Comment.Special */ /* Generic.Deleted */ /* Generic.Emph */ /* Generic.Heading */ /* Generic.Inserted */ /* Generic.Prompt */ /* Generic.Strong */ /* Generic.Subheading */ /* Keyword.Constant */ /* Keyword.Declaration */ /* Keyword.Namespace */ /* Keyword.Pseudo */ /* Keyword.Reserved */ /* Keyword.Type */ /* Literal.Date */ /* Literal.Number */ /* Literal.String */ /* Name.Attribute */ /* Name.Builtin */ /* Name.Class */ /* Name.Constant */ /* Name.Decorator */ /* Name.Entity */ /* Name.Exception */ /* Name.Function */ /* Name.Label */ /* Name.Namespace */ /* Name.Other */ /* Name.Property */ /* Name.Tag */ /* Name.Variable */ /* Operator.Word */ /* Text.Whitespace */ /* Literal.Number.Float */ /* Literal.Number.Hex */ /* Literal.Number.Integer */ /* Literal.Number.Oct */ /* Literal.String.Backtick */ /* Literal.String.Char */ /* Literal.String.Doc */ /* Literal.String.Double */ /* Literal.String.Escape */ /* Literal.String.Heredoc */ /* Literal.String.Interpol */ /* Literal.String.Other */ /* Literal.String.Regex */ /* Literal.String.Single */ /* Literal.String.Symbol */ /* Name.Builtin.Pseudo */ /* Name.Variable.Class */ /* Name.Variable.Global */ /* Name.Variable.Instance */ /* Literal.Number.Integer.Long */ }
+
+.highlight > pre .c { color: #8e908c; }
+
+.highlight > pre .err { color: #c82829; }
+
+.highlight > pre .k { color: #8959a8; }
+
+.highlight > pre .l { color: #f5871f; }
+
+.highlight > pre .n { color: #4d4d4c; }
+
+.highlight > pre .o { color: #3e999f; }
+
+.highlight > pre .p { color: #4d4d4c; }
+
+.highlight > pre .cm { color: #8e908c; }
+
+.highlight > pre .cp { color: #8e908c; }
+
+.highlight > pre .c1 { color: #8e908c; }
+
+.highlight > pre .cs { color: #8e908c; }
+
+.highlight > pre .gd { color: #c82829; }
+
+.highlight > pre .ge { font-style: italic; }
+
+.highlight > pre .gh { font-weight: bold; color: #4d4d4c; }
+
+.highlight > pre .gi { color: #718c00; }
+
+.highlight > pre .gp { font-weight: bold; color: #8e908c; }
+
+.highlight > pre .gs { font-weight: bold; }
+
+.highlight > pre .gu { font-weight: bold; color: #3e999f; }
+
+.highlight > pre .kc { color: #8959a8; }
+
+.highlight > pre .kd { color: #8959a8; }
+
+.highlight > pre .kn { color: #3e999f; }
+
+.highlight > pre .kp { color: #8959a8; }
+
+.highlight > pre .kr { color: #8959a8; }
+
+.highlight > pre .kt { color: #eab700; }
+
+.highlight > pre .ld { color: #718c00; }
+
+.highlight > pre .m { color: #f5871f; }
+
+.highlight > pre .s { color: #718c00; }
+
+.highlight > pre .na { color: #4271ae; }
+
+.highlight > pre .nb { color: #4d4d4c; }
+
+.highlight > pre .nc { color: #eab700; }
+
+.highlight > pre .no { color: #c82829; }
+
+.highlight > pre .nd { color: #3e999f; }
+
+.highlight > pre .ni { color: #4d4d4c; }
+
+.highlight > pre .ne { color: #c82829; }
+
+.highlight > pre .nf { color: #4271ae; }
+
+.highlight > pre .nl { color: #4d4d4c; }
+
+.highlight > pre .nn { color: #eab700; }
+
+.highlight > pre .nx { color: #4271ae; }
+
+.highlight > pre .py { color: #4d4d4c; }
+
+.highlight > pre .nt { color: #3e999f; }
+
+.highlight > pre .nv { color: #c82829; }
+
+.highlight > pre .ow { color: #3e999f; }
+
+.highlight > pre .w { color: #4d4d4c; }
+
+.highlight > pre .mf { color: #f5871f; }
+
+.highlight > pre .mh { color: #f5871f; }
+
+.highlight > pre .mi { color: #f5871f; }
+
+.highlight > pre .mo { color: #f5871f; }
+
+.highlight > pre .sb { color: #718c00; }
+
+.highlight > pre .sc { color: #4d4d4c; }
+
+.highlight > pre .sd { color: #8e908c; }
+
+.highlight > pre .s2 { color: #718c00; }
+
+.highlight > pre .se { color: #f5871f; }
+
+.highlight > pre .sh { color: #718c00; }
+
+.highlight > pre .si { color: #f5871f; }
+
+.highlight > pre .sx { color: #718c00; }
+
+.highlight > pre .sr { color: #718c00; }
+
+.highlight > pre .s1 { color: #718c00; }
+
+.highlight > pre .ss { color: #718c00; }
+
+.highlight > pre .bp { color: #4d4d4c; }
+
+.highlight > pre .vc { color: #c82829; }
+
+.highlight > pre .vg { color: #c82829; }
+
+.highlight > pre .vi { color: #c82829; }
+
+.highlight > pre .il { color: #f5871f; }
+
+/* stylelint-disable at-rule-name-space-after, at-rule-semicolon-space-before  */
+.clearfix::after { display: table; clear: both; content: ""; }
+
+.left { float: left; }
+
+.right { float: right; }
+
+@media (min-width: 0) { .d-none { display: none !important; } }
+
+@media (min-width: 500px) { .d-md-none { display: none !important; } }
+
+@media (min-width: 1024px) { .d-lg-none { display: none !important; } }
+
+@media print { .d-print-none, .extensions { display: none !important; } }
+
+.horizontal-rules::before { display: block; font-size: 1.9rem; color: #888; text-align: center; letter-spacing: 1.5rem; content: "..."; }
+
+.text--light, .header--light, .hero--light, .card__image > .overlay--light { color: #222; }
+
+.text--light h1, .header--light h1, .hero--light h1, .card__image > .overlay--light h1, .text--light h2, .header--light h2, .hero--light h2, .card__image > .overlay--light h2, .text--light h3, .header--light h3, .hero--light h3, .card__image > .overlay--light h3 { color: #000; }
+
+.text--light h4, .header--light h4, .hero--light h4, .card__image > .overlay--light h4, .text--light h5, .header--light h5, .hero--light h5, .card__image > .overlay--light h5 { color: #222; }
+
+.text--light h6, .header--light h6, .hero--light h6, .card__image > .overlay--light h6 { color: #888; }
+
+.text--light a:not(.button):not(.swiper__button), .header--light a:not(.button):not(.swiper__button), .hero--light a:not(.button):not(.swiper__button), .card__image > .overlay--light a:not(.button):not(.swiper__button) { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.text--light a:not(.button):not(.swiper__button), .header--light a:not(.button):not(.swiper__button), .hero--light a:not(.button):not(.swiper__button), .card__image > .overlay--light a:not(.button):not(.swiper__button), .text--light a:not(.button):not(.swiper__button):link, .text--light a:not(.button):not(.swiper__button):visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .text--light a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .header--light a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .hero--light a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .card__image > .overlay--light a:not(.button):not(.swiper__button):hover { text-decoration: underline; }
+
+.root[data-is-touch] .text--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .header--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .hero--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .card__image > .overlay--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .text--light a:not(.button):not(.swiper__button):active, .root[data-is-touch] .header--light a:not(.button):not(.swiper__button):active, .root[data-is-touch] .hero--light a:not(.button):not(.swiper__button):active, .root[data-is-touch] .card__image > .overlay--light a:not(.button):not(.swiper__button):active { text-decoration: none; }
+
+.text--light a:not(.button):not(.swiper__button), .header--light a:not(.button):not(.swiper__button), .hero--light a:not(.button):not(.swiper__button), .card__image > .overlay--light a:not(.button):not(.swiper__button), .text--light a:not(.button):not(.swiper__button):link, .text--light a:not(.button):not(.swiper__button):visited { color: #222; }
+
+.root[data-is-touch="false"] .text--light a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .header--light a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .hero--light a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .card__image > .overlay--light a:not(.button):not(.swiper__button):hover { color: #fc4d50; }
+
+.root[data-is-touch] .text--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .header--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .hero--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .card__image > .overlay--light a.active:not(.button):not(.swiper__button), .root[data-is-touch] .text--light a:not(.button):not(.swiper__button):active, .root[data-is-touch] .header--light a:not(.button):not(.swiper__button):active, .root[data-is-touch] .hero--light a:not(.button):not(.swiper__button):active, .root[data-is-touch] .card__image > .overlay--light a:not(.button):not(.swiper__button):active { color: #f80408; }
+
+.text--light a.disabled:not(.button):not(.swiper__button), .header--light a.disabled:not(.button):not(.swiper__button), .hero--light a.disabled:not(.button):not(.swiper__button), .card__image > .overlay--light a.disabled:not(.button):not(.swiper__button), .text--light a:not(.button):not(.swiper__button):disabled, .header--light a:not(.button):not(.swiper__button):disabled, .hero--light a:not(.button):not(.swiper__button):disabled, .card__image > .overlay--light a:not(.button):not(.swiper__button):disabled { color: rgba(34, 34, 34, 0.2) !important; }
+
+.text--dark, .header--dark, .hero--dark, .card__image > .overlay, .card__image > .overlay--dark { color: rgba(255, 255, 255, 0.95); }
+
+.text--dark h1, .header--dark h1, .hero--dark h1, .card__image > .overlay h1, .card__image > .overlay--dark h1, .text--dark h2, .header--dark h2, .hero--dark h2, .card__image > .overlay h2, .card__image > .overlay--dark h2, .text--dark h3, .header--dark h3, .hero--dark h3, .card__image > .overlay h3, .card__image > .overlay--dark h3 { color: #fff; }
+
+.text--dark h4, .header--dark h4, .hero--dark h4, .card__image > .overlay h4, .card__image > .overlay--dark h4, .text--dark h5, .header--dark h5, .hero--dark h5, .card__image > .overlay h5, .card__image > .overlay--dark h5 { color: rgba(255, 255, 255, 0.95); }
+
+.text--dark h6, .header--dark h6, .hero--dark h6, .card__image > .overlay h6, .card__image > .overlay--dark h6 { color: rgba(255, 255, 255, 0.85); }
+
+.text--dark a:not(.button):not(.swiper__button), .header--dark a:not(.button):not(.swiper__button), .hero--dark a:not(.button):not(.swiper__button), .card__image > .overlay a:not(.button):not(.swiper__button), .card__image > .overlay--dark a:not(.button):not(.swiper__button) { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.text--dark a:not(.button):not(.swiper__button), .header--dark a:not(.button):not(.swiper__button), .hero--dark a:not(.button):not(.swiper__button), .card__image > .overlay a:not(.button):not(.swiper__button), .card__image > .overlay--dark a:not(.button):not(.swiper__button), .text--dark a:not(.button):not(.swiper__button):link, .text--dark a:not(.button):not(.swiper__button):visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .text--dark a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .header--dark a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .hero--dark a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .card__image > .overlay a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .card__image > .overlay--dark a:not(.button):not(.swiper__button):hover { text-decoration: underline; }
+
+.root[data-is-touch] .text--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .header--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .hero--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .card__image > .overlay a.active:not(.button):not(.swiper__button), .root[data-is-touch] .card__image > .overlay--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .text--dark a:not(.button):not(.swiper__button):active, .root[data-is-touch] .header--dark a:not(.button):not(.swiper__button):active, .root[data-is-touch] .hero--dark a:not(.button):not(.swiper__button):active, .root[data-is-touch] .card__image > .overlay a:not(.button):not(.swiper__button):active, .root[data-is-touch] .card__image > .overlay--dark a:not(.button):not(.swiper__button):active { text-decoration: none; }
+
+.text--dark a:not(.button):not(.swiper__button), .header--dark a:not(.button):not(.swiper__button), .hero--dark a:not(.button):not(.swiper__button), .card__image > .overlay a:not(.button):not(.swiper__button), .card__image > .overlay--dark a:not(.button):not(.swiper__button), .text--dark a:not(.button):not(.swiper__button):link, .text--dark a:not(.button):not(.swiper__button):visited { color: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch="false"] .text--dark a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .header--dark a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .hero--dark a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .card__image > .overlay a:not(.button):not(.swiper__button):hover, .root[data-is-touch="false"] .card__image > .overlay--dark a:not(.button):not(.swiper__button):hover { color: #fc4d50; }
+
+.root[data-is-touch] .text--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .header--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .hero--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .card__image > .overlay a.active:not(.button):not(.swiper__button), .root[data-is-touch] .card__image > .overlay--dark a.active:not(.button):not(.swiper__button), .root[data-is-touch] .text--dark a:not(.button):not(.swiper__button):active, .root[data-is-touch] .header--dark a:not(.button):not(.swiper__button):active, .root[data-is-touch] .hero--dark a:not(.button):not(.swiper__button):active, .root[data-is-touch] .card__image > .overlay a:not(.button):not(.swiper__button):active, .root[data-is-touch] .card__image > .overlay--dark a:not(.button):not(.swiper__button):active { color: #f80408; }
+
+.text--dark a.disabled:not(.button):not(.swiper__button), .header--dark a.disabled:not(.button):not(.swiper__button), .hero--dark a.disabled:not(.button):not(.swiper__button), .card__image > .overlay a.disabled:not(.button):not(.swiper__button), .card__image > .overlay--dark a.disabled:not(.button):not(.swiper__button), .text--dark a:not(.button):not(.swiper__button):disabled, .header--dark a:not(.button):not(.swiper__button):disabled, .hero--dark a:not(.button):not(.swiper__button):disabled, .card__image > .overlay a:not(.button):not(.swiper__button):disabled, .card__image > .overlay--dark a:not(.button):not(.swiper__button):disabled { color: rgba(255, 255, 255, 0.2) !important; }
+
+.of-auto { overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.of-hidden { overflow: hidden; }
+
+.box-shadow-1 { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.23), 0 1px 3px rgba(0, 0, 0, 0.08), 0 6px 12px rgba(0, 0, 0, 0.02); }
+
+.box-shadow-2 { box-shadow: 0 8px 16px rgba(0, 0, 0, 0.23), 0 2px 6px rgba(0, 0, 0, 0.08), 0 12px 24px rgba(0, 0, 0, 0.02); }
+
+.mt-0 { margin-top: 0; }
+
+.mt-1 { margin-top: 0.25rem; }
+
+.mt-2 { margin-top: 0.5rem; }
+
+.mt-3 { margin-top: 1rem; }
+
+.mt-4 { margin-top: 1.5rem; }
+
+.mt-5 { margin-top: 3rem; }
+
+.mb-0 { margin-bottom: 0; }
+
+.mb-1 { margin-bottom: 0.25rem; }
+
+.mb-2 { margin-bottom: 0.5rem; }
+
+.mb-3 { margin-bottom: 1rem; }
+
+.mb-4 { margin-bottom: 1.5rem; }
+
+.mb-5 { margin-bottom: 3rem; }
+
+.ml-0 { margin-left: 0; }
+
+.ml-1 { margin-left: 0.25rem; }
+
+.ml-2 { margin-left: 0.5rem; }
+
+.ml-3 { margin-left: 1rem; }
+
+.ml-4 { margin-left: 1.5rem; }
+
+.ml-5 { margin-left: 3rem; }
+
+.mr-0 { margin-right: 0; }
+
+.mr-1 { margin-right: 0.25rem; }
+
+.mr-2 { margin-right: 0.5rem; }
+
+.mr-3 { margin-right: 1rem; }
+
+.mr-4 { margin-right: 1.5rem; }
+
+.mr-5 { margin-right: 3rem; }
+
+.mx-0 { margin-left: 0; margin-right: 0; }
+
+.mx-1 { margin-left: 0.25rem; margin-right: 0.25rem; }
+
+.mx-2 { margin-left: 0.5rem; margin-right: 0.5rem; }
+
+.mx-3 { margin-left: 1rem; margin-right: 1rem; }
+
+.mx-4 { margin-left: 1.5rem; margin-right: 1.5rem; }
+
+.mx-5 { margin-left: 3rem; margin-right: 3rem; }
+
+.my-0 { margin-top: 0; margin-bottom: 0; }
+
+.my-1 { margin-top: 0.25rem; margin-bottom: 0.25rem; }
+
+.my-2 { margin-top: 0.5rem; margin-bottom: 0.5rem; }
+
+.my-3 { margin-top: 1rem; margin-bottom: 1rem; }
+
+.my-4 { margin-top: 1.5rem; margin-bottom: 1.5rem; }
+
+.my-5 { margin-top: 3rem; margin-bottom: 3rem; }
+
+.m-0 { margin: 0; }
+
+.m-1 { margin: 0.25rem; }
+
+.m-2 { margin: 0.5rem; }
+
+.m-3 { margin: 1rem; }
+
+.m-4 { margin: 1.5rem; }
+
+.m-5 { margin: 3rem; }
+
+.pt-0 { padding-top: 0; }
+
+.pt-1 { padding-top: 0.25rem; }
+
+.pt-2 { padding-top: 0.5rem; }
+
+.pt-3 { padding-top: 1rem; }
+
+.pt-4 { padding-top: 1.5rem; }
+
+.pt-5 { padding-top: 3rem; }
+
+.pb-0 { padding-bottom: 0; }
+
+.pb-1 { padding-bottom: 0.25rem; }
+
+.pb-2 { padding-bottom: 0.5rem; }
+
+.pb-3 { padding-bottom: 1rem; }
+
+.pb-4 { padding-bottom: 1.5rem; }
+
+.pb-5 { padding-bottom: 3rem; }
+
+.pl-0 { padding-left: 0; }
+
+.pl-1 { padding-left: 0.25rem; }
+
+.pl-2 { padding-left: 0.5rem; }
+
+.pl-3 { padding-left: 1rem; }
+
+.pl-4 { padding-left: 1.5rem; }
+
+.pl-5 { padding-left: 3rem; }
+
+.pr-0 { padding-right: 0; }
+
+.pr-1 { padding-right: 0.25rem; }
+
+.pr-2 { padding-right: 0.5rem; }
+
+.pr-3 { padding-right: 1rem; }
+
+.pr-4 { padding-right: 1.5rem; }
+
+.pr-5 { padding-right: 3rem; }
+
+.px-0 { padding-left: 0; padding-right: 0; }
+
+.px-1 { padding-left: 0.25rem; padding-right: 0.25rem; }
+
+.px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }
+
+.px-3 { padding-left: 1rem; padding-right: 1rem; }
+
+.px-4 { padding-left: 1.5rem; padding-right: 1.5rem; }
+
+.px-5 { padding-left: 3rem; padding-right: 3rem; }
+
+.py-0 { padding-top: 0; padding-bottom: 0; }
+
+.py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
+
+.py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
+
+.py-3 { padding-top: 1rem; padding-bottom: 1rem; }
+
+.py-4 { padding-top: 1.5rem; padding-bottom: 1.5rem; }
+
+.py-5 { padding-top: 3rem; padding-bottom: 3rem; }
+
+.p-0 { padding: 0; }
+
+.p-1 { padding: 0.25rem; }
+
+.p-2 { padding: 0.5rem; }
+
+.p-3 { padding: 1rem; }
+
+.p-4 { padding: 1.5rem; }
+
+.p-5 { padding: 3rem; }
+
+.mt-auto { margin-top: auto; }
+
+.mb-auto { margin-bottom: auto; }
+
+.ml-auto { margin-left: auto; }
+
+.mr-auto { margin-right: auto; }
+
+.mx-auto { margin-left: auto; margin-right: auto; }
+
+.my-auto { margin-top: auto; margin-bottom: auto; }
+
+.m-auto { margin: auto; }
+
+.grid-container { overflow: hidden; }
+
+.cell { min-width: 0; }
+
+.grid { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-flex-wrap: wrap; -moz-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap; }
+
+@media (min-width: 0) { .grid > .cell--1 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 8.3333333333%; } }
+
+@media (min-width: 0) { .grid > .cell--2 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 16.6666666667%; } }
+
+@media (min-width: 0) { .grid > .cell--3 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 25%; } }
+
+@media (min-width: 0) { .grid > .cell--4 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 33.3333333333%; } }
+
+@media (min-width: 0) { .grid > .cell--5 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 41.6666666667%; } }
+
+@media (min-width: 0) { .grid > .cell--6 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 50%; } }
+
+@media (min-width: 0) { .grid > .cell--7 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 58.3333333333%; } }
+
+@media (min-width: 0) { .grid > .cell--8 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 66.6666666667%; } }
+
+@media (min-width: 0) { .grid > .cell--9 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 75%; } }
+
+@media (min-width: 0) { .grid > .cell--10 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 83.3333333333%; } }
+
+@media (min-width: 0) { .grid > .cell--11 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 91.6666666667%; } }
+
+@media (min-width: 0) { .grid > .cell--12 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 100%; } }
+
+@media (min-width: 0) { .grid > .cell--auto { -webkit-box-flex: 1; -webkit-flex: 1 1 0; -moz-box-flex: 1; -moz-flex: 1 1 0; -ms-flex: 1 1 0; flex: 1 1 0; width: auto; } }
+
+@media (min-width: 0) { .grid > .cell--shrink { -webkit-box-flex: 0; -webkit-flex: 0 0 auto; -moz-box-flex: 0; -moz-flex: 0 0 auto; -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; } }
+
+@media (min-width: 0) { .grid > .cell--stretch { -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; } }
+
+@media (min-width: 500px) { .grid > .cell--md-1 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 8.3333333333%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-2 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 16.6666666667%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-3 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 25%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-4 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 33.3333333333%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-5 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 41.6666666667%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-6 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 50%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-7 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 58.3333333333%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-8 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 66.6666666667%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-9 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 75%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-10 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 83.3333333333%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-11 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 91.6666666667%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-12 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 100%; } }
+
+@media (min-width: 500px) { .grid > .cell--md-auto { -webkit-box-flex: 1; -webkit-flex: 1 1 0; -moz-box-flex: 1; -moz-flex: 1 1 0; -ms-flex: 1 1 0; flex: 1 1 0; width: auto; } }
+
+@media (min-width: 500px) { .grid > .cell--md-shrink { -webkit-box-flex: 0; -webkit-flex: 0 0 auto; -moz-box-flex: 0; -moz-flex: 0 0 auto; -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; } }
+
+@media (min-width: 500px) { .grid > .cell--md-stretch { -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-1 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 8.3333333333%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-2 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 16.6666666667%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-3 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 25%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-4 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 33.3333333333%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-5 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 41.6666666667%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-6 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 50%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-7 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 58.3333333333%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-8 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 66.6666666667%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-9 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 75%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-10 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 83.3333333333%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-11 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 91.6666666667%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-12 { -webkit-box-flex: none; -webkit-flex: none; -moz-box-flex: none; -moz-flex: none; -ms-flex: none; flex: none; width: 100%; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-auto { -webkit-box-flex: 1; -webkit-flex: 1 1 0; -moz-box-flex: 1; -moz-flex: 1 1 0; -ms-flex: 1 1 0; flex: 1 1 0; width: auto; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-shrink { -webkit-box-flex: 0; -webkit-flex: 0 0 auto; -moz-box-flex: 0; -moz-flex: 0 0 auto; -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; } }
+
+@media (min-width: 1024px) { .grid > .cell--lg-stretch { -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; } }
+
+.grid--reverse { flex-direction: row-reverse; }
+
+.grid--px-0 { margin-left: 0; margin-right: 0; }
+
+.grid--px-0 .cell { padding-left: 0; padding-right: 0; }
+
+.grid--px-1 { margin-left: -0.25rem; margin-right: -0.25rem; }
+
+.grid--px-1 .cell { padding-left: 0.25rem; padding-right: 0.25rem; }
+
+.grid--px-2 { margin-left: -0.5rem; margin-right: -0.5rem; }
+
+.grid--px-2 .cell { padding-left: 0.5rem; padding-right: 0.5rem; }
+
+.grid--px-3 { margin-left: -1rem; margin-right: -1rem; }
+
+.grid--px-3 .cell { padding-left: 1rem; padding-right: 1rem; }
+
+.grid--px-4 { margin-left: -1.5rem; margin-right: -1.5rem; }
+
+.grid--px-4 .cell { padding-left: 1.5rem; padding-right: 1.5rem; }
+
+.grid--px-5 { margin-left: -3rem; margin-right: -3rem; }
+
+.grid--px-5 .cell { padding-left: 3rem; padding-right: 3rem; }
+
+.grid--py-0 { margin-top: 0; margin-bottom: 0; }
+
+.grid--py-0 .cell { padding-top: 0; padding-bottom: 0; }
+
+.grid--py-1 { margin-top: -0.25rem; margin-bottom: -0.25rem; }
+
+.grid--py-1 .cell { padding-top: 0.25rem; padding-bottom: 0.25rem; }
+
+.grid--py-2 { margin-top: -0.5rem; margin-bottom: -0.5rem; }
+
+.grid--py-2 .cell { padding-top: 0.5rem; padding-bottom: 0.5rem; }
+
+.grid--py-3 { margin-top: -1rem; margin-bottom: -1rem; }
+
+.grid--py-3 .cell { padding-top: 1rem; padding-bottom: 1rem; }
+
+.grid--py-4 { margin-top: -1.5rem; margin-bottom: -1.5rem; }
+
+.grid--py-4 .cell { padding-top: 1.5rem; padding-bottom: 1.5rem; }
+
+.grid--py-5 { margin-top: -3rem; margin-bottom: -3rem; }
+
+.grid--py-5 .cell { padding-top: 3rem; padding-bottom: 3rem; }
+
+.grid--p-0 { margin: 0; }
+
+.grid--p-0 .cell { padding: 0; }
+
+.grid--p-1 { margin: -0.25rem; }
+
+.grid--p-1 .cell { padding: 0.25rem; }
+
+.grid--p-2 { margin: -0.5rem; }
+
+.grid--p-2 .cell { padding: 0.5rem; }
+
+.grid--p-3 { margin: -1rem; }
+
+.grid--p-3 .cell { padding: 1rem; }
+
+.grid--p-4 { margin: -1.5rem; }
+
+.grid--p-4 .cell { padding: 1.5rem; }
+
+.grid--p-5 { margin: -3rem; }
+
+.grid--p-5 .cell { padding: 3rem; }
+
+/* stylelint-enable */
+*, ::before, ::after { box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
+
+/** 1. Prevent adjustments of font size after orientation changes in iOS. */
+html { font-size: 16px; -webkit-text-size-adjust: 100%; /* 1 */ }
+
+@media print { html { font-size: 14px; } }
+
+body { padding: 0; margin: 0; font: 400 1rem/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; }
+
+body ::-moz-selection { background: rgba(252, 77, 80, 0.5); }
+
+body ::-webkit-selection { background: rgba(252, 77, 80, 0.5); }
+
+body ::selection { background: rgba(252, 77, 80, 0.5); }
+
+h1, h2, h3, h4, h5, h6, p, hr, blockquote, figure, pre, .highlighter-rouge, ul, ol, dl, table, .footnotes { padding: 0; margin: 0.5rem 0; }
+
+input, textarea, select, button { font: 400 1rem/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; color: #222; }
+
+h1, h2, h3, h4, h5, h6, strong { font-weight: 700; }
+
+h1 { font-size: 2.5rem; color: #000; }
+
+@media (max-width: 499px) { h1 { font-size: 2rem; } }
+
+h2 { font-size: 1.9rem; color: #000; }
+
+@media (max-width: 499px) { h2 { font-size: 1.5rem; } }
+
+h3 { font-size: 1.5rem; color: #000; }
+
+@media (max-width: 499px) { h3 { font-size: 1.35rem; } }
+
+h4 { font-size: 1.2rem; color: #222; }
+
+@media (max-width: 499px) { h4 { font-size: 1.15rem; } }
+
+h5 { font-size: 1rem; color: #222; }
+
+@media (max-width: 499px) { h5 { font-size: 1rem; } }
+
+h6 { font-size: 1rem; color: #888; }
+
+@media (max-width: 499px) { h6 { font-size: 1rem; } }
+
+a { font-weight: 700; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+a, a:link, a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] a:hover { text-decoration: underline; }
+
+.root[data-is-touch] a.active, .root[data-is-touch] a:active { text-decoration: none; }
+
+a, a:link, a:visited { color: #fc4d50; }
+
+.root[data-is-touch="false"] a:hover { color: #fb070b; }
+
+.root[data-is-touch] a.active, .root[data-is-touch] a:active { color: #b20306; }
+
+a.disabled, a:disabled { color: rgba(252, 77, 80, 0.2) !important; }
+
+pre, code { font-family: Menlo, Monaco, Consolas, Andale Mono, lucida console, Courier New, monospace; }
+
+code { font-size: 0.7rem; line-height: 1.4; }
+
+figure > img { display: block; }
+
+figcaption { font-size: 0.85rem; }
+
+button { padding: 0; margin: 0; font-size: 1rem; cursor: pointer; background-color: transparent; border-width: 0; outline: none; }
+
+input::-ms-clear { display: none; }
+
+input:focus { outline: none; }
+
+.mermaidTooltip { display: none; }
+
+@media print { a, a:link, a:visited { text-decoration: underline; } .root[data-is-touch="false"] a:hover { text-decoration: underline; } .root[data-is-touch] a.active, .root[data-is-touch] a:active { text-decoration: underline; } img, tr, pre, blockquote { page-break-inside: avoid; } }
+
+.button, .swiper__button { display: inline-block; font-weight: 700; line-height: 1 !important; text-decoration: none !important; cursor: pointer; outline: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
+
+.button svg, .swiper__button svg { width: 1rem; height: 1rem; }
+
+.button.disabled, .disabled.swiper__button, .button:disabled, .swiper__button:disabled { cursor: not-allowed; }
+
+.button--primary { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--primary svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--primary, .button--primary:link, .button--primary:visited { color: #fff; background-color: #fc4d50; }
+
+.button--primary svg path, .button--primary:link svg path, .button--primary:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .button--primary:hover { color: #fff; background-color: #fb070b; }
+
+.root[data-is-touch="false"] .button--primary:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--primary.active, .root[data-is-touch] .button--primary:active { color: #fff; background-color: #b20306; }
+
+.root[data-is-touch] .button--primary.active svg path, .root[data-is-touch] .button--primary:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--primary.focus { color: default; background-color: #fb070b; box-shadow: 0 0 0 2px rgba(251, 7, 11, 0.4); }
+
+.root[data-is-touch] .button--primary.focus svg path { fill: default; }
+
+.button--primary.disabled, .button--primary:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #fc4d50 !important; }
+
+.button--primary.disabled svg path, .button--primary:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.button--secondary { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--secondary svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--secondary, .button--secondary:link, .button--secondary:visited { color: #333; background-color: #f2f2f2; }
+
+.button--secondary svg path, .button--secondary:link svg path, .button--secondary:visited svg path { fill: #333; }
+
+.root[data-is-touch="false"] .button--secondary:hover { color: #333; background-color: #cecece; }
+
+.root[data-is-touch="false"] .button--secondary:hover svg path { fill: #333; }
+
+.root[data-is-touch] .button--secondary.active, .root[data-is-touch] .button--secondary:active { color: #333; background-color: #a8a8a8; }
+
+.root[data-is-touch] .button--secondary.active svg path, .root[data-is-touch] .button--secondary:active svg path { fill: #333; }
+
+.root[data-is-touch] .button--secondary.focus { color: default; background-color: #cecece; box-shadow: 0 0 0 2px rgba(206, 206, 206, 0.4); }
+
+.root[data-is-touch] .button--secondary.focus svg path { fill: default; }
+
+.button--secondary.disabled, .button--secondary:disabled { color: rgba(51, 51, 51, 0.2) !important; background-color: #f2f2f2 !important; }
+
+.button--secondary.disabled svg path, .button--secondary:disabled svg path { fill: rgba(51, 51, 51, 0.2) !important; }
+
+.button--success { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--success svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--success, .button--success:link, .button--success:visited { color: #fff; background-color: #52c41a; }
+
+.button--success svg path, .button--success:link svg path, .button--success:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .button--success:hover { color: #fff; background-color: #388512; }
+
+.root[data-is-touch="false"] .button--success:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--success.active, .root[data-is-touch] .button--success:active { color: #fff; background-color: #1b4109; }
+
+.root[data-is-touch] .button--success.active svg path, .root[data-is-touch] .button--success:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--success.focus { color: default; background-color: #388512; box-shadow: 0 0 0 2px rgba(56, 133, 18, 0.4); }
+
+.root[data-is-touch] .button--success.focus svg path { fill: default; }
+
+.button--success.disabled, .button--success:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #52c41a !important; }
+
+.button--success.disabled svg path, .button--success:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.button--info { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--info svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--info, .button--info:link, .button--info:visited { color: #fff; background-color: #1890ff; }
+
+.button--info svg path, .button--info:link svg path, .button--info:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .button--info:hover { color: #fff; background-color: #006cd0; }
+
+.root[data-is-touch="false"] .button--info:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--info.active, .root[data-is-touch] .button--info:active { color: #fff; background-color: #004483; }
+
+.root[data-is-touch] .button--info.active svg path, .root[data-is-touch] .button--info:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--info.focus { color: default; background-color: #006cd0; box-shadow: 0 0 0 2px rgba(0, 108, 208, 0.4); }
+
+.root[data-is-touch] .button--info.focus svg path { fill: default; }
+
+.button--info.disabled, .button--info:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #1890ff !important; }
+
+.button--info.disabled svg path, .button--info:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.button--warning { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--warning svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--warning, .button--warning:link, .button--warning:visited { color: #fff; background-color: #fa8c16; }
+
+.button--warning svg path, .button--warning:link svg path, .button--warning:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .button--warning:hover { color: #fff; background-color: #c46804; }
+
+.root[data-is-touch="false"] .button--warning:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--warning.active, .root[data-is-touch] .button--warning:active { color: #fff; background-color: #794003; }
+
+.root[data-is-touch] .button--warning.active svg path, .root[data-is-touch] .button--warning:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--warning.focus { color: default; background-color: #c46804; box-shadow: 0 0 0 2px rgba(196, 104, 4, 0.4); }
+
+.root[data-is-touch] .button--warning.focus svg path { fill: default; }
+
+.button--warning.disabled, .button--warning:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #fa8c16 !important; }
+
+.button--warning.disabled svg path, .button--warning:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.button--error { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--error svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--error, .button--error:link, .button--error:visited { color: #fff; background-color: #f5222d; }
+
+.button--error svg path, .button--error:link svg path, .button--error:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .button--error:hover { color: #fff; background-color: #c70913; }
+
+.root[data-is-touch="false"] .button--error:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--error.active, .root[data-is-touch] .button--error:active { color: #fff; background-color: #7d060c; }
+
+.root[data-is-touch] .button--error.active svg path, .root[data-is-touch] .button--error:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--error.focus { color: default; background-color: #c70913; box-shadow: 0 0 0 2px rgba(199, 9, 19, 0.4); }
+
+.root[data-is-touch] .button--error.focus svg path { fill: default; }
+
+.button--error.disabled, .button--error:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #f5222d !important; }
+
+.button--error.disabled svg path, .button--error:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.button--theme-light { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--theme-light svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--theme-light, .button--theme-light:link, .button--theme-light:visited { color: rgba(255, 255, 255, 0.95); background-color: rgba(0, 0, 0, 0.9); }
+
+.button--theme-light svg path, .button--theme-light:link svg path, .button--theme-light:visited svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch="false"] .button--theme-light:hover { color: rgba(255, 255, 255, 0.95); background-color: rgba(46, 46, 46, 0.9); }
+
+.root[data-is-touch="false"] .button--theme-light:hover svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .button--theme-light.active, .root[data-is-touch] .button--theme-light:active { color: rgba(255, 255, 255, 0.95); background-color: rgba(87, 87, 87, 0.9); }
+
+.root[data-is-touch] .button--theme-light.active svg path, .root[data-is-touch] .button--theme-light:active svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .button--theme-light.focus { color: default; background-color: rgba(46, 46, 46, 0.9); box-shadow: 0 0 0 2px rgba(46, 46, 46, 0.4); }
+
+.root[data-is-touch] .button--theme-light.focus svg path { fill: default; }
+
+.button--theme-light.disabled, .button--theme-light:disabled { color: rgba(255, 255, 255, 0.4) !important; background-color: rgba(0, 0, 0, 0.9) !important; }
+
+.button--theme-light.disabled svg path, .button--theme-light:disabled svg path { fill: rgba(255, 255, 255, 0.4) !important; }
+
+.button--theme-dark { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--theme-dark svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--theme-dark, .button--theme-dark:link, .button--theme-dark:visited { color: #222; background-color: rgba(255, 255, 255, 0.9); }
+
+.button--theme-dark svg path, .button--theme-dark:link svg path, .button--theme-dark:visited svg path { fill: #222; }
+
+.root[data-is-touch="false"] .button--theme-dark:hover { color: #222; background-color: rgba(219, 219, 219, 0.9); }
+
+.root[data-is-touch="false"] .button--theme-dark:hover svg path { fill: #222; }
+
+.root[data-is-touch] .button--theme-dark.active, .root[data-is-touch] .button--theme-dark:active { color: #222; background-color: rgba(181, 181, 181, 0.9); }
+
+.root[data-is-touch] .button--theme-dark.active svg path, .root[data-is-touch] .button--theme-dark:active svg path { fill: #222; }
+
+.root[data-is-touch] .button--theme-dark.focus { color: default; background-color: rgba(219, 219, 219, 0.9); box-shadow: 0 0 0 2px rgba(219, 219, 219, 0.4); }
+
+.root[data-is-touch] .button--theme-dark.focus svg path { fill: default; }
+
+.button--theme-dark.disabled, .button--theme-dark:disabled { color: rgba(34, 34, 34, 0.2) !important; background-color: rgba(255, 255, 255, 0.9) !important; }
+
+.button--theme-dark.disabled svg path, .button--theme-dark:disabled svg path { fill: rgba(34, 34, 34, 0.2) !important; }
+
+.button--outline-primary { color: #fc4d50; border: 1px solid #fc4d50; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-primary svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-primary, .button--outline-primary:link, .button--outline-primary:visited { color: #fc4d50; background-color: transparent; }
+
+.button--outline-primary svg path, .button--outline-primary:link svg path, .button--outline-primary:visited svg path { fill: #fc4d50; }
+
+.root[data-is-touch="false"] .button--outline-primary:hover { color: #fff; background-color: #fc4d50; }
+
+.root[data-is-touch="false"] .button--outline-primary:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-primary.active, .root[data-is-touch] .button--outline-primary:active { color: #fff; background-color: #f80408; }
+
+.root[data-is-touch] .button--outline-primary.active svg path, .root[data-is-touch] .button--outline-primary:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-primary.focus { color: default; background-color: #fc4d50; box-shadow: 0 0 0 2px rgba(252, 77, 80, 0.4); }
+
+.root[data-is-touch] .button--outline-primary.focus svg path { fill: default; }
+
+.button--outline-primary.disabled, .button--outline-primary:disabled { color: rgba(252, 77, 80, 0.2) !important; background-color: transparent !important; }
+
+.button--outline-primary.disabled svg path, .button--outline-primary:disabled svg path { fill: rgba(252, 77, 80, 0.2) !important; }
+
+.button--outline-secondary { color: #f2f2f2; border: 1px solid #f2f2f2; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-secondary svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-secondary, .button--outline-secondary:link, .button--outline-secondary:visited { color: #f2f2f2; background-color: transparent; }
+
+.button--outline-secondary svg path, .button--outline-secondary:link svg path, .button--outline-secondary:visited svg path { fill: #f2f2f2; }
+
+.root[data-is-touch="false"] .button--outline-secondary:hover { color: #333; background-color: #f2f2f2; }
+
+.root[data-is-touch="false"] .button--outline-secondary:hover svg path { fill: #333; }
+
+.root[data-is-touch] .button--outline-secondary.active, .root[data-is-touch] .button--outline-secondary:active { color: #333; background-color: #cccccc; }
+
+.root[data-is-touch] .button--outline-secondary.active svg path, .root[data-is-touch] .button--outline-secondary:active svg path { fill: #333; }
+
+.root[data-is-touch] .button--outline-secondary.focus { color: default; background-color: #f2f2f2; box-shadow: 0 0 0 2px rgba(242, 242, 242, 0.4); }
+
+.root[data-is-touch] .button--outline-secondary.focus svg path { fill: default; }
+
+.button--outline-secondary.disabled, .button--outline-secondary:disabled { color: rgba(242, 242, 242, 0.2) !important; background-color: transparent !important; }
+
+.button--outline-secondary.disabled svg path, .button--outline-secondary:disabled svg path { fill: rgba(242, 242, 242, 0.2) !important; }
+
+.button--outline-success { color: #52c41a; border: 1px solid #52c41a; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-success svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-success, .button--outline-success:link, .button--outline-success:visited { color: #52c41a; background-color: transparent; }
+
+.button--outline-success svg path, .button--outline-success:link svg path, .button--outline-success:visited svg path { fill: #52c41a; }
+
+.root[data-is-touch="false"] .button--outline-success:hover { color: #fff; background-color: #52c41a; }
+
+.root[data-is-touch="false"] .button--outline-success:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-success.active, .root[data-is-touch] .button--outline-success:active { color: #fff; background-color: #368011; }
+
+.root[data-is-touch] .button--outline-success.active svg path, .root[data-is-touch] .button--outline-success:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-success.focus { color: default; background-color: #52c41a; box-shadow: 0 0 0 2px rgba(82, 196, 26, 0.4); }
+
+.root[data-is-touch] .button--outline-success.focus svg path { fill: default; }
+
+.button--outline-success.disabled, .button--outline-success:disabled { color: rgba(82, 196, 26, 0.2) !important; background-color: transparent !important; }
+
+.button--outline-success.disabled svg path, .button--outline-success:disabled svg path { fill: rgba(82, 196, 26, 0.2) !important; }
+
+.button--outline-info { color: #1890ff; border: 1px solid #1890ff; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-info svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-info, .button--outline-info:link, .button--outline-info:visited { color: #1890ff; background-color: transparent; }
+
+.button--outline-info svg path, .button--outline-info:link svg path, .button--outline-info:visited svg path { fill: #1890ff; }
+
+.root[data-is-touch="false"] .button--outline-info:hover { color: #fff; background-color: #1890ff; }
+
+.root[data-is-touch="false"] .button--outline-info:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-info.active, .root[data-is-touch] .button--outline-info:active { color: #fff; background-color: #0069cb; }
+
+.root[data-is-touch] .button--outline-info.active svg path, .root[data-is-touch] .button--outline-info:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-info.focus { color: default; background-color: #1890ff; box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.4); }
+
+.root[data-is-touch] .button--outline-info.focus svg path { fill: default; }
+
+.button--outline-info.disabled, .button--outline-info:disabled { color: rgba(24, 144, 255, 0.2) !important; background-color: transparent !important; }
+
+.button--outline-info.disabled svg path, .button--outline-info:disabled svg path { fill: rgba(24, 144, 255, 0.2) !important; }
+
+.button--outline-warning { color: #fa8c16; border: 1px solid #fa8c16; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-warning svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-warning, .button--outline-warning:link, .button--outline-warning:visited { color: #fa8c16; background-color: transparent; }
+
+.button--outline-warning svg path, .button--outline-warning:link svg path, .button--outline-warning:visited svg path { fill: #fa8c16; }
+
+.root[data-is-touch="false"] .button--outline-warning:hover { color: #fff; background-color: #fa8c16; }
+
+.root[data-is-touch="false"] .button--outline-warning:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-warning.active, .root[data-is-touch] .button--outline-warning:active { color: #fff; background-color: #bf6504; }
+
+.root[data-is-touch] .button--outline-warning.active svg path, .root[data-is-touch] .button--outline-warning:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-warning.focus { color: default; background-color: #fa8c16; box-shadow: 0 0 0 2px rgba(250, 140, 22, 0.4); }
+
+.root[data-is-touch] .button--outline-warning.focus svg path { fill: default; }
+
+.button--outline-warning.disabled, .button--outline-warning:disabled { color: rgba(250, 140, 22, 0.2) !important; background-color: transparent !important; }
+
+.button--outline-warning.disabled svg path, .button--outline-warning:disabled svg path { fill: rgba(250, 140, 22, 0.2) !important; }
+
+.button--outline-error { color: #f5222d; border: 1px solid #f5222d; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-error svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-error, .button--outline-error:link, .button--outline-error:visited { color: #f5222d; background-color: transparent; }
+
+.button--outline-error svg path, .button--outline-error:link svg path, .button--outline-error:visited svg path { fill: #f5222d; }
+
+.root[data-is-touch="false"] .button--outline-error:hover { color: #fff; background-color: #f5222d; }
+
+.root[data-is-touch="false"] .button--outline-error:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-error.active, .root[data-is-touch] .button--outline-error:active { color: #fff; background-color: #c20912; }
+
+.root[data-is-touch] .button--outline-error.active svg path, .root[data-is-touch] .button--outline-error:active svg path { fill: #fff; }
+
+.root[data-is-touch] .button--outline-error.focus { color: default; background-color: #f5222d; box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.4); }
+
+.root[data-is-touch] .button--outline-error.focus svg path { fill: default; }
+
+.button--outline-error.disabled, .button--outline-error:disabled { color: rgba(245, 34, 45, 0.2) !important; background-color: transparent !important; }
+
+.button--outline-error.disabled svg path, .button--outline-error:disabled svg path { fill: rgba(245, 34, 45, 0.2) !important; }
+
+.button--outline-theme-light { color: rgba(0, 0, 0, 0.9); border: 1px solid rgba(0, 0, 0, 0.9); -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-theme-light svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-theme-light, .button--outline-theme-light:link, .button--outline-theme-light:visited { color: rgba(0, 0, 0, 0.9); background-color: transparent; }
+
+.button--outline-theme-light svg path, .button--outline-theme-light:link svg path, .button--outline-theme-light:visited svg path { fill: rgba(0, 0, 0, 0.9); }
+
+.root[data-is-touch="false"] .button--outline-theme-light:hover { color: rgba(255, 255, 255, 0.95); background-color: rgba(0, 0, 0, 0.9); }
+
+.root[data-is-touch="false"] .button--outline-theme-light:hover svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .button--outline-theme-light.active, .root[data-is-touch] .button--outline-theme-light:active { color: rgba(255, 255, 255, 0.95); background-color: rgba(41, 41, 41, 0.9); }
+
+.root[data-is-touch] .button--outline-theme-light.active svg path, .root[data-is-touch] .button--outline-theme-light:active svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .button--outline-theme-light.focus { color: default; background-color: rgba(0, 0, 0, 0.9); box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4); }
+
+.root[data-is-touch] .button--outline-theme-light.focus svg path { fill: default; }
+
+.button--outline-theme-light.disabled, .button--outline-theme-light:disabled { color: rgba(0, 0, 0, 0.4) !important; background-color: transparent !important; }
+
+.button--outline-theme-light.disabled svg path, .button--outline-theme-light:disabled svg path { fill: rgba(0, 0, 0, 0.4) !important; }
+
+.button--outline-theme-dark { color: rgba(255, 255, 255, 0.9); border: 1px solid rgba(255, 255, 255, 0.9); -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-theme-dark svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.button--outline-theme-dark, .button--outline-theme-dark:link, .button--outline-theme-dark:visited { color: rgba(255, 255, 255, 0.9); background-color: transparent; }
+
+.button--outline-theme-dark svg path, .button--outline-theme-dark:link svg path, .button--outline-theme-dark:visited svg path { fill: rgba(255, 255, 255, 0.9); }
+
+.root[data-is-touch="false"] .button--outline-theme-dark:hover { color: #222; background-color: rgba(255, 255, 255, 0.9); }
+
+.root[data-is-touch="false"] .button--outline-theme-dark:hover svg path { fill: #222; }
+
+.root[data-is-touch] .button--outline-theme-dark.active, .root[data-is-touch] .button--outline-theme-dark:active { color: #222; background-color: rgba(217, 217, 217, 0.9); }
+
+.root[data-is-touch] .button--outline-theme-dark.active svg path, .root[data-is-touch] .button--outline-theme-dark:active svg path { fill: #222; }
+
+.root[data-is-touch] .button--outline-theme-dark.focus { color: default; background-color: rgba(255, 255, 255, 0.9); box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.4); }
+
+.root[data-is-touch] .button--outline-theme-dark.focus svg path { fill: default; }
+
+.button--outline-theme-dark.disabled, .button--outline-theme-dark:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: transparent !important; }
+
+.button--outline-theme-dark.disabled svg path, .button--outline-theme-dark:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.button--pill { border-radius: 6rem; }
+
+.button--rounded { border-radius: 0.4rem; }
+
+.button--circle, .swiper__button { display: -webkit-inline-box; display: -webkit-inline-flex; display: -moz-inline-flex; display: -ms-inline-flexbox; display: inline-flex; -webkit-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; -moz-justify-content: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; -moz-align-items: center; align-items: center; border-radius: 50%; }
+
+.button--md, .button--pill, .button--rounded, .button--circle, .swiper__button { padding: 0.45rem 0.6333333333rem; font-size: 1rem; }
+
+.button--md.button--circle, .button--circle, .swiper__button { width: 1.9rem; height: 1.9rem; }
+
+.button--xs { padding: 0.25rem 0.4rem; font-size: 0.7rem; }
+
+.button--xs.button--circle, .button--xs.swiper__button { width: 1.2rem; height: 1.2rem; }
+
+.button--sm { padding: 0.325rem 0.5rem; font-size: 0.85rem; }
+
+.button--sm.button--circle, .button--sm.swiper__button { width: 1.5rem; height: 1.5rem; }
+
+.button--lg { padding: 0.525rem 0.7666666667rem; font-size: 1.25rem; }
+
+.button--lg.button--circle, .button--lg.swiper__button { width: 2.3rem; height: 2.3rem; }
+
+.button--xl { padding: 0.65rem 0.9333333333rem; font-size: 1.5rem; }
+
+.button--xl.button--circle, .button--xl.swiper__button { width: 2.8rem; height: 2.8rem; }
+
+.image { max-width: 100%; }
+
+.image--md, .image { width: 12rem; }
+
+.image--xl { width: 20em; }
+
+.image--lg { width: 16rem; }
+
+.image--sm { width: 8rem; }
+
+.image--xs { width: 4rem; }
+
+.card { max-width: 18rem; border-radius: 0.4rem; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.23), 0 1px 3px rgba(0, 0, 0, 0.08), 0 6px 12px rgba(0, 0, 0, 0.02); -webkit-transition: box-shadow 0.4s ease-in-out; transition: box-shadow 0.4s ease-in-out; }
+
+.card > :first-child { border-top-left-radius: 0.4rem; border-top-right-radius: 0.4rem; }
+
+.card > :last-child { border-bottom-right-radius: 0.4rem; border-bottom-left-radius: 0.4rem; }
+
+.cell > .card { max-width: unset; }
+
+.card__content { padding: 0.5rem 1rem; }
+
+.card__header, .card__header > a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.card__header, .card__header:link, .card__header:visited, .card__header > a, .card__header > a:link, .card__header > a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .card__header:hover, .root[data-is-touch="false"] .card__header > a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .card__header.active, .root[data-is-touch] .card__header:active, .root[data-is-touch] .card__header > a.active, .root[data-is-touch] .card__header > a:active { text-decoration: none; }
+
+.card__header, .card__header:link, .card__header:visited, .card__header > a, .card__header > a:link, .card__header > a:visited { color: #000; }
+
+.root[data-is-touch="false"] .card__header:hover, .root[data-is-touch="false"] .card__header > a:hover { color: #fc4d50; }
+
+.root[data-is-touch] .card__header.active, .root[data-is-touch] .card__header:active, .root[data-is-touch] .card__header > a.active, .root[data-is-touch] .card__header > a:active { color: #f80408; }
+
+.card__header.disabled, .card__header:disabled, .card__header > a.disabled, .card__header > a:disabled { color: rgba(0, 0, 0, 0.2) !important; }
+
+.card__image { position: relative; width: 100%; }
+
+.card__image > img { display: block; width: 100%; height: auto; border-radius: inherit; }
+
+.card__image > .overlay { position: absolute; width: 100%; max-height: 100%; padding: 0.5rem; }
+
+.card__image > .overlay a { text-decoration: none !important; }
+
+.card__image > .overlay, .card__image > .overlay--top { top: 0; bottom: auto; border-top-left-radius: inherit; border-top-right-radius: inherit; border-bottom-right-radius: 0; border-bottom-left-radius: 0; }
+
+.card__image > .overlay--bottom { top: auto; bottom: 0; border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: inherit; border-bottom-left-radius: inherit; }
+
+.card__image > .overlay--full { top: 0; bottom: 0; }
+
+.card__image > .overlay, .card__image > .overlay--dark { background-color: rgba(0, 0, 0, 0.4); }
+
+.card__image > .overlay--light { background: rgba(255, 255, 255, 0.4); }
+
+.card--clickable { cursor: pointer; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.root[data-is-touch="false"] .card--clickable:hover { box-shadow: 0 8px 16px rgba(0, 0, 0, 0.23), 0 2px 6px rgba(0, 0, 0, 0.08), 0 12px 24px rgba(0, 0, 0, 0.02); }
+
+.root[data-is-touch="false"] .card--clickable:hover .card__image > img { height: inherit; }
+
+.card--flat { box-shadow: none; }
+
+.card--flat .card__image > img { border-radius: 0.4rem; }
+
+.card--flat .card__content { padding-top: 0; padding-left: 0; }
+
+.gallery { height: 100%; display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-box-direction: normal; -webkit-box-orient: vertical; -webkit-flex-direction: column; -moz-flex-direction: column; -ms-flex-direction: column; flex-direction: column; }
+
+.gallery__swiper { -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; }
+
+.gallery-item { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; -moz-align-items: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; -moz-justify-content: center; justify-content: center; height: 100%; overflow: hidden; }
+
+.gallery-item__main { display: block; }
+
+.hero { background-position: 50% 50%; display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-box-direction: normal; -webkit-box-orient: vertical; -webkit-flex-direction: column; -moz-flex-direction: column; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; -moz-justify-content: center; justify-content: center; background-size: cover; }
+
+.hero h1 { font-size: 3.5rem; }
+
+.hero h2 { font-size: 2.5rem; }
+
+.hero h3 { font-size: 2rem; }
+
+.hero h4 { font-size: 1.75rem; }
+
+.hero h5 { font-size: 1.5rem; }
+
+.hero h6 { font-size: 1.5rem; }
+
+.hero p { font-size: 1.5rem; }
+
+@media (max-width: 1023px) { .hero h1 { font-size: 3rem; } .hero h2 { font-size: 2rem; } .hero h3 { font-size: 1.75rem; } .hero h4 { font-size: 1.5rem; } .hero h5 { font-size: 1.25rem; } .hero h6 { font-size: 1.25rem; } .hero p { font-size: 1.25rem; } }
+
+@media (max-width: 499px) { .hero h1 { font-size: 2rem; } .hero h2 { font-size: 1.5rem; } .hero h3 { font-size: 1.35rem; } .hero h4 { font-size: 1.15rem; } .hero h5 { font-size: 1rem; } .hero h6 { font-size: 1rem; } .hero p { font-size: 1rem; } }
+
+.hero--center { text-align: center; }
+
+.hero__content { margin: 3rem; }
+
+@media (max-width: 1023px) { .hero__content { margin: 3rem 1.5rem; } }
+
+@media (max-width: 499px) { .hero__content { margin: 1.5rem 1rem; } }
+
+.heros > .hero { margin: 3rem; }
+
+@media (max-width: 1023px) { .heros > .hero { margin: 1rem; } }
+
+@media (max-width: 499px) { .heros > .hero { margin: 0.5rem 0; } }
+
+.menu { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-flex-wrap: wrap; -moz-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-top: 0; margin-bottom: 0; -webkit-box-direction: normal; -webkit-box-orient: horizontal; -webkit-flex-direction: row; -moz-flex-direction: row; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; -moz-align-items: center; align-items: center; }
+
+.menu > li { margin-top: 0.25rem; margin-bottom: 0.25rem; margin-right: 0.25rem; list-style-type: none; }
+
+.menu > li:last-child { margin-right: 0; }
+
+.menu--vertical { -webkit-box-direction: normal; -webkit-box-orient: vertical; -webkit-flex-direction: column; -moz-flex-direction: column; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: normal; -ms-flex-align: normal; -webkit-align-items: normal; -moz-align-items: normal; align-items: normal; }
+
+.menu--vertical > li { margin-right: 0; }
+
+.menu--inline { display: -webkit-inline-box; display: -webkit-inline-flex; display: -moz-inline-flex; display: -ms-inline-flexbox; display: inline-flex; }
+
+.menu--center, .hero--center .menu { -webkit-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; -moz-justify-content: center; justify-content: center; }
+
+.menu--nowrap { -webkit-flex-wrap: nowrap; -moz-flex-wrap: nowrap; -ms-flex-wrap: none; flex-wrap: nowrap; }
+
+.menu--grow { -webkit-box-flex: 1; -webkit-flex-grow: 1; -moz-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; }
+
+.modal { position: fixed; top: 0; left: 0; z-index: 999; width: 100%; height: 100%; color: rgba(255, 255, 255, 0.95); touch-action: none; background-color: rgba(0, 0, 0, 0.9); opacity: 0; -webkit-transform: translate(100%, 0); transform: translate(100%, 0); -webkit-transition: opacity 0.4s ease-in-out, transform 0s 0.4s ease-in-out; transition: opacity 0.4s ease-in-out, transform 0s 0.4s ease-in-out; }
+
+.modal--show { opacity: 1; -webkit-transform: translate(0, 0); transform: translate(0, 0); -webkit-transition: opacity 0.4s ease-in-out; transition: opacity 0.4s ease-in-out; }
+
+.modal--overflow { overflow: auto; -webkit-overflow-scrolling: touch; }
+
+ul.toc { display: block; margin: 0; color: #222; list-style-type: none; }
+
+ul.toc > li { margin: 0.125rem 0; }
+
+ul.toc > li a { display: inline-block; margin: 0.0625rem 0; text-decoration: none !important; }
+
+ul.toc .toc-h1 a, ul.toc .toc-h2 a, ul.toc .toc-h3 a, ul.toc .toc-h4 a, ul.toc .toc-h5 a, ul.toc .toc-h6 a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+ul.toc .toc-h1 a, ul.toc .toc-h1 a:link, ul.toc .toc-h1 a:visited, ul.toc .toc-h2 a, ul.toc .toc-h2 a:link, ul.toc .toc-h2 a:visited, ul.toc .toc-h3 a, ul.toc .toc-h3 a:link, ul.toc .toc-h3 a:visited, ul.toc .toc-h4 a, ul.toc .toc-h4 a:link, ul.toc .toc-h4 a:visited, ul.toc .toc-h5 a, ul.toc .toc-h5 a:link, ul.toc .toc-h5 a:visited, ul.toc .toc-h6 a, ul.toc .toc-h6 a:link, ul.toc .toc-h6 a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] ul.toc .toc-h1 a:hover, .root[data-is-touch="false"] ul.toc .toc-h2 a:hover, .root[data-is-touch="false"] ul.toc .toc-h3 a:hover, .root[data-is-touch="false"] ul.toc .toc-h4 a:hover, .root[data-is-touch="false"] ul.toc .toc-h5 a:hover, .root[data-is-touch="false"] ul.toc .toc-h6 a:hover { text-decoration: underline; }
+
+.root[data-is-touch] ul.toc .toc-h1 a.active, .root[data-is-touch] ul.toc .toc-h1 a:active, .root[data-is-touch] ul.toc .toc-h2 a.active, .root[data-is-touch] ul.toc .toc-h2 a:active, .root[data-is-touch] ul.toc .toc-h3 a.active, .root[data-is-touch] ul.toc .toc-h3 a:active, .root[data-is-touch] ul.toc .toc-h4 a.active, .root[data-is-touch] ul.toc .toc-h4 a:active, .root[data-is-touch] ul.toc .toc-h5 a.active, .root[data-is-touch] ul.toc .toc-h5 a:active, .root[data-is-touch] ul.toc .toc-h6 a.active, .root[data-is-touch] ul.toc .toc-h6 a:active { text-decoration: none; }
+
+ul.toc .toc-h1 a, ul.toc .toc-h1 a:link, ul.toc .toc-h1 a:visited, ul.toc .toc-h2 a, ul.toc .toc-h2 a:link, ul.toc .toc-h2 a:visited, ul.toc .toc-h3 a, ul.toc .toc-h3 a:link, ul.toc .toc-h3 a:visited, ul.toc .toc-h4 a, ul.toc .toc-h4 a:link, ul.toc .toc-h4 a:visited, ul.toc .toc-h5 a, ul.toc .toc-h5 a:link, ul.toc .toc-h5 a:visited, ul.toc .toc-h6 a, ul.toc .toc-h6 a:link, ul.toc .toc-h6 a:visited { color: #222; }
+
+.root[data-is-touch="false"] ul.toc .toc-h1 a:hover, .root[data-is-touch="false"] ul.toc .toc-h2 a:hover, .root[data-is-touch="false"] ul.toc .toc-h3 a:hover, .root[data-is-touch="false"] ul.toc .toc-h4 a:hover, .root[data-is-touch="false"] ul.toc .toc-h5 a:hover, .root[data-is-touch="false"] ul.toc .toc-h6 a:hover { color: #fc4d50; }
+
+.root[data-is-touch] ul.toc .toc-h1 a.active, .root[data-is-touch] ul.toc .toc-h1 a:active, .root[data-is-touch] ul.toc .toc-h2 a.active, .root[data-is-touch] ul.toc .toc-h2 a:active, .root[data-is-touch] ul.toc .toc-h3 a.active, .root[data-is-touch] ul.toc .toc-h3 a:active, .root[data-is-touch] ul.toc .toc-h4 a.active, .root[data-is-touch] ul.toc .toc-h4 a:active, .root[data-is-touch] ul.toc .toc-h5 a.active, .root[data-is-touch] ul.toc .toc-h5 a:active, .root[data-is-touch] ul.toc .toc-h6 a.active, .root[data-is-touch] ul.toc .toc-h6 a:active { color: #f80408; }
+
+ul.toc .toc-h1 a.disabled, ul.toc .toc-h1 a:disabled, ul.toc .toc-h2 a.disabled, ul.toc .toc-h2 a:disabled, ul.toc .toc-h3 a.disabled, ul.toc .toc-h3 a:disabled, ul.toc .toc-h4 a.disabled, ul.toc .toc-h4 a:disabled, ul.toc .toc-h5 a.disabled, ul.toc .toc-h5 a:disabled, ul.toc .toc-h6 a.disabled, ul.toc .toc-h6 a:disabled { color: rgba(34, 34, 34, 0.2) !important; }
+
+ul.toc .toc-h1.active a, ul.toc .toc-h2.active a, ul.toc .toc-h3.active a, ul.toc .toc-h4.active a, ul.toc .toc-h5.active a, ul.toc .toc-h6.active a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+ul.toc .toc-h1.active a, ul.toc .toc-h1.active a:link, ul.toc .toc-h1.active a:visited, ul.toc .toc-h2.active a, ul.toc .toc-h2.active a:link, ul.toc .toc-h2.active a:visited, ul.toc .toc-h3.active a, ul.toc .toc-h3.active a:link, ul.toc .toc-h3.active a:visited, ul.toc .toc-h4.active a, ul.toc .toc-h4.active a:link, ul.toc .toc-h4.active a:visited, ul.toc .toc-h5.active a, ul.toc .toc-h5.active a:link, ul.toc .toc-h5.active a:visited, ul.toc .toc-h6.active a, ul.toc .toc-h6.active a:link, ul.toc .toc-h6.active a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] ul.toc .toc-h1.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h2.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h3.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h4.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h5.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h6.active a:hover { text-decoration: underline; }
+
+.root[data-is-touch] ul.toc .toc-h1.active a.active, .root[data-is-touch] ul.toc .toc-h1.active a:active, .root[data-is-touch] ul.toc .toc-h2.active a.active, .root[data-is-touch] ul.toc .toc-h2.active a:active, .root[data-is-touch] ul.toc .toc-h3.active a.active, .root[data-is-touch] ul.toc .toc-h3.active a:active, .root[data-is-touch] ul.toc .toc-h4.active a.active, .root[data-is-touch] ul.toc .toc-h4.active a:active, .root[data-is-touch] ul.toc .toc-h5.active a.active, .root[data-is-touch] ul.toc .toc-h5.active a:active, .root[data-is-touch] ul.toc .toc-h6.active a.active, .root[data-is-touch] ul.toc .toc-h6.active a:active { text-decoration: none; }
+
+ul.toc .toc-h1.active a, ul.toc .toc-h1.active a:link, ul.toc .toc-h1.active a:visited, ul.toc .toc-h2.active a, ul.toc .toc-h2.active a:link, ul.toc .toc-h2.active a:visited, ul.toc .toc-h3.active a, ul.toc .toc-h3.active a:link, ul.toc .toc-h3.active a:visited, ul.toc .toc-h4.active a, ul.toc .toc-h4.active a:link, ul.toc .toc-h4.active a:visited, ul.toc .toc-h5.active a, ul.toc .toc-h5.active a:link, ul.toc .toc-h5.active a:visited, ul.toc .toc-h6.active a, ul.toc .toc-h6.active a:link, ul.toc .toc-h6.active a:visited { color: #fc4d50; }
+
+.root[data-is-touch="false"] ul.toc .toc-h1.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h2.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h3.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h4.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h5.active a:hover, .root[data-is-touch="false"] ul.toc .toc-h6.active a:hover { color: #fb070b; }
+
+.root[data-is-touch] ul.toc .toc-h1.active a.active, .root[data-is-touch] ul.toc .toc-h1.active a:active, .root[data-is-touch] ul.toc .toc-h2.active a.active, .root[data-is-touch] ul.toc .toc-h2.active a:active, .root[data-is-touch] ul.toc .toc-h3.active a.active, .root[data-is-touch] ul.toc .toc-h3.active a:active, .root[data-is-touch] ul.toc .toc-h4.active a.active, .root[data-is-touch] ul.toc .toc-h4.active a:active, .root[data-is-touch] ul.toc .toc-h5.active a.active, .root[data-is-touch] ul.toc .toc-h5.active a:active, .root[data-is-touch] ul.toc .toc-h6.active a.active, .root[data-is-touch] ul.toc .toc-h6.active a:active { color: #b20306; }
+
+ul.toc .toc-h1.active a.disabled, ul.toc .toc-h1.active a:disabled, ul.toc .toc-h2.active a.disabled, ul.toc .toc-h2.active a:disabled, ul.toc .toc-h3.active a.disabled, ul.toc .toc-h3.active a:disabled, ul.toc .toc-h4.active a.disabled, ul.toc .toc-h4.active a:disabled, ul.toc .toc-h5.active a.disabled, ul.toc .toc-h5.active a:disabled, ul.toc .toc-h6.active a.disabled, ul.toc .toc-h6.active a:disabled { color: rgba(252, 77, 80, 0.2) !important; }
+
+ul.toc .toc-h2, ul.toc .toc-h2 a, ul.toc .toc-h3, ul.toc .toc-h3 a, ul.toc .toc-h4, ul.toc .toc-h4 a, ul.toc .toc-h5, ul.toc .toc-h5 a, ul.toc .toc-h6, ul.toc .toc-h6 a { font-size: 0.7rem; font-weight: 400; line-height: 1.2; }
+
+ul.toc .toc-h1 { border: 0 solid #e6e6e6; border-bottom-width: 1px; padding: 0.5rem 0 0.25rem 0; margin-bottom: 0.5rem; color: #000; }
+
+ul.toc .toc-h1, ul.toc .toc-h1 a { font-size: 0.85rem; font-weight: 700; line-height: 1.4; }
+
+ul.toc .toc-h1 a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+ul.toc .toc-h1 a, ul.toc .toc-h1 a:link, ul.toc .toc-h1 a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] ul.toc .toc-h1 a:hover { text-decoration: underline; }
+
+.root[data-is-touch] ul.toc .toc-h1 a.active, .root[data-is-touch] ul.toc .toc-h1 a:active { text-decoration: none; }
+
+ul.toc .toc-h1 a, ul.toc .toc-h1 a:link, ul.toc .toc-h1 a:visited { color: #000; }
+
+.root[data-is-touch="false"] ul.toc .toc-h1 a:hover { color: #fc4d50; }
+
+.root[data-is-touch] ul.toc .toc-h1 a.active, .root[data-is-touch] ul.toc .toc-h1 a:active { color: #f80408; }
+
+ul.toc .toc-h1 a.disabled, ul.toc .toc-h1 a:disabled { color: rgba(0, 0, 0, 0.2) !important; }
+
+ul.toc .toc-h2, ul.toc .toc-h2 a { font-weight: 700; }
+
+ul.toc .toc-h3 { margin-left: 1rem; }
+
+ul.toc .toc-h4 { margin-left: 2rem; }
+
+ul.toc .toc-h5, ul.toc .toc-h6 { margin-left: 3rem; }
+
+ul.toc .toc-h6 { color: #888; }
+
+ul.toc .toc-h6 a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+ul.toc .toc-h6 a, ul.toc .toc-h6 a:link, ul.toc .toc-h6 a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] ul.toc .toc-h6 a:hover { text-decoration: underline; }
+
+.root[data-is-touch] ul.toc .toc-h6 a.active, .root[data-is-touch] ul.toc .toc-h6 a:active { text-decoration: none; }
+
+ul.toc .toc-h6 a, ul.toc .toc-h6 a:link, ul.toc .toc-h6 a:visited { color: #888; }
+
+.root[data-is-touch="false"] ul.toc .toc-h6 a:hover { color: #fc4d50; }
+
+.root[data-is-touch] ul.toc .toc-h6 a.active, .root[data-is-touch] ul.toc .toc-h6 a:active { color: #f80408; }
+
+ul.toc .toc-h6 a.disabled, ul.toc .toc-h6 a:disabled { color: rgba(136, 136, 136, 0.2) !important; }
+
+ul.toc--ellipsis > li { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+
+ul.toc--navigator > li a { padding-left: 0.5rem; margin: 0.25rem 0; }
+
+ul.toc--navigator > li.active a { margin-left: -4px; border: 0 solid #fc4d50; border-left-width: 4px; }
+
+ul.toc--navigator .toc-h2, ul.toc--navigator .toc-h3, ul.toc--navigator .toc-h4 { color: #888; }
+
+ul.toc--navigator .toc-h2 a, ul.toc--navigator .toc-h3 a, ul.toc--navigator .toc-h4 a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+ul.toc--navigator .toc-h2 a, ul.toc--navigator .toc-h2 a:link, ul.toc--navigator .toc-h2 a:visited, ul.toc--navigator .toc-h3 a, ul.toc--navigator .toc-h3 a:link, ul.toc--navigator .toc-h3 a:visited, ul.toc--navigator .toc-h4 a, ul.toc--navigator .toc-h4 a:link, ul.toc--navigator .toc-h4 a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] ul.toc--navigator .toc-h2 a:hover, .root[data-is-touch="false"] ul.toc--navigator .toc-h3 a:hover, .root[data-is-touch="false"] ul.toc--navigator .toc-h4 a:hover { text-decoration: underline; }
+
+.root[data-is-touch] ul.toc--navigator .toc-h2 a.active, .root[data-is-touch] ul.toc--navigator .toc-h2 a:active, .root[data-is-touch] ul.toc--navigator .toc-h3 a.active, .root[data-is-touch] ul.toc--navigator .toc-h3 a:active, .root[data-is-touch] ul.toc--navigator .toc-h4 a.active, .root[data-is-touch] ul.toc--navigator .toc-h4 a:active { text-decoration: none; }
+
+ul.toc--navigator .toc-h2 a, ul.toc--navigator .toc-h2 a:link, ul.toc--navigator .toc-h2 a:visited, ul.toc--navigator .toc-h3 a, ul.toc--navigator .toc-h3 a:link, ul.toc--navigator .toc-h3 a:visited, ul.toc--navigator .toc-h4 a, ul.toc--navigator .toc-h4 a:link, ul.toc--navigator .toc-h4 a:visited { color: #888; }
+
+.root[data-is-touch="false"] ul.toc--navigator .toc-h2 a:hover, .root[data-is-touch="false"] ul.toc--navigator .toc-h3 a:hover, .root[data-is-touch="false"] ul.toc--navigator .toc-h4 a:hover { color: #646464; }
+
+.root[data-is-touch] ul.toc--navigator .toc-h2 a.active, .root[data-is-touch] ul.toc--navigator .toc-h2 a:active, .root[data-is-touch] ul.toc--navigator .toc-h3 a.active, .root[data-is-touch] ul.toc--navigator .toc-h3 a:active, .root[data-is-touch] ul.toc--navigator .toc-h4 a.active, .root[data-is-touch] ul.toc--navigator .toc-h4 a:active { color: #3e3e3e; }
+
+ul.toc--navigator .toc-h2 a.disabled, ul.toc--navigator .toc-h2 a:disabled, ul.toc--navigator .toc-h3 a.disabled, ul.toc--navigator .toc-h3 a:disabled, ul.toc--navigator .toc-h4 a.disabled, ul.toc--navigator .toc-h4 a:disabled { color: rgba(136, 136, 136, 0.2) !important; }
+
+ul.toc--navigator .toc-h1 { color: #222; }
+
+ul.toc--navigator .toc-h1, ul.toc--navigator .toc-h1 a { font-size: 1rem; line-height: 1.6; }
+
+ul.toc--navigator .toc-h1 a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+ul.toc--navigator .toc-h1 a, ul.toc--navigator .toc-h1 a:link, ul.toc--navigator .toc-h1 a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] ul.toc--navigator .toc-h1 a:hover { text-decoration: underline; }
+
+.root[data-is-touch] ul.toc--navigator .toc-h1 a.active, .root[data-is-touch] ul.toc--navigator .toc-h1 a:active { text-decoration: none; }
+
+ul.toc--navigator .toc-h1 a, ul.toc--navigator .toc-h1 a:link, ul.toc--navigator .toc-h1 a:visited { color: #000; }
+
+.root[data-is-touch="false"] ul.toc--navigator .toc-h1 a:hover { color: #2e2e2e; }
+
+.root[data-is-touch] ul.toc--navigator .toc-h1 a.active, .root[data-is-touch] ul.toc--navigator .toc-h1 a:active { color: #575757; }
+
+ul.toc--navigator .toc-h1 a.disabled, ul.toc--navigator .toc-h1 a:disabled { color: rgba(0, 0, 0, 0.4) !important; }
+
+ul.toc--navigator .toc-h2, ul.toc--navigator .toc-h2 a { font-size: 0.85rem; font-weight: 700; line-height: 1.4; }
+
+.item { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; }
+
+@media (max-width: 499px) { .item { -webkit-box-direction: normal; -webkit-box-orient: vertical; -webkit-flex-direction: column; -moz-flex-direction: column; -ms-flex-direction: column; flex-direction: column; } }
+
+.item__image { margin-right: 1rem; }
+
+.item__image + .item__content > :first-child { margin-top: 0; }
+
+.item__image + .item__content > :first-child > :first-child { margin-top: 0; }
+
+@media (max-width: 499px) { .item__image { margin-right: 0; } }
+
+.item__content { -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; min-width: 0; }
+
+a > .item__header, a.item__header, .item__header > a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+a > .item__header, a > .item__header:link, a > .item__header:visited, a.item__header, a.item__header:link, a.item__header:visited, .item__header > a, .item__header > a:link, .item__header > a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] a > .item__header:hover, .root[data-is-touch="false"] a.item__header:hover, .root[data-is-touch="false"] .item__header > a:hover { text-decoration: underline; }
+
+.root[data-is-touch] a > .item__header.active, .root[data-is-touch] a > .item__header:active, .root[data-is-touch] a.item__header.active, .root[data-is-touch] a.item__header:active, .root[data-is-touch] .item__header > a.active, .root[data-is-touch] .item__header > a:active { text-decoration: none; }
+
+a > .item__header, a > .item__header:link, a > .item__header:visited, a.item__header, a.item__header:link, a.item__header:visited, .item__header > a, .item__header > a:link, .item__header > a:visited { color: #000; }
+
+.root[data-is-touch="false"] a > .item__header:hover, .root[data-is-touch="false"] a.item__header:hover, .root[data-is-touch="false"] .item__header > a:hover { color: #fc4d50; }
+
+.root[data-is-touch] a > .item__header.active, .root[data-is-touch] a > .item__header:active, .root[data-is-touch] a.item__header.active, .root[data-is-touch] a.item__header:active, .root[data-is-touch] .item__header > a.active, .root[data-is-touch] .item__header > a:active { color: #f80408; }
+
+a > .item__header.disabled, a > .item__header:disabled, a.item__header.disabled, a.item__header:disabled, .item__header > a.disabled, .item__header > a:disabled { color: rgba(0, 0, 0, 0.2) !important; }
+
+.item__meta { color: #888; }
+
+.item__description, .item__description .article__content { font-size: 0.85rem; line-height: 1.6; }
+
+.item__description h1, .item__description h2, .item__description h3, .item__description h4, .item__description h5, .item__description h6, .item__description p, .item__description hr, .item__description blockquote, .item__description figure, .item__description pre, .item__description .highlighter-rouge, .item__description ul, .item__description ol, .item__description dl, .item__description table, .item__description .footnotes, .item__description .article__content h1, .item__description .article__content h2, .item__description .article__content h3, .item__description .article__content h4, .item__description .article__content h5, .item__description .article__content h6, .item__description .article__content p, .item__description .article__content hr, .item__description .article__content blockquote, .item__description .article__content figure, .item__description .article__content pre, .item__description .article__content .highlighter-rouge, .item__description .article__content ul, .item__description .article__content ol, .item__description .article__content dl, .item__description .article__content table, .item__description .article__content .footnotes { margin-top: 0.5rem; margin-bottom: 0.5rem; }
+
+.item__description h1, .item__description h2, .item__description h3, .item__description h4, .item__description h5, .item__description h6, .item__description .article__content h1, .item__description .article__content h2, .item__description .article__content h3, .item__description .article__content h4, .item__description .article__content h5, .item__description .article__content h6 { margin-top: 1rem; }
+
+.item__description h1, .item__description h2, .item__description h3, .item__description .article__content h1, .item__description .article__content h2, .item__description .article__content h3 { color: #222; }
+
+.item__description h1, .item__description h2, .item__description .article__content h1, .item__description .article__content h2 { padding: 0; border: none; }
+
+.item__description h1, .item__description .article__content h1 { font-size: 1.05rem; }
+
+.item__description h2, .item__description .article__content h2 { font-size: 1rem; }
+
+.item__description h3, .item__description .article__content h3 { font-size: 0.95rem; }
+
+.item__description h4, .item__description .article__content h4 { font-size: 0.9rem; }
+
+.item__description h5, .item__description .article__content h5 { font-size: 0.85rem; }
+
+.item__description h6, .item__description .article__content h6 { font-size: 0.85rem; }
+
+.item__description img, .item__description .article__content img { max-height: 32rem; }
+
+@media (max-width: 499px) { .item__description img, .item__description .article__content img { max-height: 14rem; } }
+
+.items > .item:not(:last-child) { margin-bottom: 0.5rem; }
+
+.items--divided > .item { list-style-type: none; }
+
+.items--divided > .item:not(:first-child) { padding-top: 1.5rem; }
+
+.items--divided > .item:not(:last-child) { padding-bottom: 1.5rem; border: 0 solid #e6e6e6; border-bottom-width: 1px; }
+
+.swiper { position: relative; overflow: hidden; }
+
+.swiper__wrapper, .swiper__slide { width: 100%; height: 100%; }
+
+.swiper__wrapper { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; }
+
+.swiper__wrapper--animation { -webkit-transition: transform 0.4s ease-in-out; transition: transform 0.4s ease-in-out; }
+
+.swiper__slide { -webkit-flex-shrink: 0; -moz-flex-shrink: 0; -ms-flex-negative: 0; flex-shrink: 0; }
+
+.swiper__slide > img { max-width: 100%; }
+
+.swiper__button { position: absolute; top: 50%; -webkit-transform: translate(0, -50%); transform: translate(0, -50%); -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.swiper__button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.swiper__button, .swiper__button:link, .swiper__button:visited { color: #000; background-color: rgba(242, 242, 242, 0.4); }
+
+.swiper__button svg path, .swiper__button:link svg path, .swiper__button:visited svg path { fill: #000; }
+
+.root[data-is-touch="false"] .swiper__button:hover { color: #000; background-color: rgba(206, 206, 206, 0.4); }
+
+.root[data-is-touch="false"] .swiper__button:hover svg path { fill: #000; }
+
+.root[data-is-touch] .swiper__button.active, .root[data-is-touch] .swiper__button:active { color: #000; background-color: rgba(168, 168, 168, 0.4); }
+
+.root[data-is-touch] .swiper__button.active svg path, .root[data-is-touch] .swiper__button:active svg path { fill: #000; }
+
+.root[data-is-touch] .swiper__button.focus { color: default; background-color: rgba(206, 206, 206, 0.4); box-shadow: 0 0 0 2px rgba(206, 206, 206, 0.4); }
+
+.root[data-is-touch] .swiper__button.focus svg path { fill: default; }
+
+.swiper__button.disabled, .swiper__button:disabled { color: rgba(0, 0, 0, 0.2) !important; background-color: rgba(242, 242, 242, 0.4) !important; }
+
+.swiper__button.disabled svg path, .swiper__button:disabled svg path { fill: rgba(0, 0, 0, 0.2) !important; }
+
+.swiper--light .swiper__button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.swiper--light .swiper__button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.swiper--light .swiper__button, .swiper--light .swiper__button:link, .swiper--light .swiper__button:visited { color: #222; background-color: rgba(255, 255, 255, 0.4); }
+
+.swiper--light .swiper__button svg path, .swiper--light .swiper__button:link svg path, .swiper--light .swiper__button:visited svg path { fill: #222; }
+
+.root[data-is-touch="false"] .swiper--light .swiper__button:hover { color: #222; background-color: rgba(219, 219, 219, 0.4); }
+
+.root[data-is-touch="false"] .swiper--light .swiper__button:hover svg path { fill: #222; }
+
+.root[data-is-touch] .swiper--light .swiper__button.active, .root[data-is-touch] .swiper--light .swiper__button:active { color: #222; background-color: rgba(181, 181, 181, 0.4); }
+
+.root[data-is-touch] .swiper--light .swiper__button.active svg path, .root[data-is-touch] .swiper--light .swiper__button:active svg path { fill: #222; }
+
+.root[data-is-touch] .swiper--light .swiper__button.focus { color: default; background-color: rgba(219, 219, 219, 0.4); box-shadow: 0 0 0 2px rgba(219, 219, 219, 0.4); }
+
+.root[data-is-touch] .swiper--light .swiper__button.focus svg path { fill: default; }
+
+.swiper--light .swiper__button.disabled, .swiper--light .swiper__button:disabled { color: rgba(34, 34, 34, 0.2) !important; background-color: rgba(255, 255, 255, 0.4) !important; }
+
+.swiper--light .swiper__button.disabled svg path, .swiper--light .swiper__button:disabled svg path { fill: rgba(34, 34, 34, 0.2) !important; }
+
+.swiper--dark .swiper__button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.swiper--dark .swiper__button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.swiper--dark .swiper__button, .swiper--dark .swiper__button:link, .swiper--dark .swiper__button:visited { color: rgba(255, 255, 255, 0.95); background-color: rgba(0, 0, 0, 0.4); }
+
+.swiper--dark .swiper__button svg path, .swiper--dark .swiper__button:link svg path, .swiper--dark .swiper__button:visited svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch="false"] .swiper--dark .swiper__button:hover { color: rgba(255, 255, 255, 0.95); background-color: rgba(46, 46, 46, 0.4); }
+
+.root[data-is-touch="false"] .swiper--dark .swiper__button:hover svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .swiper--dark .swiper__button.active, .root[data-is-touch] .swiper--dark .swiper__button:active { color: rgba(255, 255, 255, 0.95); background-color: rgba(87, 87, 87, 0.4); }
+
+.root[data-is-touch] .swiper--dark .swiper__button.active svg path, .root[data-is-touch] .swiper--dark .swiper__button:active svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .swiper--dark .swiper__button.focus { color: default; background-color: rgba(46, 46, 46, 0.4); box-shadow: 0 0 0 2px rgba(46, 46, 46, 0.4); }
+
+.root[data-is-touch] .swiper--dark .swiper__button.focus svg path { fill: default; }
+
+.swiper--dark .swiper__button.disabled, .swiper--dark .swiper__button:disabled { color: rgba(255, 255, 255, 0.4) !important; background-color: rgba(0, 0, 0, 0.4) !important; }
+
+.swiper--dark .swiper__button.disabled svg path, .swiper--dark .swiper__button:disabled svg path { fill: rgba(255, 255, 255, 0.4) !important; }
+
+.swiper__button--prev { left: 10px; }
+
+.swiper__button--next { right: 10px; }
+
+@-webkit-keyframes fade-in { from { opacity: 0; }
+  to { opacity: 1; } }
+
+@keyframes fade-in { from { opacity: 0; }
+  to { opacity: 1; } }
+
+@-webkit-keyframes fade-in-down { from { opacity: 0;
+    -webkit-transform: translateY(-2rem);
+    transform: translateY(-2rem); }
+  to { opacity: 1;
+    -webkit-transform: translateY(0);
+    transform: translateY(0); } }
+
+@keyframes fade-in-down { from { opacity: 0;
+    -webkit-transform: translateY(-2rem);
+    transform: translateY(-2rem); }
+  to { opacity: 1;
+    -webkit-transform: translateY(0);
+    transform: translateY(0); } }
+
+@-webkit-keyframes fade-in-up { from { opacity: 0;
+    -webkit-transform: translateY(2rem);
+    transform: translateY(2rem); }
+  to { opacity: 1;
+    -webkit-transform: translateY(0);
+    transform: translateY(0); } }
+
+@keyframes fade-in-up { from { opacity: 0;
+    -webkit-transform: translateY(2rem);
+    transform: translateY(2rem); }
+  to { opacity: 1;
+    -webkit-transform: translateY(0);
+    transform: translateY(0); } }
+
+.main { width: 100%; max-width: 950px; padding: 0 3rem; margin: 0 auto; }
+
+@media (max-width: 1023px) { .main { padding: 0 1.5rem; } }
+
+@media (max-width: 499px) { .main { padding: 0 1rem; } }
+
+.has-aside .main { max-width: 1170px; }
+
+@media (max-width: 1023px) { .has-aside .main { max-width: 950px; } }
+
+.full-width .main { width: 100%; max-width: 100%; }
+
+.header { background: #f2f2f2; }
+
+.header a { font-weight: 400; text-decoration: none !important; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.header a, .header a:link, .header a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .header a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .header a.active, .root[data-is-touch] .header a:active { text-decoration: none; }
+
+.header a, .header a:link, .header a:visited { color: #333; }
+
+.root[data-is-touch="false"] .header a:hover { color: #fc4d50; }
+
+.root[data-is-touch] .header a.active, .root[data-is-touch] .header a:active { color: #f80408; }
+
+.header a.disabled, .header a:disabled { color: rgba(51, 51, 51, 0.2) !important; }
+
+.header .main { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; }
+
+@media (max-width: 499px) { .header .main { -webkit-box-direction: normal; -webkit-box-orient: vertical; -webkit-flex-direction: column; -moz-flex-direction: column; -ms-flex-direction: column; flex-direction: column; } }
+
+.header--dark { background: rgba(0, 0, 0, 0.15); }
+
+.header--dark .navigation__item--active::after { border: 0 solid rgba(255, 255, 255, 0.95); border-bottom-width: 4px; }
+
+.header--light { background: rgba(255, 255, 255, 0.15); }
+
+.header--light .navigation__item--active::after { border: 0 solid #222; border-bottom-width: 4px; }
+
+.header__title { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-flex-wrap: wrap; -moz-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-top: 0; margin-bottom: 0; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; -moz-align-items: center; align-items: center; -webkit-flex-wrap: nowrap; -moz-flex-wrap: nowrap; -ms-flex-wrap: none; flex-wrap: nowrap; -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; height: 5rem; margin-right: 1rem; white-space: nowrap; }
+
+.header__title > li { margin-top: 0; margin-bottom: 0; margin-right: 1rem; list-style-type: none; }
+
+.header__title > li:last-child { margin-right: 0; }
+
+@media (max-width: 499px) { .header__title { height: auto; margin-right: 0; } }
+
+.header__title > .header__brand { -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; }
+
+@media (max-width: 499px) { .header__title > .header__brand { height: 3rem; } }
+
+.header__title > .search-button { display: none; margin-left: 0.5rem; }
+
+@media (max-width: 499px) { .header__title > .search-button { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; } }
+
+.header__brand { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; -moz-align-items: center; align-items: center; }
+
+.header__brand > svg { width: 1.92rem; height: 1.92rem; margin-right: 1rem; vertical-align: middle; }
+
+@media (max-width: 499px) { .header__brand > svg { width: 1.44rem; height: 1.44rem; } }
+
+.header__brand > a { display: inline-block; font-size: 1.2rem; }
+
+.navigation { overflow: hidden; overflow-x: auto; -webkit-overflow-scrolling: touch; }
+
+.navigation > ul { height: 5rem; padding-bottom: 0; margin: 0; display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-flex-wrap: nowrap; -moz-flex-wrap: nowrap; -ms-flex-wrap: none; flex-wrap: nowrap; margin-top: 0; margin-bottom: 0; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; -moz-align-items: center; align-items: center; }
+
+@media (max-width: 499px) { .navigation > ul { padding-bottom: 4px; margin: -4px 0 0 0; } }
+
+.navigation > ul > li { margin-top: 0.5rem; margin-bottom: 0.5rem; margin-right: 1rem; list-style-type: none; }
+
+.navigation > ul > li:last-child { margin-right: 0; }
+
+@media (max-width: 499px) { .navigation > ul { height: auto; } }
+
+@media (max-width: 499px) { .navigation > ul .search-button { display: none; } }
+
+.navigation__item::after { display: block; margin-bottom: -4px; content: ""; border: 0 solid transparent; border-bottom-width: 4px; }
+
+.navigation__item--active a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.navigation__item--active a, .navigation__item--active a:link, .navigation__item--active a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .navigation__item--active a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .navigation__item--active a.active, .root[data-is-touch] .navigation__item--active a:active { text-decoration: none; }
+
+.navigation__item--active a, .navigation__item--active a:link, .navigation__item--active a:visited { color: #fc4d50; }
+
+.root[data-is-touch="false"] .navigation__item--active a:hover { color: #fc4d50; }
+
+.root[data-is-touch] .navigation__item--active a.active, .root[data-is-touch] .navigation__item--active a:active { color: #f80408; }
+
+.navigation__item--active a.disabled, .navigation__item--active a:disabled { color: rgba(252, 77, 80, 0.2) !important; }
+
+.navigation__item--active::after { border: 0 solid #fc4d50; border-bottom-width: 4px; }
+
+/** Site Info */
+.footer { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; -moz-align-items: center; align-items: center; color: #333; background: #f2f2f2; }
+
+.footer a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.footer a, .footer a:link, .footer a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .footer a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .footer a.active, .root[data-is-touch] .footer a:active { text-decoration: none; }
+
+.footer a, .footer a:link, .footer a:visited { color: #333; }
+
+.root[data-is-touch="false"] .footer a:hover { color: #fc4d50; }
+
+.root[data-is-touch] .footer a.active, .root[data-is-touch] .footer a:active { color: #f80408; }
+
+.footer a.disabled, .footer a:disabled { color: rgba(51, 51, 51, 0.2) !important; }
+
+.footer .site-info { font-size: 0.7rem; text-align: center; }
+
+.footer .site-info .menu { line-height: 1.2; }
+
+.footer .site-info .menu > *:not(:last-child) { border: 0 solid #333; border-right-width: 1px; padding-right: 0.25rem; margin-right: 0.25rem; }
+
+.footer__author-links { overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.footer__author-links .author-links { text-align: center; }
+
+.article-list .item__meta { padding: 0 1rem 0 0; font-family: Menlo, Monaco, Consolas, Andale Mono, lucida console, Courier New, monospace; font-size: 0.85rem; white-space: nowrap; }
+
+.article-list.grid--sm .card__header { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+
+.article-list__group-header { margin-top: 1rem; }
+
+.article__info { font-size: 0.85rem; color: #888; }
+
+.article__info .left-col { float: left; }
+
+@media (max-width: 499px) { .article__info .left-col { float: none; } }
+
+.article__info .right-col { float: right; margin-left: 0.5rem; }
+
+@media (max-width: 499px) { .article__info .right-col { float: none; } }
+
+.article__info .right-col > li:not(:last-child) { border: 0 solid #888; border-right-width: 1px; padding-right: 0.5rem; margin-right: 0.5rem; line-height: 1.2; }
+
+.article__header { margin-top: 3rem; margin-bottom: 1.5rem; }
+
+@media (max-width: 499px) { .article__header { margin-top: 1.5rem; } }
+
+.article__header header, .article__header h1 { display: inline; }
+
+.article__header h1 { word-wrap: break-word; }
+
+.article__header .split-space { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
+
+.article__header .edit-on-github { text-decoration: none !important; }
+
+.article__header--overlay .overlay { min-height: 36rem; padding-top: 6rem; padding-bottom: 6rem; }
+
+@media (max-width: 499px) { .article__header--overlay .overlay { min-height: 29rem; padding-top: 3rem; padding-bottom: 3rem; } }
+
+.article__header--overlay .overlay__excerpt { font-size: 2rem; font-weight: 700; }
+
+@media (max-width: 1023px) { .article__header--overlay .overlay__excerpt { font-size: 1.75rem; } }
+
+@media (max-width: 499px) { .article__header--overlay .overlay__excerpt { font-size: 1.35rem; } }
+
+.article__header--overlay .article__header { margin-top: 0; }
+
+.article__header--cover { width: 100%; }
+
+.article__content { line-height: 1.8; word-wrap: break-word; }
+
+@media print { .article__content { line-height: 1.6; } }
+
+.article__content h1, .article__content h2, .article__content h3, .article__content h4, .article__content h5, .article__content h6, .article__content p, .article__content hr, .article__content blockquote, .article__content figure, .article__content pre, .article__content .highlighter-rouge, .article__content ul, .article__content ol, .article__content dl, .article__content table, .article__content .footnotes { margin: 1rem 0; }
+
+@media print { .article__content h1, .article__content h2, .article__content h3, .article__content h4, .article__content h5, .article__content h6, .article__content p, .article__content hr, .article__content blockquote, .article__content figure, .article__content pre, .article__content .highlighter-rouge, .article__content ul, .article__content ol, .article__content dl, .article__content table, .article__content .footnotes { margin: 0.5rem 0; } }
+
+.article__content h1, .article__content h2, .article__content h3, .article__content h4, .article__content h5, .article__content h6 { position: relative; margin-top: 1.5rem; }
+
+@media print { .article__content h1, .article__content h2, .article__content h3, .article__content h4, .article__content h5, .article__content h6 { margin-top: 1rem; } }
+
+.article__content h1 > .anchor, .article__content h2 > .anchor, .article__content h3 > .anchor, .article__content h4 > .anchor, .article__content h5 > .anchor, .article__content h6 > .anchor { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; margin-left: 0.25rem; text-decoration: none; visibility: hidden; opacity: 0; }
+
+.article__content h1 > .anchor, .article__content h1 > .anchor:link, .article__content h1 > .anchor:visited, .article__content h2 > .anchor, .article__content h2 > .anchor:link, .article__content h2 > .anchor:visited, .article__content h3 > .anchor, .article__content h3 > .anchor:link, .article__content h3 > .anchor:visited, .article__content h4 > .anchor, .article__content h4 > .anchor:link, .article__content h4 > .anchor:visited, .article__content h5 > .anchor, .article__content h5 > .anchor:link, .article__content h5 > .anchor:visited, .article__content h6 > .anchor, .article__content h6 > .anchor:link, .article__content h6 > .anchor:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .article__content h1 > .anchor:hover, .root[data-is-touch="false"] .article__content h2 > .anchor:hover, .root[data-is-touch="false"] .article__content h3 > .anchor:hover, .root[data-is-touch="false"] .article__content h4 > .anchor:hover, .root[data-is-touch="false"] .article__content h5 > .anchor:hover, .root[data-is-touch="false"] .article__content h6 > .anchor:hover { text-decoration: underline; }
+
+.root[data-is-touch] .article__content h1 > .anchor.active, .root[data-is-touch] .article__content h1 > .anchor:active, .root[data-is-touch] .article__content h2 > .anchor.active, .root[data-is-touch] .article__content h2 > .anchor:active, .root[data-is-touch] .article__content h3 > .anchor.active, .root[data-is-touch] .article__content h3 > .anchor:active, .root[data-is-touch] .article__content h4 > .anchor.active, .root[data-is-touch] .article__content h4 > .anchor:active, .root[data-is-touch] .article__content h5 > .anchor.active, .root[data-is-touch] .article__content h5 > .anchor:active, .root[data-is-touch] .article__content h6 > .anchor.active, .root[data-is-touch] .article__content h6 > .anchor:active { text-decoration: none; }
+
+.article__content h1 > .anchor, .article__content h1 > .anchor:link, .article__content h1 > .anchor:visited, .article__content h2 > .anchor, .article__content h2 > .anchor:link, .article__content h2 > .anchor:visited, .article__content h3 > .anchor, .article__content h3 > .anchor:link, .article__content h3 > .anchor:visited, .article__content h4 > .anchor, .article__content h4 > .anchor:link, .article__content h4 > .anchor:visited, .article__content h5 > .anchor, .article__content h5 > .anchor:link, .article__content h5 > .anchor:visited, .article__content h6 > .anchor, .article__content h6 > .anchor:link, .article__content h6 > .anchor:visited { color: #cccccc; }
+
+.root[data-is-touch="false"] .article__content h1 > .anchor:hover, .root[data-is-touch="false"] .article__content h2 > .anchor:hover, .root[data-is-touch="false"] .article__content h3 > .anchor:hover, .root[data-is-touch="false"] .article__content h4 > .anchor:hover, .root[data-is-touch="false"] .article__content h5 > .anchor:hover, .root[data-is-touch="false"] .article__content h6 > .anchor:hover { color: #fc4d50; }
+
+.root[data-is-touch] .article__content h1 > .anchor.active, .root[data-is-touch] .article__content h1 > .anchor:active, .root[data-is-touch] .article__content h2 > .anchor.active, .root[data-is-touch] .article__content h2 > .anchor:active, .root[data-is-touch] .article__content h3 > .anchor.active, .root[data-is-touch] .article__content h3 > .anchor:active, .root[data-is-touch] .article__content h4 > .anchor.active, .root[data-is-touch] .article__content h4 > .anchor:active, .root[data-is-touch] .article__content h5 > .anchor.active, .root[data-is-touch] .article__content h5 > .anchor:active, .root[data-is-touch] .article__content h6 > .anchor.active, .root[data-is-touch] .article__content h6 > .anchor:active { color: #f80408; }
+
+.article__content h1 > .anchor.disabled, .article__content h1 > .anchor:disabled, .article__content h2 > .anchor.disabled, .article__content h2 > .anchor:disabled, .article__content h3 > .anchor.disabled, .article__content h3 > .anchor:disabled, .article__content h4 > .anchor.disabled, .article__content h4 > .anchor:disabled, .article__content h5 > .anchor.disabled, .article__content h5 > .anchor:disabled, .article__content h6 > .anchor.disabled, .article__content h6 > .anchor:disabled { color: rgba(204, 204, 204, 0.2) !important; }
+
+.article__content h1 > .anchor > i, .article__content h2 > .anchor > i, .article__content h3 > .anchor > i, .article__content h4 > .anchor > i, .article__content h5 > .anchor > i, .article__content h6 > .anchor > i { font-size: 0.85rem; }
+
+.root[data-is-touch="false"] .article__content h1:hover > .anchor, .root[data-is-touch="false"] .article__content h2:hover > .anchor, .root[data-is-touch="false"] .article__content h3:hover > .anchor, .root[data-is-touch="false"] .article__content h4:hover > .anchor, .root[data-is-touch="false"] .article__content h5:hover > .anchor, .root[data-is-touch="false"] .article__content h6:hover > .anchor { cursor: pointer; visibility: visible; opacity: 1; }
+
+.article__content h1, .article__content h2 { border: 0 solid #e6e6e6; border-bottom-width: 1px; }
+
+.article__content hr { border: none; }
+
+.article__content hr::before { display: block; font-size: 1.9rem; color: #888; text-align: center; letter-spacing: 1.5rem; content: "..."; }
+
+.article__content blockquote { padding-left: 1rem; font-size: 0.85rem; color: #888; border: 0 solid #cccccc; border-left-width: 4px; }
+
+.article__content blockquote p { margin: 0.5rem 0; }
+
+.article__content blockquote > :last-child { margin-bottom: 0; }
+
+.article__content img:not(.emoji) { max-width: 100%; vertical-align: middle; }
+
+.article__content .emoji { display: inline-block; width: 1.26rem; height: 1.26rem; vertical-align: text-bottom; }
+
+.article__content .footnotes { border: 0 solid #e6e6e6; border-top-width: 1px; margin-top: 3rem; }
+
+@media print { .article__content .footnotes { margin-top: 1rem; } }
+
+.article__content code { padding: 0.25rem 0.5rem; background-color: rgba(0, 0, 0, 0.05); border-radius: 0.4rem; }
+
+.article__content code span { padding: 0; margin: 0; }
+
+.article__content pre { overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.article__content pre > code { padding: 0; word-wrap: normal; background-color: transparent; }
+
+.article__content pre > code.language-mermaid, .article__content pre > code.language-chart { display: none; }
+
+.article__content pre > code.language-mermaid svg, .article__content pre > code.language-chart svg { width: 100%; }
+
+.article__content pre > code.language-mermaid[data-processed], .article__content pre > code.language-chart[data-processed] { display: block; }
+
+.article__content .highlighter-rouge > .highlight > pre, .article__content figure.highlight > pre { padding: 1rem 0 1rem 1rem; margin: 0; background-color: rgba(0, 0, 0, 0.05); border-radius: 0.4rem; }
+
+.article__content .highlighter-rouge > .highlight > pre > code, .article__content figure.highlight > pre > code { display: block; }
+
+.article__content figure.highlight::before { display: block; padding: 0.5rem 1rem 0.5rem 0; font-weight: 700; color: rgba(0, 0, 0, 0.1); text-align: right; text-transform: uppercase; content: attr(data-lang); background-color: rgba(0, 0, 0, 0.05); border-top-left-radius: 0.4rem; border-top-right-radius: 0.4rem; }
+
+.article__content figure.highlight > pre { padding-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; }
+
+.article__content figure.highlight > pre > code > .rouge-table { width: auto; margin: 0 0 -1rem -1rem; }
+
+.article__content figure.highlight > pre > code > .rouge-table tbody, .article__content figure.highlight > pre > code > .rouge-table tr, .article__content figure.highlight > pre > code > .rouge-table td { padding-top: 0; padding-bottom: 0; border: none; }
+
+.article__content figure.highlight > pre > code > .rouge-table > tbody { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; }
+
+.article__content figure.highlight > pre > code > .rouge-table > tbody > tr { width: 100%; display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; }
+
+.article__content figure.highlight > pre > code > .rouge-table > tbody > tr > .code { padding: 0 0 1rem 0.5rem; overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.article__content figure.highlight > pre > code > .rouge-table tbody td.gl { padding-left: 1rem; }
+
+.article__content figure.highlight > pre > code > .rouge-table tbody td > pre { display: block; margin: 0; border-radius: 0; overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.article__content figure.highlight > pre > code > .rouge-table tbody td > pre.lineno { color: #888; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
+
+.article__content ul, .article__content ol { margin-left: 1.5rem; }
+
+.article__content ul ul, .article__content ul ol, .article__content ol ul, .article__content ol ol { margin-top: 0; margin-bottom: 0; }
+
+.article__content ul li p, .article__content ol li p { margin: 0.5rem; }
+
+@media print { .article__content ul li p, .article__content ol li p { margin: 0.25rem; } }
+
+.article__content dl dt p, .article__content dl dd p { margin: 0.5rem; }
+
+@media print { .article__content dl dt p, .article__content dl dd p { margin: 0.25rem; } }
+
+.article__content dl dt { font-weight: 700; }
+
+.article__content dl dd { margin-left: 2rem; }
+
+.article__content ul.task-list { margin-left: 0; list-style-type: none; }
+
+.article__content ul.task-list ul, .article__content ul.task-list ol { margin-left: 1.5rem; }
+
+.article__content table { display: block; width: 100%; border-collapse: collapse; overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.article__content table thead, .article__content table tfoot { background-color: rgba(0, 0, 0, 0.05); }
+
+.article__content table th, .article__content table td { padding: 0.5rem; border: 1px solid #e6e6e6; }
+
+.article__content table th { font-weight: 700; }
+
+.article__footer { margin: 1.5rem 0; font-size: 0.85rem; }
+
+.article__license a, .article__subscribe a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.article__license a, .article__license a:link, .article__license a:visited, .article__subscribe a, .article__subscribe a:link, .article__subscribe a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .article__license a:hover, .root[data-is-touch="false"] .article__subscribe a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .article__license a.active, .root[data-is-touch] .article__license a:active, .root[data-is-touch] .article__subscribe a.active, .root[data-is-touch] .article__subscribe a:active { text-decoration: none; }
+
+.article__license a, .article__license a:link, .article__license a:visited, .article__subscribe a, .article__subscribe a:link, .article__subscribe a:visited { color: #222; }
+
+.root[data-is-touch="false"] .article__license a:hover, .root[data-is-touch="false"] .article__subscribe a:hover { color: #fc4d50; }
+
+.root[data-is-touch] .article__license a.active, .root[data-is-touch] .article__license a:active, .root[data-is-touch] .article__subscribe a.active, .root[data-is-touch] .article__subscribe a:active { color: #f80408; }
+
+.article__license a.disabled, .article__license a:disabled, .article__subscribe a.disabled, .article__subscribe a:disabled { color: rgba(34, 34, 34, 0.2) !important; }
+
+.article__license { color: #888; }
+
+.article__license img { height: 1.6rem; }
+
+.author-links > ul { margin: 0; }
+
+.author-links > ul > li > .mail-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .mail-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .mail-button, .author-links > ul > li > .mail-button:link, .author-links > ul > li > .mail-button:visited { color: #fff; background-color: #0072c5; }
+
+.author-links > ul > li > .mail-button svg path, .author-links > ul > li > .mail-button:link svg path, .author-links > ul > li > .mail-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .mail-button:hover { color: #fff; background-color: #00497e; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .mail-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .mail-button.active, .root[data-is-touch] .author-links > ul > li > .mail-button:active { color: #fff; background-color: #001c31; }
+
+.root[data-is-touch] .author-links > ul > li > .mail-button.active svg path, .root[data-is-touch] .author-links > ul > li > .mail-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .mail-button.focus { color: default; background-color: #00497e; box-shadow: 0 0 0 2px rgba(0, 73, 126, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .mail-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .mail-button.disabled, .author-links > ul > li > .mail-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #0072c5 !important; }
+
+.author-links > ul > li > .mail-button.disabled svg path, .author-links > ul > li > .mail-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .facebook-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .facebook-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .facebook-button, .author-links > ul > li > .facebook-button:link, .author-links > ul > li > .facebook-button:visited { color: #fff; background-color: #4267b2; }
+
+.author-links > ul > li > .facebook-button svg path, .author-links > ul > li > .facebook-button:link svg path, .author-links > ul > li > .facebook-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .facebook-button:hover { color: #fff; background-color: #2f497e; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .facebook-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .facebook-button.active, .root[data-is-touch] .author-links > ul > li > .facebook-button:active { color: #fff; background-color: #1a2946; }
+
+.root[data-is-touch] .author-links > ul > li > .facebook-button.active svg path, .root[data-is-touch] .author-links > ul > li > .facebook-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .facebook-button.focus { color: default; background-color: #2f497e; box-shadow: 0 0 0 2px rgba(47, 73, 126, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .facebook-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .facebook-button.disabled, .author-links > ul > li > .facebook-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #4267b2 !important; }
+
+.author-links > ul > li > .facebook-button.disabled svg path, .author-links > ul > li > .facebook-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .twitter-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .twitter-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .twitter-button, .author-links > ul > li > .twitter-button:link, .author-links > ul > li > .twitter-button:visited { color: #fff; background-color: #1da1f2; }
+
+.author-links > ul > li > .twitter-button svg path, .author-links > ul > li > .twitter-button:link svg path, .author-links > ul > li > .twitter-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .twitter-button:hover { color: #fff; background-color: #0b79bd; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .twitter-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .twitter-button.active, .root[data-is-touch] .author-links > ul > li > .twitter-button:active { color: #fff; background-color: #074b74; }
+
+.root[data-is-touch] .author-links > ul > li > .twitter-button.active svg path, .root[data-is-touch] .author-links > ul > li > .twitter-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .twitter-button.focus { color: default; background-color: #0b79bd; box-shadow: 0 0 0 2px rgba(11, 121, 189, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .twitter-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .twitter-button.disabled, .author-links > ul > li > .twitter-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #1da1f2 !important; }
+
+.author-links > ul > li > .twitter-button.disabled svg path, .author-links > ul > li > .twitter-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .weibo-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .weibo-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .weibo-button, .author-links > ul > li > .weibo-button:link, .author-links > ul > li > .weibo-button:visited { color: #fff; background-color: #e6162d; }
+
+.author-links > ul > li > .weibo-button svg path, .author-links > ul > li > .weibo-button:link svg path, .author-links > ul > li > .weibo-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .weibo-button:hover { color: #fff; background-color: #a51020; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .weibo-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .weibo-button.active, .root[data-is-touch] .author-links > ul > li > .weibo-button:active { color: #fff; background-color: #5f0913; }
+
+.root[data-is-touch] .author-links > ul > li > .weibo-button.active svg path, .root[data-is-touch] .author-links > ul > li > .weibo-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .weibo-button.focus { color: default; background-color: #a51020; box-shadow: 0 0 0 2px rgba(165, 16, 32, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .weibo-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .weibo-button.disabled, .author-links > ul > li > .weibo-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #e6162d !important; }
+
+.author-links > ul > li > .weibo-button.disabled svg path, .author-links > ul > li > .weibo-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .googlepluse-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .googlepluse-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .googlepluse-button, .author-links > ul > li > .googlepluse-button:link, .author-links > ul > li > .googlepluse-button:visited { color: #fff; background-color: #ea4335; }
+
+.author-links > ul > li > .googlepluse-button svg path, .author-links > ul > li > .googlepluse-button:link svg path, .author-links > ul > li > .googlepluse-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .googlepluse-button:hover { color: #fff; background-color: #c32214; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .googlepluse-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .googlepluse-button.active, .root[data-is-touch] .author-links > ul > li > .googlepluse-button:active { color: #fff; background-color: #7e160d; }
+
+.root[data-is-touch] .author-links > ul > li > .googlepluse-button.active svg path, .root[data-is-touch] .author-links > ul > li > .googlepluse-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .googlepluse-button.focus { color: default; background-color: #c32214; box-shadow: 0 0 0 2px rgba(195, 34, 20, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .googlepluse-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .googlepluse-button.disabled, .author-links > ul > li > .googlepluse-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #ea4335 !important; }
+
+.author-links > ul > li > .googlepluse-button.disabled svg path, .author-links > ul > li > .googlepluse-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .telegram-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .telegram-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .telegram-button, .author-links > ul > li > .telegram-button:link, .author-links > ul > li > .telegram-button:visited { color: #fff; background-color: #32afed; }
+
+.author-links > ul > li > .telegram-button svg path, .author-links > ul > li > .telegram-button:link svg path, .author-links > ul > li > .telegram-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .telegram-button:hover { color: #fff; background-color: #118ac6; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .telegram-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .telegram-button.active, .root[data-is-touch] .author-links > ul > li > .telegram-button:active { color: #fff; background-color: #0b5980; }
+
+.root[data-is-touch] .author-links > ul > li > .telegram-button.active svg path, .root[data-is-touch] .author-links > ul > li > .telegram-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .telegram-button.focus { color: default; background-color: #118ac6; box-shadow: 0 0 0 2px rgba(17, 138, 198, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .telegram-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .telegram-button.disabled, .author-links > ul > li > .telegram-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #32afed !important; }
+
+.author-links > ul > li > .telegram-button.disabled svg path, .author-links > ul > li > .telegram-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .medium-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .medium-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .medium-button, .author-links > ul > li > .medium-button:link, .author-links > ul > li > .medium-button:visited { color: #fff; background-color: #000; }
+
+.author-links > ul > li > .medium-button svg path, .author-links > ul > li > .medium-button:link svg path, .author-links > ul > li > .medium-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .medium-button:hover { color: #fff; background-color: #2e2e2e; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .medium-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .medium-button.active, .root[data-is-touch] .author-links > ul > li > .medium-button:active { color: #fff; background-color: #575757; }
+
+.root[data-is-touch] .author-links > ul > li > .medium-button.active svg path, .root[data-is-touch] .author-links > ul > li > .medium-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .medium-button.focus { color: default; background-color: #2e2e2e; box-shadow: 0 0 0 2px rgba(46, 46, 46, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .medium-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .medium-button.disabled, .author-links > ul > li > .medium-button:disabled { color: rgba(255, 255, 255, 0.4) !important; background-color: #000 !important; }
+
+.author-links > ul > li > .medium-button.disabled svg path, .author-links > ul > li > .medium-button:disabled svg path { fill: rgba(255, 255, 255, 0.4) !important; }
+
+.author-links > ul > li > .zhihu-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .zhihu-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .zhihu-button, .author-links > ul > li > .zhihu-button:link, .author-links > ul > li > .zhihu-button:visited { color: #fff; background-color: #0084ff; }
+
+.author-links > ul > li > .zhihu-button svg path, .author-links > ul > li > .zhihu-button:link svg path, .author-links > ul > li > .zhihu-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .zhihu-button:hover { color: #fff; background-color: #005fb8; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .zhihu-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .zhihu-button.active, .root[data-is-touch] .author-links > ul > li > .zhihu-button:active { color: #fff; background-color: #00376b; }
+
+.root[data-is-touch] .author-links > ul > li > .zhihu-button.active svg path, .root[data-is-touch] .author-links > ul > li > .zhihu-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .zhihu-button.focus { color: default; background-color: #005fb8; box-shadow: 0 0 0 2px rgba(0, 95, 184, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .zhihu-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .zhihu-button.disabled, .author-links > ul > li > .zhihu-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #0084ff !important; }
+
+.author-links > ul > li > .zhihu-button.disabled svg path, .author-links > ul > li > .zhihu-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .douban-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .douban-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .douban-button, .author-links > ul > li > .douban-button:link, .author-links > ul > li > .douban-button:visited { color: #fff; background-color: #42bd56; }
+
+.author-links > ul > li > .douban-button svg path, .author-links > ul > li > .douban-button:link svg path, .author-links > ul > li > .douban-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .douban-button:hover { color: #fff; background-color: #30883e; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .douban-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .douban-button.active, .root[data-is-touch] .author-links > ul > li > .douban-button:active { color: #fff; background-color: #1c4f24; }
+
+.root[data-is-touch] .author-links > ul > li > .douban-button.active svg path, .root[data-is-touch] .author-links > ul > li > .douban-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .douban-button.focus { color: default; background-color: #30883e; box-shadow: 0 0 0 2px rgba(48, 136, 62, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .douban-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .douban-button.disabled, .author-links > ul > li > .douban-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #42bd56 !important; }
+
+.author-links > ul > li > .douban-button.disabled svg path, .author-links > ul > li > .douban-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .linkedin-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .linkedin-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .linkedin-button, .author-links > ul > li > .linkedin-button:link, .author-links > ul > li > .linkedin-button:visited { color: #fff; background-color: #1074af; }
+
+.author-links > ul > li > .linkedin-button svg path, .author-links > ul > li > .linkedin-button:link svg path, .author-links > ul > li > .linkedin-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .linkedin-button:hover { color: #fff; background-color: #0a496e; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .linkedin-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .linkedin-button.active, .root[data-is-touch] .author-links > ul > li > .linkedin-button:active { color: #fff; background-color: #041a27; }
+
+.root[data-is-touch] .author-links > ul > li > .linkedin-button.active svg path, .root[data-is-touch] .author-links > ul > li > .linkedin-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .linkedin-button.focus { color: default; background-color: #0a496e; box-shadow: 0 0 0 2px rgba(10, 73, 110, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .linkedin-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .linkedin-button.disabled, .author-links > ul > li > .linkedin-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #1074af !important; }
+
+.author-links > ul > li > .linkedin-button.disabled svg path, .author-links > ul > li > .linkedin-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-links > ul > li > .github-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .github-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .github-button, .author-links > ul > li > .github-button:link, .author-links > ul > li > .github-button:visited { color: #fff; background-color: #000; }
+
+.author-links > ul > li > .github-button svg path, .author-links > ul > li > .github-button:link svg path, .author-links > ul > li > .github-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .github-button:hover { color: #fff; background-color: #2e2e2e; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .github-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .github-button.active, .root[data-is-touch] .author-links > ul > li > .github-button:active { color: #fff; background-color: #575757; }
+
+.root[data-is-touch] .author-links > ul > li > .github-button.active svg path, .root[data-is-touch] .author-links > ul > li > .github-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .github-button.focus { color: default; background-color: #2e2e2e; box-shadow: 0 0 0 2px rgba(46, 46, 46, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .github-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .github-button.disabled, .author-links > ul > li > .github-button:disabled { color: rgba(255, 255, 255, 0.4) !important; background-color: #000 !important; }
+
+.author-links > ul > li > .github-button.disabled svg path, .author-links > ul > li > .github-button:disabled svg path { fill: rgba(255, 255, 255, 0.4) !important; }
+
+.author-links > ul > li > .npm-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .npm-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-links > ul > li > .npm-button, .author-links > ul > li > .npm-button:link, .author-links > ul > li > .npm-button:visited { color: #fff; background-color: #fff; }
+
+.author-links > ul > li > .npm-button svg path, .author-links > ul > li > .npm-button:link svg path, .author-links > ul > li > .npm-button:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .npm-button:hover { color: #fff; background-color: #dbdbdb; }
+
+.root[data-is-touch="false"] .author-links > ul > li > .npm-button:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .npm-button.active, .root[data-is-touch] .author-links > ul > li > .npm-button:active { color: #fff; background-color: #b5b5b5; }
+
+.root[data-is-touch] .author-links > ul > li > .npm-button.active svg path, .root[data-is-touch] .author-links > ul > li > .npm-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .author-links > ul > li > .npm-button.focus { color: default; background-color: #dbdbdb; box-shadow: 0 0 0 2px rgba(219, 219, 219, 0.4); }
+
+.root[data-is-touch] .author-links > ul > li > .npm-button.focus svg path { fill: default; }
+
+.author-links > ul > li > .npm-button.disabled, .author-links > ul > li > .npm-button:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: #fff !important; }
+
+.author-links > ul > li > .npm-button.disabled svg path, .author-links > ul > li > .npm-button:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.author-profile { max-width: 25rem; padding: 0.5rem 1rem; margin: 1.5rem 0; font-size: 0.85rem; background-color: rgba(0, 0, 0, 0.05); }
+
+@media (max-width: 499px) { .author-profile { text-align: center; } }
+
+.author-profile__avatar { width: 5rem; height: 5rem; margin-top: 0.5rem; border-radius: 50%; }
+
+.author-profile__name { font-size: 1.25rem; font-weight: 700; }
+
+.author-profile__name a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.author-profile__name a, .author-profile__name a:link, .author-profile__name a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .author-profile__name a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .author-profile__name a.active, .root[data-is-touch] .author-profile__name a:active { text-decoration: none; }
+
+.author-profile__name a, .author-profile__name a:link, .author-profile__name a:visited { color: #222; }
+
+.root[data-is-touch="false"] .author-profile__name a:hover { color: #fc4d50; }
+
+.root[data-is-touch] .author-profile__name a.active, .root[data-is-touch] .author-profile__name a:active { color: #f80408; }
+
+.author-profile__name a.disabled, .author-profile__name a:disabled { color: rgba(34, 34, 34, 0.2) !important; }
+
+.author-profile__links { overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.site-tags .tag-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button, .site-tags .tag-button:link, .site-tags .tag-button:visited { color: #333; background-color: #f2f2f2; }
+
+.site-tags .tag-button svg path, .site-tags .tag-button:link svg path, .site-tags .tag-button:visited svg path { fill: #333; }
+
+.root[data-is-touch="false"] .site-tags .tag-button:hover { color: #333; background-color: #cecece; }
+
+.root[data-is-touch="false"] .site-tags .tag-button:hover svg path { fill: #333; }
+
+.root[data-is-touch] .site-tags .tag-button.active, .root[data-is-touch] .site-tags .tag-button:active { color: #fff; background-color: #fca24d; }
+
+.root[data-is-touch] .site-tags .tag-button.active svg path, .root[data-is-touch] .site-tags .tag-button:active svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button.focus { color: #fff; background-color: #fca24d; box-shadow: 0 0 0 2px rgba(252, 162, 77, 0.4); }
+
+.root[data-is-touch] .site-tags .tag-button.focus svg path { fill: #fff; }
+
+.site-tags .tag-button.disabled, .site-tags .tag-button:disabled { color: rgba(51, 51, 51, 0.2) !important; background-color: #f2f2f2 !important; }
+
+.site-tags .tag-button.disabled svg path, .site-tags .tag-button:disabled svg path { fill: rgba(51, 51, 51, 0.2) !important; }
+
+.site-tags .tag-button > .tag-button__count { display: inline-block; margin-left: 0.25rem; font-size: 0.7rem; line-height: 1; vertical-align: top; }
+
+.site-tags .tag-button-1 { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-1 svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-1, .site-tags .tag-button-1:link, .site-tags .tag-button-1:visited { color: #fff; background-color: rgba(252, 77, 80, 0.4); }
+
+.site-tags .tag-button-1 svg path, .site-tags .tag-button-1:link svg path, .site-tags .tag-button-1:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .site-tags .tag-button-1:hover { color: #fff; background-color: rgba(251, 7, 11, 0.4); }
+
+.root[data-is-touch="false"] .site-tags .tag-button-1:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-1.active, .root[data-is-touch] .site-tags .tag-button-1:active { color: #fff; background-color: #fca24d; }
+
+.root[data-is-touch] .site-tags .tag-button-1.active svg path, .root[data-is-touch] .site-tags .tag-button-1:active svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-1.focus { color: #fff; background-color: #fca24d; box-shadow: 0 0 0 2px rgba(252, 162, 77, 0.4); }
+
+.root[data-is-touch] .site-tags .tag-button-1.focus svg path { fill: #fff; }
+
+.site-tags .tag-button-1.disabled, .site-tags .tag-button-1:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: rgba(252, 77, 80, 0.4) !important; }
+
+.site-tags .tag-button-1.disabled svg path, .site-tags .tag-button-1:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.site-tags .tag-button-2 { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-2 svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-2, .site-tags .tag-button-2:link, .site-tags .tag-button-2:visited { color: #fff; background-color: rgba(252, 77, 80, 0.55); }
+
+.site-tags .tag-button-2 svg path, .site-tags .tag-button-2:link svg path, .site-tags .tag-button-2:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .site-tags .tag-button-2:hover { color: #fff; background-color: rgba(251, 7, 11, 0.55); }
+
+.root[data-is-touch="false"] .site-tags .tag-button-2:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-2.active, .root[data-is-touch] .site-tags .tag-button-2:active { color: #fff; background-color: #fca24d; }
+
+.root[data-is-touch] .site-tags .tag-button-2.active svg path, .root[data-is-touch] .site-tags .tag-button-2:active svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-2.focus { color: #fff; background-color: #fca24d; box-shadow: 0 0 0 2px rgba(252, 162, 77, 0.4); }
+
+.root[data-is-touch] .site-tags .tag-button-2.focus svg path { fill: #fff; }
+
+.site-tags .tag-button-2.disabled, .site-tags .tag-button-2:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: rgba(252, 77, 80, 0.55) !important; }
+
+.site-tags .tag-button-2.disabled svg path, .site-tags .tag-button-2:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.site-tags .tag-button-3 { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-3 svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-3, .site-tags .tag-button-3:link, .site-tags .tag-button-3:visited { color: #fff; background-color: rgba(252, 77, 80, 0.7); }
+
+.site-tags .tag-button-3 svg path, .site-tags .tag-button-3:link svg path, .site-tags .tag-button-3:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .site-tags .tag-button-3:hover { color: #fff; background-color: rgba(251, 7, 11, 0.7); }
+
+.root[data-is-touch="false"] .site-tags .tag-button-3:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-3.active, .root[data-is-touch] .site-tags .tag-button-3:active { color: #fff; background-color: #fca24d; }
+
+.root[data-is-touch] .site-tags .tag-button-3.active svg path, .root[data-is-touch] .site-tags .tag-button-3:active svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-3.focus { color: #fff; background-color: #fca24d; box-shadow: 0 0 0 2px rgba(252, 162, 77, 0.4); }
+
+.root[data-is-touch] .site-tags .tag-button-3.focus svg path { fill: #fff; }
+
+.site-tags .tag-button-3.disabled, .site-tags .tag-button-3:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: rgba(252, 77, 80, 0.7) !important; }
+
+.site-tags .tag-button-3.disabled svg path, .site-tags .tag-button-3:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.site-tags .tag-button-4 { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-4 svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.site-tags .tag-button-4, .site-tags .tag-button-4:link, .site-tags .tag-button-4:visited { color: #fff; background-color: rgba(252, 77, 80, 0.9); }
+
+.site-tags .tag-button-4 svg path, .site-tags .tag-button-4:link svg path, .site-tags .tag-button-4:visited svg path { fill: #fff; }
+
+.root[data-is-touch="false"] .site-tags .tag-button-4:hover { color: #fff; background-color: rgba(251, 7, 11, 0.9); }
+
+.root[data-is-touch="false"] .site-tags .tag-button-4:hover svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-4.active, .root[data-is-touch] .site-tags .tag-button-4:active { color: #fff; background-color: #fca24d; }
+
+.root[data-is-touch] .site-tags .tag-button-4.active svg path, .root[data-is-touch] .site-tags .tag-button-4:active svg path { fill: #fff; }
+
+.root[data-is-touch] .site-tags .tag-button-4.focus { color: #fff; background-color: #fca24d; box-shadow: 0 0 0 2px rgba(252, 162, 77, 0.4); }
+
+.root[data-is-touch] .site-tags .tag-button-4.focus svg path { fill: #fff; }
+
+.site-tags .tag-button-4.disabled, .site-tags .tag-button-4:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: rgba(252, 77, 80, 0.9) !important; }
+
+.site-tags .tag-button-4.disabled svg path, .site-tags .tag-button-4:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.search { overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.search--google-custom-search-engine .main { padding-top: 1.5rem; padding-bottom: 1.5rem; }
+
+@media (max-width: 499px) { .search--google-custom-search-engine .main { position: absolute; padding: 0; } }
+
+.search__header { margin-top: 1.5rem; font-size: 2.5rem; font-weight: 700; color: #000; }
+
+.search--light .search__header { color: #000; }
+
+.search--dark .search__header { color: #fff; }
+
+@media (max-width: 499px) { .search__header { display: none; } }
+
+.search-bar { display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; margin: 1rem 0 1.5rem 0; }
+
+.search-box { position: relative; width: 100%; max-width: 22rem; }
+
+@media (max-width: 499px) { .search-box { width: 100%; max-width: none; } }
+
+.search-box > input { display: inline-block; width: 100%; height: 2.3rem; padding: 0 2rem; margin: 0; line-height: 1 !important; color: #222; background-color: transparent; border: 2px solid #cccccc; border-radius: 6rem; -webkit-appearance: none; /* fix iOS don't display box-shadow properly */ -webkit-transition: box-shadow 0.4s ease-in-out; transition: box-shadow 0.4s ease-in-out; }
+
+.root[data-is-touch] .search-box > input.focus { box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.4); }
+
+.search--light .search-box > input { color: #222; border-color: #222; }
+
+.root[data-is-touch] .search--light .search-box > input.focus { box-shadow: 0 0 0 2px rgba(34, 34, 34, 0.4); }
+
+.search--dark .search-box > input { color: rgba(255, 255, 255, 0.95); border-color: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .search--dark .search-box > input.focus { box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.4); }
+
+.search-box > .search-box__icon-search { color: #888; }
+
+.search--light .search-box > .search-box__icon-search { color: #888; }
+
+.search--dark .search-box > .search-box__icon-search { color: rgba(255, 255, 255, 0.85); }
+
+.search-box > .search-box__icon-clear > a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; cursor: pointer; }
+
+.search-box > .search-box__icon-clear > a, .search-box > .search-box__icon-clear > a:link, .search-box > .search-box__icon-clear > a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .search-box > .search-box__icon-clear > a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .search-box > .search-box__icon-clear > a.active, .root[data-is-touch] .search-box > .search-box__icon-clear > a:active { text-decoration: none; }
+
+.search-box > .search-box__icon-clear > a, .search-box > .search-box__icon-clear > a:link, .search-box > .search-box__icon-clear > a:visited { color: #222; }
+
+.root[data-is-touch="false"] .search-box > .search-box__icon-clear > a:hover { color: #505050; }
+
+.root[data-is-touch] .search-box > .search-box__icon-clear > a.active, .root[data-is-touch] .search-box > .search-box__icon-clear > a:active { color: #797979; }
+
+.search-box > .search-box__icon-clear > a.disabled, .search-box > .search-box__icon-clear > a:disabled { color: rgba(34, 34, 34, 0.4) !important; }
+
+.search--light .search-box > .search-box__icon-clear > a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search--light .search-box > .search-box__icon-clear > a, .search--light .search-box > .search-box__icon-clear > a:link, .search--light .search-box > .search-box__icon-clear > a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .search--light .search-box > .search-box__icon-clear > a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .search--light .search-box > .search-box__icon-clear > a.active, .root[data-is-touch] .search--light .search-box > .search-box__icon-clear > a:active { text-decoration: none; }
+
+.search--light .search-box > .search-box__icon-clear > a, .search--light .search-box > .search-box__icon-clear > a:link, .search--light .search-box > .search-box__icon-clear > a:visited { color: #222; }
+
+.root[data-is-touch="false"] .search--light .search-box > .search-box__icon-clear > a:hover { color: #505050; }
+
+.root[data-is-touch] .search--light .search-box > .search-box__icon-clear > a.active, .root[data-is-touch] .search--light .search-box > .search-box__icon-clear > a:active { color: #797979; }
+
+.search--light .search-box > .search-box__icon-clear > a.disabled, .search--light .search-box > .search-box__icon-clear > a:disabled { color: rgba(34, 34, 34, 0.4) !important; }
+
+.search--dark .search-box > .search-box__icon-clear > a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search--dark .search-box > .search-box__icon-clear > a, .search--dark .search-box > .search-box__icon-clear > a:link, .search--dark .search-box > .search-box__icon-clear > a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .search--dark .search-box > .search-box__icon-clear > a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .search--dark .search-box > .search-box__icon-clear > a.active, .root[data-is-touch] .search--dark .search-box > .search-box__icon-clear > a:active { text-decoration: none; }
+
+.search--dark .search-box > .search-box__icon-clear > a, .search--dark .search-box > .search-box__icon-clear > a:link, .search--dark .search-box > .search-box__icon-clear > a:visited { color: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch="false"] .search--dark .search-box > .search-box__icon-clear > a:hover { color: rgba(219, 219, 219, 0.95); }
+
+.root[data-is-touch] .search--dark .search-box > .search-box__icon-clear > a.active, .root[data-is-touch] .search--dark .search-box > .search-box__icon-clear > a:active { color: rgba(181, 181, 181, 0.95); }
+
+.search--dark .search-box > .search-box__icon-clear > a.disabled, .search--dark .search-box > .search-box__icon-clear > a:disabled { color: rgba(255, 255, 255, 0.2) !important; }
+
+.search-box > .search-box__icon-search, .search-box > .search-box__icon-clear { position: absolute; width: 2.3rem; height: 2.3rem; line-height: 2.3rem; text-align: center; vertical-align: middle; }
+
+.search-box.not-empty > .search-box__icon-clear { display: block; }
+
+.search-box > .search-box__icon-clear { top: 0; right: 0; display: none; }
+
+.search-box > .search-box__icon-search { top: 0; left: 0; }
+
+.search__cancel { margin-left: 0.5rem; font-weight: 700; white-space: nowrap; }
+
+.search-result { margin: 1.5rem 0; font-size: 0.85rem; line-height: 1.4; }
+
+.search-result__header { margin: 1rem 0 0.5rem 0; font-size: 1.25rem; font-weight: 700; color: #888; text-transform: uppercase; }
+
+.search--light .search-result__header { color: #888; }
+
+.search--dark .search-result__header { color: rgba(255, 255, 255, 0.85); }
+
+.search-result__item { list-style-type: none; }
+
+.search-result__item a { padding: 0.25rem 1rem; -webkit-transition: none; transition: none; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search-result__item a svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search-result__item a, .search-result__item a:link, .search-result__item a:visited { color: #222; background-color: transparent; }
+
+.search-result__item a svg path, .search-result__item a:link svg path, .search-result__item a:visited svg path { fill: #222; }
+
+.root[data-is-touch="false"] .search-result__item a:hover { color: #333; background-color: #f2f2f2; }
+
+.root[data-is-touch="false"] .search-result__item a:hover svg path { fill: #333; }
+
+.root[data-is-touch] .search-result__item a.active, .root[data-is-touch] .search-result__item a:active { color: #333; background-color: #cccccc; }
+
+.root[data-is-touch] .search-result__item a.active svg path, .root[data-is-touch] .search-result__item a:active svg path { fill: #333; }
+
+.root[data-is-touch] .search-result__item a.focus { color: default; background-color: #f2f2f2; box-shadow: 0 0 0 2px rgba(242, 242, 242, 0.4); }
+
+.root[data-is-touch] .search-result__item a.focus svg path { fill: default; }
+
+.search-result__item a.disabled, .search-result__item a:disabled { color: rgba(34, 34, 34, 0.2) !important; background-color: transparent !important; }
+
+.search-result__item a.disabled svg path, .search-result__item a:disabled svg path { fill: rgba(34, 34, 34, 0.2) !important; }
+
+.search--light .search-result__item a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search--light .search-result__item a svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search--light .search-result__item a, .search--light .search-result__item a:link, .search--light .search-result__item a:visited { color: #222; background-color: transparent; }
+
+.search--light .search-result__item a svg path, .search--light .search-result__item a:link svg path, .search--light .search-result__item a:visited svg path { fill: #222; }
+
+.root[data-is-touch="false"] .search--light .search-result__item a:hover { color: rgba(255, 255, 255, 0.95); background-color: rgba(0, 0, 0, 0.9); }
+
+.root[data-is-touch="false"] .search--light .search-result__item a:hover svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .search--light .search-result__item a.active, .root[data-is-touch] .search--light .search-result__item a:active { color: rgba(255, 255, 255, 0.95); background-color: rgba(41, 41, 41, 0.9); }
+
+.root[data-is-touch] .search--light .search-result__item a.active svg path, .root[data-is-touch] .search--light .search-result__item a:active svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch] .search--light .search-result__item a.focus { color: default; background-color: rgba(0, 0, 0, 0.9); box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4); }
+
+.root[data-is-touch] .search--light .search-result__item a.focus svg path { fill: default; }
+
+.search--light .search-result__item a.disabled, .search--light .search-result__item a:disabled { color: rgba(34, 34, 34, 0.4) !important; background-color: transparent !important; }
+
+.search--light .search-result__item a.disabled svg path, .search--light .search-result__item a:disabled svg path { fill: rgba(34, 34, 34, 0.4) !important; }
+
+.search--dark .search-result__item a { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search--dark .search-result__item a svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.search--dark .search-result__item a, .search--dark .search-result__item a:link, .search--dark .search-result__item a:visited { color: rgba(255, 255, 255, 0.95); background-color: transparent; }
+
+.search--dark .search-result__item a svg path, .search--dark .search-result__item a:link svg path, .search--dark .search-result__item a:visited svg path { fill: rgba(255, 255, 255, 0.95); }
+
+.root[data-is-touch="false"] .search--dark .search-result__item a:hover { color: #222; background-color: rgba(255, 255, 255, 0.9); }
+
+.root[data-is-touch="false"] .search--dark .search-result__item a:hover svg path { fill: #222; }
+
+.root[data-is-touch] .search--dark .search-result__item a.active, .root[data-is-touch] .search--dark .search-result__item a:active { color: #222; background-color: rgba(217, 217, 217, 0.9); }
+
+.root[data-is-touch] .search--dark .search-result__item a.active svg path, .root[data-is-touch] .search--dark .search-result__item a:active svg path { fill: #222; }
+
+.root[data-is-touch] .search--dark .search-result__item a.focus { color: default; background-color: rgba(255, 255, 255, 0.9); box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.4); }
+
+.root[data-is-touch] .search--dark .search-result__item a.focus svg path { fill: default; }
+
+.search--dark .search-result__item a.disabled, .search--dark .search-result__item a:disabled { color: rgba(255, 255, 255, 0.2) !important; background-color: transparent !important; }
+
+.search--dark .search-result__item a.disabled svg path, .search--dark .search-result__item a:disabled svg path { fill: rgba(255, 255, 255, 0.2) !important; }
+
+.search-result__item.active a, .search-result__item.active a:link, .search-result__item.active a:visited { color: #333; background-color: #f2f2f2; }
+
+.search--light .search-result__item.active a, .search--light .search-result__item.active a:link, .search--light .search-result__item.active a:visited { color: rgba(255, 255, 255, 0.95); background-color: rgba(0, 0, 0, 0.9); }
+
+.search--dark .search-result__item.active a, .search--dark .search-result__item.active a:link, .search--dark .search-result__item.active a:visited { color: #222; background-color: rgba(255, 255, 255, 0.9); }
+
+.root[data-is-touch] .search-result__item.active a.active, .root[data-is-touch] .search-result__item.active a:active { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.gsc-control-cse *, .gsc-control-cse ::before, .gsc-control-cse ::after { box-sizing: initial; }
+
+.popup-image { cursor: pointer; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.root[data-is-touch="false"] .popup-image:hover { box-shadow: 0 8px 16px rgba(0, 0, 0, 0.23), 0 2px 6px rgba(0, 0, 0, 0.08), 0 12px 24px rgba(0, 0, 0, 0.02); }
+
+.extensions { margin: 1rem 0; }
+
+.extensions--video, .extensions--slide, .extensions--demo { position: relative; width: 100%; padding: 0; }
+
+.extensions--video > iframe, .extensions--slide > iframe, .extensions--demo > iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+.extensions--video { padding-top: 56.25%; }
+
+.extensions--slide { padding-top: 81.3021702838%; }
+
+.extensions--demo { min-height: 340px; padding-top: 56.25%; }
+
+.extensions--audio { display: block; max-width: 100% !important; }
+
+.article__content p.success { padding: 0.5rem 1rem; background-color: rgba(82, 196, 26, 0.1); border: 1px solid #52c41a; border-radius: 0.4rem; }
+
+.article__content p.info { padding: 0.5rem 1rem; background-color: rgba(24, 144, 255, 0.1); border: 1px solid #1890ff; border-radius: 0.4rem; }
+
+.article__content p.warning { padding: 0.5rem 1rem; background-color: rgba(250, 140, 22, 0.1); border: 1px solid #fa8c16; border-radius: 0.4rem; }
+
+.article__content p.error { padding: 0.5rem 1rem; background-color: rgba(245, 34, 45, 0.1); border: 1px solid #f5222d; border-radius: 0.4rem; }
+
+.article__content code.success { color: #fff; background-color: #52c41a; }
+
+.article__content code.info { color: #fff; background-color: #1890ff; }
+
+.article__content code.warning { color: #fff; background-color: #fa8c16; }
+
+.article__content code.error { color: #fff; background-color: #f5222d; }
+
+.article__content img.shadow, .article__content .shadow > img { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.23), 0 1px 3px rgba(0, 0, 0, 0.08), 0 6px 12px rgba(0, 0, 0, 0.02); }
+
+.article__content img.border, .article__content .border > img { border: 1px solid #e6e6e6; }
+
+.article__content img.rounded, .article__content .rounded > img { border-radius: 0.4rem; }
+
+.article__content img.circle, .article__content .circle > img { border-radius: 50%; }
+
+.icon { display: block; }
+
+.icon > svg { display: block; }
+
+body, html, .root, .layout--page { height: 100%; }
+
+.layout--page.layout--page--sidebar .page__viewport, .layout--page.layout--page--sidebar .page__grid { height: 100%; }
+
+@media (max-width: 1023px) { .layout--page.layout--page--sidebar .page__main { overflow: unset; } }
+
+.page__main { height: 100%; color: #222; }
+
+.page__main .col-aside { display: none; }
+
+.page__main .col-aside > aside { position: absolute; width: 220px; overflow: hidden; }
+
+.page__main-inner { position: relative; display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flexbox; display: flex; -webkit-box-direction: normal; -webkit-box-orient: vertical; -webkit-flex-direction: column; -moz-flex-direction: column; -ms-flex-direction: column; flex-direction: column; min-height: 100%; background-color: #fff; }
+
+.page__content { -webkit-box-flex: 1; -webkit-flex: 1; -moz-box-flex: 1; -moz-flex: 1; -ms-flex: 1; flex: 1; width: 100%; margin: 0 auto; }
+
+@media print { .page__content { padding-bottom: 0; } }
+
+.hide-footer .page__content { padding-bottom: 0; }
+
+.page__comments { margin: 1.5rem 0; }
+
+.page__aside .toc-aside { padding: 3rem 0 1rem 3rem; }
+
+.page__actions { position: fixed; bottom: 3rem; left: 1rem; z-index: 996; display: none; }
+
+.page__sidebar { z-index: 998; display: block; width: 80%; max-width: 250px; height: 100%; background-color: #fff; border: 0 solid #e6e6e6; border-right-width: 1px; -webkit-transition: transform 0.4s; transition: transform 0.4s; overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.page__sidebar .sidebar-toc { padding: 1rem 1rem 1.5rem 1.5rem; }
+
+.sidebar-button { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.sidebar-button svg path { -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.sidebar-button, .sidebar-button:link, .sidebar-button:visited { color: #000; background-color: rgba(242, 242, 242, 0.75); }
+
+.sidebar-button svg path, .sidebar-button:link svg path, .sidebar-button:visited svg path { fill: #000; }
+
+.root[data-is-touch="false"] .sidebar-button:hover { color: #000; background-color: rgba(206, 206, 206, 0.75); }
+
+.root[data-is-touch="false"] .sidebar-button:hover svg path { fill: #000; }
+
+.root[data-is-touch] .sidebar-button.active, .root[data-is-touch] .sidebar-button:active { color: #000; background-color: rgba(168, 168, 168, 0.75); }
+
+.root[data-is-touch] .sidebar-button.active svg path, .root[data-is-touch] .sidebar-button:active svg path { fill: #000; }
+
+.root[data-is-touch] .sidebar-button.focus { color: default; background-color: rgba(206, 206, 206, 0.75); box-shadow: 0 0 0 2px rgba(206, 206, 206, 0.4); }
+
+.root[data-is-touch] .sidebar-button.focus svg path { fill: default; }
+
+.sidebar-button.disabled, .sidebar-button:disabled { color: rgba(0, 0, 0, 0.2) !important; background-color: rgba(242, 242, 242, 0.75) !important; }
+
+.sidebar-button.disabled svg path, .sidebar-button:disabled svg path { fill: rgba(0, 0, 0, 0.2) !important; }
+
+.page__mask { position: fixed; top: 0; left: 0; z-index: 997; width: 100%; height: 100%; color: rgba(255, 255, 255, 0.95); touch-action: none; background-color: rgba(0, 0, 0, 0.9); opacity: 0; -webkit-transform: translate(100%, 0); transform: translate(100%, 0); -webkit-transition: opacity 0.4s ease-in-out, transform 0s 0.4s ease-in-out; transition: opacity 0.4s ease-in-out, transform 0s 0.4s ease-in-out; cursor: pointer; }
+
+.layout--page--sidebar .page__main { overflow: auto; -webkit-overflow-scrolling: touch; }
+
+@media print { .layout--page--sidebar .page__main { overflow: unset; } }
+
+.has-aside .col-aside { position: relative; display: block; width: 220px; }
+
+.has-aside .col-aside > aside.fixed { position: fixed; -webkit-font-smoothing: subpixel-antialiased; }
+
+@media (max-width: 1023px) { .has-aside .col-aside { display: none; } }
+
+@media (max-width: 1023px) { .page__sidebar { position: fixed; -webkit-transform: translate(-250px, 0); transform: translate(-250px, 0); } .page__actions { display: block; } .show-sidebar .page__actions { visibility: hidden; } .show-sidebar .page__sidebar { -webkit-transform: translate(0); transform: translate(0); } .show-sidebar .page__mask { opacity: 1; -webkit-transform: translate(0, 0); transform: translate(0, 0); -webkit-transition: opacity 0.4s ease-in-out; transition: opacity 0.4s ease-in-out; } }
+
+.hero--light .article__info { color: #222; }
+
+.hero--dark .article__info { color: rgba(255, 255, 255, 0.95); }
+
+.page__main--immersive .page__header { position: absolute; width: 100%; }
+
+.page__main--immersive .hero__content { padding-top: 5rem; }
+
+.article__sharing { margin: 1.5rem 0; }
+
+.article__section-navigator { padding-top: 1rem; margin: 1.5rem 0 1rem 0; word-wrap: break-word; border: 0 solid #e6e6e6; border-top-width: 4px; }
+
+.article__section-navigator > .previous, .article__section-navigator > .next { width: 50%; }
+
+.article__section-navigator > .previous > span, .article__section-navigator > .next > span { font-weight: 700; color: #888; }
+
+.article__section-navigator > .previous > a, .article__section-navigator > .next > a { display: block; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; }
+
+.article__section-navigator > .previous > a, .article__section-navigator > .previous > a:link, .article__section-navigator > .previous > a:visited, .article__section-navigator > .next > a, .article__section-navigator > .next > a:link, .article__section-navigator > .next > a:visited { text-decoration: none; }
+
+.root[data-is-touch="false"] .article__section-navigator > .previous > a:hover, .root[data-is-touch="false"] .article__section-navigator > .next > a:hover { text-decoration: underline; }
+
+.root[data-is-touch] .article__section-navigator > .previous > a.active, .root[data-is-touch] .article__section-navigator > .previous > a:active, .root[data-is-touch] .article__section-navigator > .next > a.active, .root[data-is-touch] .article__section-navigator > .next > a:active { text-decoration: none; }
+
+.article__section-navigator > .previous > a, .article__section-navigator > .previous > a:link, .article__section-navigator > .previous > a:visited, .article__section-navigator > .next > a, .article__section-navigator > .next > a:link, .article__section-navigator > .next > a:visited { color: #222; }
+
+.root[data-is-touch="false"] .article__section-navigator > .previous > a:hover, .root[data-is-touch="false"] .article__section-navigator > .next > a:hover { color: #fc4d50; }
+
+.root[data-is-touch] .article__section-navigator > .previous > a.active, .root[data-is-touch] .article__section-navigator > .previous > a:active, .root[data-is-touch] .article__section-navigator > .next > a.active, .root[data-is-touch] .article__section-navigator > .next > a:active { color: #f80408; }
+
+.article__section-navigator > .previous > a.disabled, .article__section-navigator > .previous > a:disabled, .article__section-navigator > .next > a.disabled, .article__section-navigator > .next > a:disabled { color: rgba(34, 34, 34, 0.2) !important; }
+
+.article__section-navigator > .previous { float: left; padding-right: 0.5rem; }
+
+.article__section-navigator > .next { float: right; padding-left: 0.5rem; text-align: right; }
+
+.layout--articles { margin: 1.5rem 0; margin-top: 3rem; }
+
+@media (max-width: 499px) { .layout--articles { margin-top: 1.5rem; } }
+
+.layout--articles .card__header { font-size: 1rem; }
+
+.layout--articles .card__image > .overlay, .layout--articles .card__image > .overlay .card__header { font-size: 0.85rem; }
+
+.layout--archive > .layout--archive__result { margin: 1.5rem 0; }
+
+.layout--home .pagination { margin: 1.5rem 0; }
+
+.layout--home .pagination__menu { max-width: 100%; overflow: auto; -webkit-overflow-scrolling: touch; }
+
+.layout--home .pagination__omit { color: #888; }
+
+.layout--home .items { margin-top: 2.25rem; }
+
+.layout--landing .heros { max-width: 1900px; margin-right: auto; margin-left: auto; }
+
+.layout--landing .hero img { display: block; width: 100%; margin: 0 auto; }
+
+.layout--landing .hero__content { margin-bottom: 0; }
+
+.layout--landing .hero__cover { max-width: 950px; }
+
+.layout--landing .hero__cover--full-width { max-width: none; }
+
+.layout--404 .sign { display: table; margin: 1.5rem auto; margin-top: 3rem; }
+
+.layout--404 .sign h1 { font-size: 6rem; line-height: 1; }
+
+.layout--404 .sign p { font-size: 1.8rem; }
+
+/* start custom scss snippet */
+/* end custom scss snippet */
+
+/*# sourceMappingURL=main.css.map */
\ No newline at end of file
diff --git a/_site/assets/css/main.css.map b/_site/assets/css/main.css.map
new file mode 100644
index 0000000..ad57fbd
--- /dev/null
+++ b/_site/assets/css/main.css.map
@@ -0,0 +1,146 @@
+{
+	"version": 3,
+	"file": "main.css",
+	"sources": [
+		"main.scss",
+		"_sass/skins/_default.scss",
+		"_sass/skins/highlight/_tomorrow.scss",
+		"_sass/skins/highlight/tomorrow/_default.scss",
+		"_sass/skins/highlight/tomorrow/_highlight.scss",
+		"_sass/skins/highlight/_default.scss",
+		"_sass/common/_variables.scss",
+		"_sass/common/_function.scss",
+		"_sass/common/_classes.scss",
+		"_sass/common/classes/_animation.scss",
+		"_sass/common/classes/_transform.scss",
+		"_sass/common/classes/_transition.scss",
+		"_sass/common/classes/_user-select.scss",
+		"_sass/common/classes/_clearfix.scss",
+		"_sass/common/classes/_media.scss",
+		"_sass/common/classes/_clickable.scss",
+		"_sass/common/classes/_display.scss",
+		"_sass/common/classes/_flex.scss",
+		"_sass/common/classes/_horizontal-rules.scss",
+		"_sass/common/classes/_pseudo.scss",
+		"_sass/common/classes/_link.scss",
+		"_sass/common/classes/_text.scss",
+		"_sass/common/classes/_overflow.scss",
+		"_sass/common/classes/_shadow.scss",
+		"_sass/common/classes/_spacing.scss",
+		"_sass/common/classes/_split-line.scss",
+		"_sass/common/classes/_grid.scss",
+		"_sass/common/_reset.scss",
+		"_sass/common/_print.scss",
+		"_sass/common/components/_button.scss",
+		"_sass/common/components/_image.scss",
+		"_sass/common/components/_card.scss",
+		"_sass/common/components/_gallery.scss",
+		"_sass/common/components/_hero.scss",
+		"_sass/common/components/_menu.scss",
+		"_sass/common/components/_modal.scss",
+		"_sass/common/components/_toc.scss",
+		"_sass/common/components/_item.scss",
+		"_sass/common/components/_swiper.scss",
+		"_sass/animate/_fade-in.scss",
+		"_sass/animate/_fade-in-down.scss",
+		"_sass/animate/_fade-in-up.scss",
+		"_sass/components/_main.scss",
+		"_sass/components/_header.scss",
+		"_sass/components/_footer.scss",
+		"_sass/components/_article-list.scss",
+		"_sass/components/_article-info.scss",
+		"_sass/components/_article-header.scss",
+		"_sass/components/_article-content.scss",
+		"_sass/components/_article-footer.scss",
+		"_sass/components/_author-links.scss",
+		"_sass/components/_author-profile.scss",
+		"_sass/components/_tags.scss",
+		"_sass/components/_search.scss",
+		"_sass/components/_lightbox.scss",
+		"_sass/components/_extensions.scss",
+		"_sass/additional/_alert.scss",
+		"_sass/additional/_tag.scss",
+		"_sass/additional/_photo-frame.scss",
+		"_sass/layout/_base.scss",
+		"_sass/layout/_page.scss",
+		"_sass/layout/_article.scss",
+		"_sass/layout/_articles.scss",
+		"_sass/layout/_archive.scss",
+		"_sass/layout/_home.scss",
+		"_sass/layout/_landing.scss",
+		"_sass/layout/_404.scss",
+		"_sass/custom.scss"
+	],
+	"sourcesContent": [
+		"@import\n\n    \"skins/default\",\n    // \"skins/chocolate\",\n    // \"skins/dark\",\n    // \"skins/default\",\n    // \"skins/forest\",\n    // \"skins/ocean\",\n    // \"skins/orange\",\n\n    \"skins/highlight/default\",\n    // \"skins/highlight/tomorrow\",\n    // \"skins/highlight/tomorrow-night\",\n    // \"skins/highlight/tomorrow-night-eighties\",\n    // \"skins/highlight/tomorrow-night-blue\",\n    // \"skins/highlight/tomorrow-night-bright\",\n\n\n    \"common/variables\",\n    \"common/function\",\n    \"common/classes\",\n    \"common/reset\",\n    \"common/print\",\n    \"common/components/button\",\n    \"common/components/image\",\n    \"common/components/card\",\n    \"common/components/gallery\",\n    \"common/components/hero\",\n    \"common/components/menu\",\n    \"common/components/modal\",\n    \"common/components/toc\",\n    \"common/components/item\",\n    \"common/components/swiper\",\n\n    \"animate/fade-in\",\n    \"animate/fade-in-down\",\n    \"animate/fade-in-up\",\n\n    \"components/main\",\n    \"components/header\",\n    \"components/footer\",\n    \"components/article-list\",\n    \"components/article-info\",\n    \"components/article-header\",\n    \"components/article-content\",\n    \"components/article-footer\",\n    \"components/author-links\",\n    \"components/author-profile\",\n    \"components/tags\",\n    \"components/search\",\n    \"components/lightbox\",\n    \"components/extensions\",\n\n\n    \"additional/alert\",\n    \"additional/tag\",\n    \"additional/photo-frame\",\n\n    \"layout/base\",\n    \"layout/page\",\n\n    \"layout/article\",\n    \"layout/articles\",\n    \"layout/archive\",\n    \"layout/home\",\n    \"layout/landing\",\n    \"layout/404\",\n\n    \"custom\"\n;\n",
+		"///\n// Skin: Default\n// Author: Tian Qi\n// Email: kitian616@outlook.com\n///\n\n// main colors\n$main-color-1:     #fc4d50;\n$text-color-1:     #fff;\n\n$main-color-2:     #fca24d;\n$text-color-2:     #fff;\n\n$main-color-3:     #f2f2f2;\n$text-color-3:     #333;\n\n$main-color-theme-light: rgba(#000, .9);\n$main-color-theme-dark:  rgba(#fff, .9);\n\n// page background\n$background-color: #fff;\n\n// text colors\n$text-color-theme-light-d: #000;\n$text-color-theme-light:   #222;\n$text-color-theme-light-l: #888;\n\n$text-color-theme-dark-d:  #fff;\n$text-color-theme-dark:    rgba(#fff, .95);\n$text-color-theme-dark-l:  rgba(#fff, .85);\n\n$text-color-d:     $text-color-theme-light-d;\n$text-color:       $text-color-theme-light;\n$text-color-l:     $text-color-theme-light-l;\n\n$text-background-color: rgba(#000, .05);\n\n// header and footer colors\n$header-text-color: $text-color-3;\n$header-background: $main-color-3;\n\n$footer-text-color: $text-color-3;\n$footer-background: $main-color-3;\n\n// border and shadow colors\n$border-color:     mix(#000, $background-color, 20%);\n$border-color-l:   mix(#000, $background-color, 10%);\n$decorate-color:   rgba(#000, .1);\n$mask-color:       rgba(#000, .9);\n$select-color:     rgba($main-color-1, .5);\n\n// function colors\n$green:           #52c41a;\n$blue:            #1890ff;\n$yellow:          #fa8c16;\n$red:             #f5222d;\n$text-color-function: #fff;\n\n// logo colors\n$mail-color:       #0072c5;\n$facebook-color:   #4267b2;\n$twitter-color:    #1da1f2;\n$weibo-color:      #e6162d;\n$google-plus-color:#ea4335;\n$telegram-color:   #32afed;\n$medium-color:     #000;\n$zhihu-color:      #0084ff;\n$douban-color:     #42bd56;\n$linkedin-color:   #1074af;\n$github-color:     #000;\n$npm-color:        #fff;\n\n// highlight colors\n@import \"skins/highlight/tomorrow\";\n",
+		"@import \"./tomorrow/default\";\n@import \"./tomorrow/highlight\";\n",
+		"$highlight-background   : #f7f7f7;\n$highlight-foreground   : #4d4d4c;\n$highlight-comment      : #8e908c;\n$highlight-red          : #c82829;\n$highlight-orange       : #f5871f;\n$highlight-yellow       : #eab700;\n$highlight-green        : #718c00;\n$highlight-aqua         : #3e999f;\n$highlight-blue         : #4271ae;\n$highlight-purple       : #8959a8;\n",
+		"figure.highlight::before {\n  color: $highlight-comment !important;\n  background-color: $highlight-background !important;\n}\npre.lineno {\n  color: $highlight-comment !important;\n}\n.highlight > pre {\n  color: $highlight-foreground;\n  background-color: $highlight-background !important;\n  .c   { color: $highlight-comment; } /* Comment */\n  .err { color: $highlight-red; } /* Error */\n  .k   { color: $highlight-purple; } /* Keyword */\n  .l   { color: $highlight-orange; } /* Literal */\n  .n   { color: $highlight-foreground; } /* Name */\n  .o   { color: $highlight-aqua; } /* Operator */\n  .p   { color: $highlight-foreground; } /* Punctuation */\n  .cm  { color: $highlight-comment; } /* Comment.Multiline */\n  .cp  { color: $highlight-comment; } /* Comment.Preproc */\n  .c1  { color: $highlight-comment; } /* Comment.Single */\n  .cs  { color: $highlight-comment; } /* Comment.Special */\n  .gd  { color: $highlight-red; } /* Generic.Deleted */\n  .ge  { font-style: italic; } /* Generic.Emph */\n  .gh  { font-weight: bold; color: $highlight-foreground; } /* Generic.Heading */\n  .gi  { color: $highlight-green; } /* Generic.Inserted */\n  .gp  { font-weight: bold; color: $highlight-comment; } /* Generic.Prompt */\n  .gs  { font-weight: bold; } /* Generic.Strong */\n  .gu  { font-weight: bold; color: $highlight-aqua; } /* Generic.Subheading */\n  .kc  { color: $highlight-purple; } /* Keyword.Constant */\n  .kd  { color: $highlight-purple; } /* Keyword.Declaration */\n  .kn  { color: $highlight-aqua; } /* Keyword.Namespace */\n  .kp  { color: $highlight-purple; } /* Keyword.Pseudo */\n  .kr  { color: $highlight-purple; } /* Keyword.Reserved */\n  .kt  { color: $highlight-yellow; } /* Keyword.Type */\n  .ld  { color: $highlight-green; } /* Literal.Date */\n  .m   { color: $highlight-orange; } /* Literal.Number */\n  .s   { color: $highlight-green; } /* Literal.String */\n  .na  { color: $highlight-blue; } /* Name.Attribute */\n  .nb  { color: $highlight-foreground; } /* Name.Builtin */\n  .nc  { color: $highlight-yellow; } /* Name.Class */\n  .no  { color: $highlight-red; } /* Name.Constant */\n  .nd  { color: $highlight-aqua; } /* Name.Decorator */\n  .ni  { color: $highlight-foreground; } /* Name.Entity */\n  .ne  { color: $highlight-red; } /* Name.Exception */\n  .nf  { color: $highlight-blue; } /* Name.Function */\n  .nl  { color: $highlight-foreground; } /* Name.Label */\n  .nn  { color: $highlight-yellow; } /* Name.Namespace */\n  .nx  { color: $highlight-blue; } /* Name.Other */\n  .py  { color: $highlight-foreground; } /* Name.Property */\n  .nt  { color: $highlight-aqua; } /* Name.Tag */\n  .nv  { color: $highlight-red; } /* Name.Variable */\n  .ow  { color: $highlight-aqua; } /* Operator.Word */\n  .w   { color: $highlight-foreground; } /* Text.Whitespace */\n  .mf  { color: $highlight-orange; } /* Literal.Number.Float */\n  .mh  { color: $highlight-orange; } /* Literal.Number.Hex */\n  .mi  { color: $highlight-orange; } /* Literal.Number.Integer */\n  .mo  { color: $highlight-orange; } /* Literal.Number.Oct */\n  .sb  { color: $highlight-green; } /* Literal.String.Backtick */\n  .sc  { color: $highlight-foreground; } /* Literal.String.Char */\n  .sd  { color: $highlight-comment; } /* Literal.String.Doc */\n  .s2  { color: $highlight-green; } /* Literal.String.Double */\n  .se  { color: $highlight-orange; } /* Literal.String.Escape */\n  .sh  { color: $highlight-green; } /* Literal.String.Heredoc */\n  .si  { color: $highlight-orange; } /* Literal.String.Interpol */\n  .sx  { color: $highlight-green; } /* Literal.String.Other */\n  .sr  { color: $highlight-green; } /* Literal.String.Regex */\n  .s1  { color: $highlight-green; } /* Literal.String.Single */\n  .ss  { color: $highlight-green; } /* Literal.String.Symbol */\n  .bp  { color: $highlight-foreground; } /* Name.Builtin.Pseudo */\n  .vc  { color: $highlight-red; } /* Name.Variable.Class */\n  .vg  { color: $highlight-red; } /* Name.Variable.Global */\n  .vi  { color: $highlight-red; } /* Name.Variable.Instance */\n  .il  { color: $highlight-orange; } /* Literal.Number.Integer.Long */\n}\n",
+		"",
+		"$base: (\n  font-family:            (-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif),\n  font-family-code:       (Menlo, Monaco, Consolas, Andale Mono, lucida console, Courier New, monospace),\n\n  font-size-root:         16px,\n  font-size-root-sm:      14px,\n\n  font-size-xl:           1.5rem,\n  font-size-lg:           1.25rem,\n  font-size:              1rem,\n  font-size-sm:           .85rem,\n  font-size-xs:           .7rem,\n\n  font-size-h1-xl:        3.5rem,\n  font-size-h2-xl:        2.5rem,\n  font-size-h3-xl:        2rem,\n  font-size-h4-xl:        1.75rem,\n  font-size-h5-xl:        1.5rem,\n  font-size-h6-xl:        1.5rem,\n\n  font-size-h1-lg:        3rem,\n  font-size-h2-lg:        2rem,\n  font-size-h3-lg:        1.75rem,\n  font-size-h4-lg:        1.5rem,\n  font-size-h5-lg:        1.25rem,\n  font-size-h6-lg:        1.25rem,\n\n  font-size-h1:           2.5rem,\n  font-size-h2:           1.9rem,\n  font-size-h3:           1.5rem,\n  font-size-h4:           1.2rem,\n  font-size-h5:           1rem,\n  font-size-h6:           1rem,\n\n  font-size-h1-sm:        2rem,\n  font-size-h2-sm:        1.5rem,\n  font-size-h3-sm:        1.35rem,\n  font-size-h4-sm:        1.15rem,\n  font-size-h5-sm:        1rem,\n  font-size-h6-sm:        1rem,\n\n  font-size-h1-xs:        1.05rem,\n  font-size-h2-xs:        1rem,\n  font-size-h3-xs:        .95rem,\n  font-size-h4-xs:        .9rem,\n  font-size-h5-xs:        .85rem,\n  font-size-h6-xs:        .85rem,\n\n  font-weight:            400,\n  font-weight-bold:       700,\n\n  line-height-xl:         2,\n  line-height-lg:         1.8,\n  line-height:            1.6,\n  line-height-sm:         1.4,\n  line-height-xs:         1.2,\n\n  spacer:                 1rem,\n\n  border-radius-lg:       .8rem,\n  border-radius:          .4rem,\n  border-radius-sm:       .2rem\n);\n\n$spacers: (\n  0:                      0,\n  1:                      map-get($base, spacer) * .25,\n  2:                      map-get($base, spacer) * .5,\n  3:                      map-get($base, spacer),\n  4:                      map-get($base, spacer) * 1.5,\n  5:                      map-get($base, spacer) * 3\n);\n\n$z-indexes: (\n  actions: 996,\n  mask: 997,\n  sidebar: 998,\n  modal: 999\n);\n\n$layout: (\n  header-height:          5rem,\n  header-height-sm:       3rem,\n  content-max-width:      950px,\n  sidebar-width:          250px,\n  sidebar-header-height:  3rem,\n  aside-width:            220px\n);\n\n//     sm       md       lg\n// | ------ | ------ | ------ |\n// 0       500      1024      -\n\n$responsive: (\n  sm:                      0,\n  md:                      500px,\n  lg:                      1024px\n);\n\n$animation: (\n  duration:               .4s,\n  duration-sm:            .2s,\n  timing-function:        ease-in-out\n);\n\n$clickable: (\n  transition:             all .2s ease-in-out\n);\n\n$button-height-xl:        2.8rem;\n$button-height-lg:        2.3rem;\n$button-height:           1.9rem;\n$button-height-sm:        1.5rem;\n$button-height-xs:        1.2rem;\n\n$button: (\n  padding-y-xl:           ($button-height-xl - map-get($base, font-size-xl)) / 2,\n  padding-x-xl:           $button-height-xl / 3,\n  padding-y-lg:           ($button-height-lg - map-get($base, font-size-lg)) / 2,\n  padding-x-lg:           $button-height-lg / 3,\n  padding-y:              ($button-height - map-get($base, font-size)) / 2,\n  padding-x:              $button-height / 3,\n  padding-y-sm:           ($button-height-sm - map-get($base, font-size-sm)) / 2,\n  padding-x-sm:           $button-height-sm / 3,\n  padding-y-xs:           ($button-height-xs - map-get($base, font-size-xs)) / 2,\n  padding-x-xs:           $button-height-xs / 3,\n\n  pill-radius:            6rem,\n\n  circle-diameter-xl:     $button-height-xl,\n  circle-diameter-lg:     $button-height-lg,\n  circle-diameter:        $button-height,\n  circle-diameter-sm:     $button-height-sm,\n  circle-diameter-xs:     $button-height-xs,\n\n  font-weight:            map-get($base, font-weight-bold)\n);\n\n$image: (\n  width-xl:  20em,\n  width-lg:  16rem,\n  width:     12rem,\n  width-sm:  8rem,\n  width-xs:  4rem\n);\n\n$menu: (\n  horizontal-spacer: 1,\n  horizontal-item-vertical-spacer: 1\n);\n",
+		"@function get-color-theme($color) {\n  @if lightness($color) < 15% {\n    @return \"dark\";\n  } @else {\n    @return \"light\";\n  }\n}\n\n@function breakpoint-infix($name, $breakpoints: default) {\n  @if $breakpoints == default {\n    $breakpoints: $responsive;\n  }\n  $min: map-get($breakpoints, $name);\n  @return if($min != 0, \"#{$name}-\", \"\");\n}\n",
+		"/* stylelint-disable at-rule-name-space-after, at-rule-semicolon-space-before  */\n@charset \"utf-8\";\n@import\n  \"common/classes/animation\",\n  \"common/classes/transform\",\n  \"common/classes/transition\",\n  \"common/classes/user-select\",\n\n  \"common/classes/clearfix\",\n  \"common/classes/media\",\n  \"common/classes/clickable\",\n  \"common/classes/display\",\n  \"common/classes/flex\",\n  \"common/classes/horizontal-rules\",\n  \"common/classes/pseudo\",\n  \"common/classes/link\",\n  \"common/classes/text\",\n  \"common/classes/overflow\",\n  \"common/classes/shadow\",\n  \"common/classes/spacing\",\n  \"common/classes/split-line\",\n  \"common/classes/grid\"\n;\n/* stylelint-enable */\n",
+		"@mixin animation($value) {\n  -webkit-animation: $value;\n  animation: $value;\n}\n\n@mixin keyframes($name) {\n  @-webkit-keyframes #{$name} {\n    @content;\n  }\n  @keyframes #{$name} {\n    @content;\n  }\n}\n",
+		"@mixin transform($value) {\n  -webkit-transform: $value;\n  transform: $value;\n}\n",
+		"@mixin transition($value) {\n  -webkit-transition: $value;\n  transition: $value;\n}\n",
+		"@mixin user-select($value) {\n  -webkit-user-select: $value;\n  -moz-user-select: $value;\n  -ms-user-select: $value;\n  user-select: $value;\n}\n",
+		"@mixin clearfix() {\n  &::after {\n    display: table;\n    clear: both;\n    content: \"\";\n  }\n}\n\n.clearfix {\n  @include clearfix();\n}\n\n.left {\n  float: left;\n}\n\n.right {\n  float: right;\n}\n",
+		"@mixin media-breakpoint-down($name, $breakpoints: default) {\n  @if $breakpoints == default {\n    $breakpoints: $responsive;\n  }\n  @media (max-width: map-get($breakpoints, $name) - 1) {\n    @content;\n  }\n}\n\n@mixin media-breakpoint-up($name, $breakpoints: default) {\n  @if $breakpoints == default {\n    $breakpoints: $responsive;\n  }\n  @media (min-width: map-get($breakpoints, $name)) {\n    @content;\n  }\n}\n",
+		"@mixin clickable($clr, $bg-clr, $hover-clr: default, $hover-bg-clr: default, $active-clr: default, $active-bg-clr: default, $focus-clr: default, $focus-bg-clr: default, $theme: default, $ignore-path: default) {\n\n  @if $theme == default {\n    @if $bg-clr == null and $hover-bg-clr == null {\n      @if $hover-clr == default {\n        $theme: get-color-theme($clr);\n      } @else {\n        $theme: get-color-theme($hover-clr);\n      }\n    } @else {\n      @if $hover-bg-clr == default {\n        $theme: get-color-theme($bg-clr);\n      } @else {\n        $theme: get-color-theme($hover-bg-clr);\n      }\n    }\n  }\n\n  @if $ignore-path == default {\n    $ignore-path: false;\n  } @else {\n    $ignore-path: true;\n  }\n\n  @include transition(map-get($clickable, transition));\n  @if $ignore-path == false {\n    svg {\n      path {\n        @include transition(map-get($clickable, transition));\n      }\n    }\n  }\n\n  // hover\n  @if $hover-clr == default {\n    @if $hover-bg-clr == null {\n      @if $theme == \"light\" {\n        $hover-clr: darken($clr, 14%);\n      }\n      @if $theme == \"dark\" {\n        $hover-clr: lighten($clr, 18%);\n      }\n    } @else if $hover-bg-clr == default {\n      $hover-clr: $clr;\n    }\n  }\n\n  @if $hover-bg-clr == default {\n    @if $theme == \"light\" {\n      $hover-bg-clr: darken($bg-clr, 14%);\n    }\n    @if $theme == \"dark\" {\n      $hover-bg-clr: lighten($bg-clr, 18%);\n    }\n  }\n\n  // active\n  @if $active-clr == default {\n    @if $active-bg-clr == null {\n      @if $theme == \"light\" {\n        $active-clr: darken($hover-clr, 15%);\n      }\n      @if $theme == \"dark\" {\n        $active-clr: lighten($hover-clr, 16%);\n      }\n    } @else if $active-bg-clr == default {\n      $active-clr: $hover-clr;\n    }\n  }\n\n  @if $active-bg-clr == default {\n    @if $theme == \"light\" {\n      $active-bg-clr: darken($hover-bg-clr, 15%);\n    }\n    @if $theme == \"dark\" {\n      $active-bg-clr: lighten($hover-bg-clr, 16%);\n    }\n  }\n\n  // focus\n  @if $focus-clr == default {\n    @if $focus-bg-clr == null {\n      $focus-clr: $hover-clr;\n    } @else if $hover-bg-clr == default {\n      $focus-clr: $hover-clr;\n    }\n  }\n\n  @if $focus-bg-clr == default {\n    $focus-bg-clr: $hover-bg-clr;\n  }\n\n  @include plain() {\n    color: $clr;\n    @if $bg-clr {\n      background-color: $bg-clr;\n    }\n    @if $ignore-path == false {\n      svg path {\n        fill: $clr;\n      }\n    }\n  }\n  @include hover() {\n    color: $hover-clr;\n    @if $hover-bg-clr {\n      background-color: $hover-bg-clr;\n    }\n    @if $ignore-path == false {\n      svg path {\n        fill: $hover-clr;\n      }\n    }\n  }\n  @include active() {\n    color: $active-clr;\n    @if $active-bg-clr {\n      background-color: $active-bg-clr;\n    }\n    @if $ignore-path == false {\n      svg path {\n        fill: $active-clr;\n      }\n    }\n  }\n  @include focus() {\n    color: $focus-clr;\n    @if $focus-bg-clr{\n      background-color: $focus-bg-clr;\n      box-shadow: 0 0 0 2px rgba($focus-bg-clr, .4);\n    }\n    @if $ignore-path == false {\n      svg path {\n        fill: $focus-clr;\n      }\n    }\n  }\n  @include disabled() {\n    @if $theme == \"light\" {\n      color: rgba($clr, .2) !important;\n    }\n    @if $theme == \"dark\" {\n      color: rgba($clr, .4) !important;\n    }\n    @if $bg-clr {\n      background-color: $bg-clr !important;\n    }\n    @if $ignore-path == false {\n      svg path {\n        @if $theme == \"light\" {\n          fill: rgba($clr, .2) !important;\n        }\n        @if $theme == \"dark\" {\n          fill: rgba($clr, .4) !important;\n        }\n      }\n    }\n  }\n}\n",
+		"@each $breakpoint in map-keys($responsive) {\n  @include media-breakpoint-up($breakpoint) {\n    .d-#{breakpoint-infix($breakpoint)}none {\n      display: none !important;\n    }\n  }\n}\n\n.d-print-none {\n  @media print {\n    display: none !important;\n  }\n}\n",
+		"// Flexbox Mixins\n// http://philipwalton.github.io/solved-by-flexbox/\n// https://github.com/philipwalton/solved-by-flexbox\n//\n// Copyright (c) 2013 Brian Franco\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n// This is a set of mixins for those who want to mess around with flexbox\n// using the native support of current browsers. For full support table\n// check: http://caniuse.com/flexbox\n//\n// Basically this will use:\n//\n// * Fallback, old syntax (IE10, mobile webkit browsers - no wrapping)\n// * Final standards syntax (FF, Safari, Chrome, IE11, Opera)\n//\n// This was inspired by:\n//\n// * http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/\n//\n// With help from:\n//\n// * http://w3.org/tr/css3-flexbox/\n// * http://the-echoplex.net/flexyboxes/\n// * http://msdn.microsoft.com/en-us/library/ie/hh772069(v=vs.85).aspx\n// * http://css-tricks.com/using-flexbox/\n// * http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/\n// * https://developer.mozilla.org/en-us/docs/web/guide/css/flexible_boxes\n\n//----------------------------------------------------------------------\n\n// Flexbox Containers\n//\n// The 'flex' value causes an element to generate a block-level flex\n// container box.\n//\n// The 'inline-flex' value causes an element to generate a inline-level\n// flex container box.\n//\n// display: flex | inline-flex\n//\n// http://w3.org/tr/css3-flexbox/#flex-containers\n//\n// (Placeholder selectors for each type, for those who rather @extend)\n\n@mixin flexbox {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-flex;\n  display: -ms-flexbox;\n  display: flex;\n}\n\n%flexbox { @include flexbox; }\n\n//----------------------------------\n\n@mixin inline-flex {\n  display: -webkit-inline-box;\n  display: -webkit-inline-flex;\n  display: -moz-inline-flex;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n}\n\n%inline-flex { @include inline-flex; }\n\n//----------------------------------------------------------------------\n\n// Flexbox Direction\n//\n// The 'flex-direction' property specifies how flex items are placed in\n// the flex container, by setting the direction of the flex container's\n// main axis. This determines the direction that flex items are laid out in.\n//\n// Values: row | row-reverse | column | column-reverse\n// Default: row\n//\n// http://w3.org/tr/css3-flexbox/#flex-direction-property\n\n@mixin flex-direction($value: row) {\n  @if $value == row-reverse {\n    -webkit-box-direction: reverse;\n    -webkit-box-orient: horizontal;\n  } @else if $value == column {\n    -webkit-box-direction: normal;\n    -webkit-box-orient: vertical;\n  } @else if $value == column-reverse {\n    -webkit-box-direction: reverse;\n    -webkit-box-orient: vertical;\n  } @else {\n    -webkit-box-direction: normal;\n    -webkit-box-orient: horizontal;\n  }\n  -webkit-flex-direction: $value;\n  -moz-flex-direction: $value;\n  -ms-flex-direction: $value;\n  flex-direction: $value;\n}\n// Shorter version:\n@mixin flex-dir($args...) { @include flex-direction($args...); }\n\n//----------------------------------------------------------------------\n\n// Flexbox Wrap\n//\n// The 'flex-wrap' property controls whether the flex container is single-line\n// or multi-line, and the direction of the cross-axis, which determines\n// the direction new lines are stacked in.\n//\n// Values: nowrap | wrap | wrap-reverse\n// Default: nowrap\n//\n// http://w3.org/tr/css3-flexbox/#flex-wrap-property\n\n@mixin flex-wrap($value: nowrap) {\n  // No Webkit Box fallback.\n  -webkit-flex-wrap: $value;\n  -moz-flex-wrap: $value;\n  @if $value == nowrap {\n    -ms-flex-wrap: none;\n  } @else {\n    -ms-flex-wrap: $value;\n  }\n  flex-wrap: $value;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Flow (shorthand)\n//\n// The 'flex-flow' property is a shorthand for setting the 'flex-direction'\n// and 'flex-wrap' properties, which together define the flex container's\n// main and cross axes.\n//\n// Values: <flex-direction> | <flex-wrap>\n// Default: row nowrap\n//\n// http://w3.org/tr/css3-flexbox/#flex-flow-property\n\n@mixin flex-flow($values: (row nowrap)) {\n  // No Webkit Box fallback.\n  -webkit-flex-flow: $values;\n  -moz-flex-flow: $values;\n  -ms-flex-flow: $values;\n  flex-flow: $values;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Order\n//\n// The 'order' property controls the order in which flex items appear within\n// their flex container, by assigning them to ordinal groups.\n//\n// Default: 0\n//\n// http://w3.org/tr/css3-flexbox/#order-property\n\n@mixin order($int: 0) {\n  -ms-flex-order: $int;\n  -webkit-order: $int;\n  -moz-order: $int;\n  order: $int;\n  -webkit-box-ordinal-group: $int + 1;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Grow\n//\n// The 'flex-grow' property sets the flex grow factor. Negative numbers\n// are invalid.\n//\n// Default: 0\n//\n// http://w3.org/tr/css3-flexbox/#flex-grow-property\n\n@mixin flex-grow($int: 0) {\n  -webkit-box-flex: $int;\n  -webkit-flex-grow: $int;\n  -moz-flex-grow: $int;\n  -ms-flex-positive: $int;\n  flex-grow: $int;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Shrink\n//\n// The 'flex-shrink' property sets the flex shrink factor. Negative numbers\n// are invalid.\n//\n// Default: 1\n//\n// http://w3.org/tr/css3-flexbox/#flex-shrink-property\n\n@mixin flex-shrink($int: 1) {\n  -webkit-flex-shrink: $int;\n  -moz-flex-shrink: $int;\n  -ms-flex-negative: $int;\n  flex-shrink: $int;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Basis\n//\n// The 'flex-basis' property sets the flex basis. Negative lengths are invalid.\n//\n// Values: Like \"width\"\n// Default: auto\n//\n// http://www.w3.org/TR/css3-flexbox/#flex-basis-property\n\n@mixin flex-basis($value: auto) {\n  -webkit-flex-basis: $value;\n  -moz-flex-basis: $value;\n  -ms-flex-preferred-size: $value;\n  flex-basis: $value;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox \"Flex\" (shorthand)\n//\n// The 'flex' property specifies the components of a flexible length: the\n// flex grow factor and flex shrink factor, and the flex basis. When an\n// element is a flex item, 'flex' is consulted instead of the main size\n// property to determine the main size of the element. If an element is\n// not a flex item, 'flex' has no effect.\n//\n// Values: none | <flex-grow> <flex-shrink> || <flex-basis>\n// Default: See individual properties (1 1 0).\n//\n// http://w3.org/tr/css3-flexbox/#flex-property\n\n@mixin flex($fg: 1, $fs: null, $fb: null) {\n\n  // Set a variable to be used by box-flex properties\n  $fg-boxflex: $fg;\n\n  // Box-Flex only supports a flex-grow value so let's grab the\n  // first item in the list and just return that.\n  @if type-of($fg) == \"list\" {\n    $fg-boxflex: nth($fg, 1);\n  }\n\n  -webkit-box-flex: $fg-boxflex;\n  -webkit-flex: $fg $fs $fb;\n  -moz-box-flex: $fg-boxflex;\n  -moz-flex: $fg $fs $fb;\n  -ms-flex: $fg $fs $fb;\n  flex: $fg $fs $fb;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Justify Content\n//\n// The 'justify-content' property aligns flex items along the main axis\n// of the current line of the flex container. This is done after any flexible\n// lengths and any auto margins have been resolved. Typically it helps distribute\n// extra free space leftover when either all the flex items on a line are\n// inflexible, or are flexible but have reached their maximum size. It also\n// exerts some control over the alignment of items when they overflow the line.\n//\n// Note: 'space-*' values not supported in older syntaxes.\n//\n// Values: flex-start | flex-end | center | space-between | space-around\n// Default: flex-start\n//\n// http://w3.org/tr/css3-flexbox/#justify-content-property\n\n@mixin justify-content($value: flex-start) {\n  @if $value == flex-start {\n    -webkit-box-pack: start;\n    -ms-flex-pack: start;\n  } @else if $value == flex-end {\n    -webkit-box-pack: end;\n    -ms-flex-pack: end;\n  } @else if $value == space-between {\n    -webkit-box-pack: justify;\n    -ms-flex-pack: justify;\n  } @else if $value == space-around {\n    -ms-flex-pack: distribute;\n  } @else {\n    -webkit-box-pack: $value;\n    -ms-flex-pack: $value;\n  }\n  -webkit-justify-content: $value;\n  -moz-justify-content: $value;\n  justify-content: $value;\n}\n// Shorter version:\n@mixin flex-just($args...) { @include justify-content($args...); }\n\n//----------------------------------------------------------------------\n\n// Flexbox Align Items\n//\n// Flex items can be aligned in the cross axis of the current line of the\n// flex container, similar to 'justify-content' but in the perpendicular\n// direction. 'align-items' sets the default alignment for all of the flex\n// container's items, including anonymous flex items. 'align-self' allows\n// this default alignment to be overridden for individual flex items. (For\n// anonymous flex items, 'align-self' always matches the value of 'align-items'\n// on their associated flex container.)\n//\n// Values: flex-start | flex-end | center | baseline | stretch\n// Default: stretch\n//\n// http://w3.org/tr/css3-flexbox/#align-items-property\n\n@mixin align-items($value: stretch) {\n  @if $value == flex-start {\n    -webkit-box-align: start;\n    -ms-flex-align: start;\n  } @else if $value == flex-end {\n    -webkit-box-align: end;\n    -ms-flex-align: end;\n  } @else {\n    -webkit-box-align: $value;\n    -ms-flex-align: $value;\n  }\n  -webkit-align-items: $value;\n  -moz-align-items: $value;\n  align-items: $value;\n}\n\n//----------------------------------\n\n// Flexbox Align Self\n//\n// Values: auto | flex-start | flex-end | center | baseline | stretch\n// Default: auto\n\n@mixin align-self($value: auto) {\n  // No Webkit Box Fallback.\n  -webkit-align-self: $value;\n  -moz-align-self: $value;\n  @if $value == flex-start {\n    -ms-flex-item-align: start;\n  } @else if $value == flex-end {\n    -ms-flex-item-align: end;\n  } @else {\n    -ms-flex-item-align: $value;\n  }\n  align-self: $value;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Align Content\n//\n// The 'align-content' property aligns a flex container's lines within the\n// flex container when there is extra space in the cross-axis, similar to\n// how 'justify-content' aligns individual items within the main-axis. Note,\n// this property has no effect when the flexbox has only a single line.\n//\n// Values: flex-start | flex-end | center | space-between | space-around | stretch\n// Default: stretch\n//\n// http://w3.org/tr/css3-flexbox/#align-content-property\n\n@mixin align-content($value: stretch) {\n  // No Webkit Box Fallback.\n  -webkit-align-content: $value;\n  -moz-align-content: $value;\n  @if $value == flex-start {\n    -ms-flex-line-pack: start;\n  } @else if $value == flex-end {\n    -ms-flex-line-pack: end;\n  } @else {\n    -ms-flex-line-pack: $value;\n  }\n  align-content: $value;\n}\n",
+		"@mixin horizontal-rules() {\n  &::before {\n    display: block;\n    font-size: map-get($base, font-size-h2);\n    color: $text-color-l;\n    text-align: center;\n    letter-spacing: map-get($spacers, 4);\n    content: \"...\";\n  }\n}\n\n.horizontal-rules {\n  @include horizontal-rules();\n}\n",
+		"@mixin plain() {\n  &,\n  &:link,\n  &:visited {\n    @content;\n  }\n}\n\n@mixin hover() {\n  .root[data-is-touch=\"false\"] &:hover {\n    @content;\n  }\n}\n\n@mixin active() {\n  .root[data-is-touch] &.active,\n  .root[data-is-touch] &:active {\n    @content;\n  }\n}\n\n@mixin focus() {\n  .root[data-is-touch] &.focus {\n    @content;\n  }\n}\n\n@mixin disabled() {\n  &.disabled,\n  &:disabled {\n    @content;\n  }\n}\n",
+		"@mixin link-colors($clr, $hover-clr: default, $active-clr: default, $focus-clr: null, $theme: default, $ignore-path: false) {\n  @include plain() {\n    text-decoration: none;\n  }\n  @include hover() {\n    text-decoration: underline;\n  }\n  @include active() {\n    text-decoration: none;\n  }\n  @include clickable($clr, null, $hover-clr, null, $active-clr, null, $focus-clr, null, $theme, $ignore-path);\n}\n",
+		"@mixin text-light {\n  color: $text-color-theme-light;\n  h1, h2, h3 {\n    color: $text-color-theme-light-d;\n  }\n  h4, h5 {\n    color: $text-color-theme-light;\n  }\n  h6 {\n    color: $text-color-theme-light-l;\n  }\n  a:not(.button) {\n    @include link-colors($text-color-theme-light, $main-color-1);\n  }\n}\n@mixin text-dark {\n  color: $text-color-theme-dark;\n  h1, h2, h3 {\n    color: $text-color-theme-dark-d;\n  }\n  h4, h5 {\n    color: $text-color-theme-dark;\n  }\n  h6 {\n    color: $text-color-theme-dark-l;\n  }\n  a:not(.button) {\n    @include link-colors($text-color-theme-dark, $main-color-1);\n  }\n}\n\n.text--light {\n  @include text-light();\n}\n.text--dark {\n  @include text-dark();\n}\n",
+		"@mixin overflow($overflow: auto, $direction: default) {\n  @if $direction == default {\n    overflow: $overflow;\n  } @else if $direction == \"x\" {\n    @if $overflow == auto {\n      overflow: hidden;\n    }\n    overflow-x: $overflow;\n  } @else if $direction == \"y\" {\n    @if $overflow == auto {\n      overflow: hidden;\n    }\n    overflow-y: $overflow;\n  }\n  @if $overflow == auto {\n    -webkit-overflow-scrolling: touch;\n  }\n}\n\n.of-auto {\n  @include overflow(auto);\n}\n\n.of-hidden {\n  @include overflow(hidden);\n}\n",
+		"@mixin box-shadow($level: default, $color: default) {\n  @if $color == default {\n    $color: #000;\n  }\n  @if $level == 0 {\n    box-shadow: none;\n  }\n  @if $level == 1 or $level == default {\n    box-shadow: 0 4px 8px rgba($color, .23), 0 1px 3px rgba($color, .08), 0 6px 12px rgba($color, .02);\n  }\n  @if $level == 2 {\n    box-shadow: 0 8px 16px rgba($color, .23), 0 2px 6px rgba($color, .08), 0 12px 24px rgba($color, .02);\n  }\n}\n\n.box-shadow-1 {\n  @include box-shadow();\n}\n\n.box-shadow-2 {\n  @include box-shadow(2);\n}\n",
+		"@mixin make-spacing($property, $side, $spacer, $negative: false) {\n\n  $css_property: null;\n  $css_sides: null;\n\n  @if ($property == \"m\") {\n    $css_property: \"margin\";\n  } @else if ($property == \"p\") {\n    $css_property: \"padding\";\n  }\n\n  @if ($side == \"t\") {\n    $css_sides: (\"top\");\n  }\n  @else if ($side == \"b\") {\n    $css_sides: (\"bottom\");\n  }\n  @else if ($side == \"l\") {\n    $css_sides: (\"left\");\n  }\n  @else if ($side == \"r\") {\n    $css_sides: (\"right\");\n  }\n  @else if ($side == \"x\") {\n    $css_sides: (\"left\", \"right\");\n  }\n  @else if ($side == \"y\") {\n    $css_sides: (\"top\", \"bottom\");\n  }\n  @else if ($side == \"\") {\n    $css_sides: (\"\");\n  }\n\n  @each $side in $css_sides {\n    @if ($spacer == \"auto\") {\n      @if ($side == \"\") {\n        #{$css_property}: auto;\n      } @else {\n        #{$css_property}-#{$side}: auto;\n      }\n    } @else {\n      @if ($side == \"\") {\n        @if ($negative == true) {\n          #{$css_property}: - map-get($spacers, $spacer);\n        } @else {\n          #{$css_property}: map-get($spacers, $spacer);\n        }\n      } @else {\n        @if ($negative == true) {\n          #{$css_property}-#{$side}: - map-get($spacers, $spacer);\n        } @else {\n          #{$css_property}-#{$side}: map-get($spacers, $spacer);\n        }\n      }\n    }\n  }\n}\n\n@mixin make-spacings() {\n  $propertys: (\"m\", \"p\");\n  $sides: (\"t\", \"b\", \"l\", \"r\", \"x\", \"y\", \"\");\n  $spacers: (0, 1, 2, 3, 4, 5);\n\n  @each $property in $propertys {\n    @each $side in $sides {\n      @each $spacer in $spacers {\n        .#{$property}#{$side}-#{$spacer} {\n          @include make-spacing($property, $side, $spacer);\n        }\n      }\n    }\n  }\n\n  @each $side in $sides {\n    .m#{$side}-auto {\n      @include make-spacing(\"m\", $side, \"auto\");\n    }\n  }\n}\n\n@include make-spacings();\n",
+		"@mixin split-line($direction: default, $width: default, $color: default) {\n  @if $direction == default {\n    $direction: top;\n  }\n  @if $color == default {\n    $color: $border-color-l;\n  }\n  @if $width == default {\n    $width: 1px;\n  }\n  border: 0 solid $color;\n  @if $direction == top {\n    border-top-width: $width;\n  }\n  @if $direction == right {\n    border-right-width: $width;\n  }\n  @if $direction == bottom {\n    border-bottom-width: $width;\n  }\n  @if $direction == left {\n    border-left-width: $width;\n  }\n}\n",
+		"$grid-columns: 12;\n\n.grid-container {\n  @include overflow(hidden);\n}\n.cell {\n  min-width: 0;\n}\n\n@mixin make-cell($columns) {\n  @if $columns == \"auto\" {\n    @include flex(1 1 0);\n    width: auto;\n  } @else if $columns == \"shrink\" {\n    @include flex(0 0 auto);\n    width: auto;\n  } @else if $columns == \"stretch\" {\n    @include flex(1);\n  } @else {\n    @include flex(none);\n    width: percentage($columns / $grid-columns);\n  }\n}\n\n@mixin make-grid-cell($columns, $breakpoint) {\n  @include media-breakpoint-up($breakpoint) {\n    .cell--#{breakpoint-infix($breakpoint)}#{$columns} {\n      @include make-cell($columns);\n    }\n  }\n}\n\n.grid {\n  @include flexbox();\n  @include flex-wrap(wrap);\n  & > {\n    @each $breakpoint in map-keys($responsive) {\n      @for $i from 1 through $grid-columns {\n        @include make-grid-cell($i, $breakpoint);\n      }\n      @include make-grid-cell(\"auto\", $breakpoint);\n      @include make-grid-cell(\"shrink\", $breakpoint);\n      @include make-grid-cell(\"stretch\", $breakpoint);\n    }\n  }\n}\n\n.grid--reverse {\n  flex-direction: row-reverse;\n}\n\n@mixin make-grid() {\n  $types: (\"p\");\n  $directions: (\"x\", \"y\", \"\");\n  $spacers: (0, 1, 2, 3, 4, 5);\n\n  @each $type in $types {\n    @each $direction in $directions {\n      @each $spacer in $spacers {\n        @if $direction == \"\" {\n          .grid--#{$type}-#{$spacer} {\n            @include make-spacing(\"m\", \"\", $spacer, true);\n            .cell {\n              @include make-spacing($type, \"\", $spacer);\n            }\n          }\n        } @else {\n          .grid--#{$type}#{$direction}-#{$spacer} {\n            @include make-spacing(\"m\", $direction, $spacer, true);\n            .cell {\n              @include make-spacing($type, $direction, $spacer);\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n@include make-grid();\n",
+		"@mixin block-elements {\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6,\n  p,\n  hr,\n  blockquote,\n  figure,\n  pre,\n  .highlighter-rouge,\n  ul,\n  ol,\n  dl,\n  table,\n  .footnotes {\n    @content;\n  }\n}\n@mixin heading-elements {\n  h1, h2, h3, h4, h5, h6 {\n    @content;\n  }\n}\n\n*,\n::before,\n::after {\n  box-sizing: border-box;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n/**\n * 1. Prevent adjustments of font size after orientation changes in iOS.\n **/\n\nhtml {\n  font-size: map-get($base, font-size-root);\n  -webkit-text-size-adjust: 100%; /* 1 */\n  @media print {\n    font-size: map-get($base, font-size-root-sm);\n  }\n}\n\nbody {\n  padding: 0;\n  margin: 0;\n  font: map-get($base, font-weight) #{map-get($base, font-size)}/#{map-get($base, line-height)} map-get($base, font-family);\n  ::-moz-selection {\n    background: $select-color;\n  }\n  ::-webkit-selection {\n    background: $select-color;\n  }\n  ::selection {\n    background: $select-color;\n  }\n}\n\n@include block-elements() {\n  padding: 0;\n  margin: map-get($spacers, 2) 0;\n}\n\ninput, textarea, select, button {\n  font: map-get($base, font-weight) #{map-get($base, font-size)}/#{map-get($base, line-height)} map-get($base, font-family);\n  color: $text-color;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nstrong {\n  font-weight: map-get($base, font-weight-bold);\n}\n\nh1 {\n  font-size: map-get($base, font-size-h1);\n  color: $text-color-d;\n  @include media-breakpoint-down(md) {\n    font-size: map-get($base, font-size-h1-sm);\n  }\n}\n\nh2 {\n  font-size: map-get($base, font-size-h2);\n  color: $text-color-d;\n  @include media-breakpoint-down(md) {\n    font-size: map-get($base, font-size-h2-sm);\n  }\n}\n\nh3 {\n  font-size: map-get($base, font-size-h3);\n  color: $text-color-d;\n  @include media-breakpoint-down(md) {\n    font-size: map-get($base, font-size-h3-sm);\n  }\n}\n\nh4 {\n  font-size: map-get($base, font-size-h4);\n  color: $text-color;\n  @include media-breakpoint-down(md) {\n    font-size: map-get($base, font-size-h4-sm);\n  }\n}\n\nh5 {\n  font-size: map-get($base, font-size-h5);\n  color: $text-color;\n  @include media-breakpoint-down(md) {\n    font-size: map-get($base, font-size-h5-sm);\n  }\n}\n\nh6 {\n  font-size: map-get($base, font-size-h6);\n  color: $text-color-l;\n  @include media-breakpoint-down(md) {\n    font-size: map-get($base, font-size-h6-sm);\n  }\n}\n\na {\n  font-weight: map-get($base, font-weight-bold);\n  @include link-colors($main-color-1);\n}\n\npre, code {\n  font-family: map-get($base, font-family-code);\n}\n\ncode {\n  font-size: map-get($base, font-size-xs);\n  line-height: map-get($base, line-height-sm);\n}\n\nfigure > img {\n  display: block;\n}\n\nfigcaption {\n  font-size: map-get($base, font-size-sm);\n}\n\nbutton {\n  padding: 0;\n  margin: 0;\n  font-size: map-get($spacers, 3);\n  cursor: pointer;\n  background-color: transparent;\n  border-width: 0;\n  outline: none;\n}\n\ninput {\n  &::-ms-clear {\n    display: none;\n  }\n  &:focus {\n    outline: none;\n  }\n}\n\n// mermaid\n.mermaidTooltip {\n  display: none;\n}\n",
+		"@media print {\n  a {\n    @include plain() {\n      text-decoration: underline;\n    }\n    @include hover() {\n      text-decoration: underline;\n    }\n    @include active() {\n      text-decoration: underline;\n    }\n  }\n\n  img,\n  tr,\n  pre,\n  blockquote {\n    page-break-inside: avoid;\n  }\n}\n",
+		"@mixin button() {\n  display: inline-block;\n  font-weight: map-get($button, font-weight);\n  line-height: 1 !important;\n  text-decoration: none !important;\n  cursor: pointer;\n  outline: none;\n  @include user-select(none);\n  svg {\n    width: 1rem;\n    height: 1rem;\n  }\n  @include disabled() {\n    cursor: not-allowed;\n  }\n}\n\n.button {\n  @include button();\n}\n\n.button--primary {\n  @include clickable($text-color-1, $main-color-1);\n}\n\n.button--secondary {\n  @include clickable($text-color-3, $main-color-3);\n}\n\n.button--success {\n  @include clickable($text-color-function, $green);\n}\n\n.button--info {\n  @include clickable($text-color-function, $blue);\n}\n\n.button--warning {\n  @include clickable($text-color-function, $yellow);\n}\n\n.button--error {\n  @include clickable($text-color-function, $red);\n}\n\n.button--theme-light {\n  @include clickable($text-color-theme-dark, $main-color-theme-light);\n}\n\n.button--theme-dark {\n  @include clickable($text-color-theme-light, $main-color-theme-dark);\n}\n\n.button--outline-primary {\n  color: $main-color-1;\n  border: 1px solid $main-color-1;\n  @include clickable($main-color-1, transparent, $text-color-1, $main-color-1);\n}\n\n.button--outline-secondary {\n  color: $main-color-3;\n  border: 1px solid $main-color-3;\n  @include clickable($main-color-3, transparent, $text-color-3, $main-color-3);\n}\n\n.button--outline-success {\n  color: $green;\n  border: 1px solid $green;\n  @include clickable($green, transparent, $text-color-function, $green);\n}\n\n.button--outline-info {\n  color: $blue;\n  border: 1px solid $blue;\n  @include clickable($blue, transparent, $text-color-function, $blue);\n}\n\n.button--outline-warning {\n  color: $yellow;\n  border: 1px solid $yellow;\n  @include clickable($yellow, transparent, $text-color-function, $yellow);\n}\n\n.button--outline-error {\n  color: $red;\n  border: 1px solid $red;\n  @include clickable($red, transparent, $text-color-function, $red);\n}\n\n.button--outline-theme-light {\n  color: $main-color-theme-light;\n  border: 1px solid $main-color-theme-light;\n  @include clickable($main-color-theme-light, transparent, $text-color-theme-dark, $main-color-theme-light);\n}\n\n.button--outline-theme-dark {\n  color: $main-color-theme-dark;\n  border: 1px solid $main-color-theme-dark;\n  @include clickable($main-color-theme-dark, transparent, $text-color-theme-light, $main-color-theme-dark);\n}\n\n.button--pill {\n  border-radius: map-get($button, pill-radius);\n  @extend .button--md;\n}\n\n.button--rounded {\n  border-radius: map-get($base, border-radius);\n  @extend .button--md;\n}\n\n.button--circle {\n  @include inline-flex();\n  @include justify-content(center);\n  @include align-items(center);\n  border-radius: 50%;\n  @extend .button--md;\n}\n\n.button--md {\n  padding: map-get($button, padding-y) map-get($button, padding-x);\n  font-size: map-get($base, font-size);\n  &.button--circle {\n    width: map-get($button, circle-diameter);\n    height: map-get($button, circle-diameter);\n  }\n}\n\n.button--xs {\n  padding: map-get($button, padding-y-xs) map-get($button, padding-x-xs);\n  font-size: map-get($base, font-size-xs);\n  &.button--circle {\n    width: map-get($button, circle-diameter-xs);\n    height: map-get($button, circle-diameter-xs);\n  }\n}\n\n.button--sm {\n  padding: map-get($button, padding-y-sm) map-get($button, padding-x-sm);\n  font-size: map-get($base, font-size-sm);\n  &.button--circle {\n    width: map-get($button, circle-diameter-sm);\n    height: map-get($button, circle-diameter-sm);\n  }\n}\n\n.button--lg {\n  padding: map-get($button, padding-y-lg) map-get($button, padding-x-lg);\n  font-size: map-get($base, font-size-lg);\n  &.button--circle {\n    width: map-get($button, circle-diameter-lg);\n    height: map-get($button, circle-diameter-lg);\n  }\n}\n\n.button--xl {\n  padding: map-get($button, padding-y-xl) map-get($button, padding-x-xl);\n  font-size: map-get($base, font-size-xl);\n  &.button--circle {\n    width: map-get($button, circle-diameter-xl);\n    height: map-get($button, circle-diameter-xl);\n  }\n}\n",
+		".image {\n  max-width: 100%;\n  @extend .image--md;\n}\n.image--md {\n  width: map-get($image, width);\n}\n.image--xl {\n  width: map-get($image, width-xl);\n}\n.image--lg {\n  width: map-get($image, width-lg);\n}\n.image--sm {\n  width: map-get($image, width-sm);\n}\n.image--xs {\n  width: map-get($image, width-xs);\n}\n",
+		"\n.card {\n  max-width: 18rem;\n  border-radius: map-get($base, border-radius);\n  @include box-shadow();\n  @include transition(box-shadow map-get($animation, duration) map-get($animation, timing-function));\n  & > :first-child {\n    border-top-left-radius: map-get($base, border-radius);\n    border-top-right-radius: map-get($base, border-radius);\n  }\n  & > :last-child {\n    border-bottom-right-radius: map-get($base, border-radius);\n    border-bottom-left-radius: map-get($base, border-radius);\n  }\n}\n\n.cell {\n  & > .card {\n    max-width: unset;\n  }\n}\n\n.card__content {\n  padding: map-get($spacers, 2) map-get($spacers, 3);\n}\n\n.card__header, .card__header > a {\n  @include link-colors($text-color-d, $main-color-1);\n}\n\n.card__image {\n  position: relative;\n  width: 100%;\n  & > img {\n    display: block;\n    width: 100%;\n    height: auto;\n    border-radius: inherit;\n  }\n  & > .overlay {\n    position: absolute;\n    width: 100%;\n    max-height: 100%;\n    padding: map-get($spacers, 2);\n    a {\n      text-decoration: none !important;\n    }\n  }\n  & > .overlay, & > .overlay--top {\n    top: 0;\n    bottom: auto;\n    border-top-left-radius: inherit;\n    border-top-right-radius: inherit;\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  & > .overlay--bottom {\n    top: auto;\n    bottom: 0;\n    border-top-left-radius: 0;\n    border-top-right-radius: 0;\n    border-bottom-right-radius: inherit;\n    border-bottom-left-radius: inherit;\n  }\n  & > .overlay--full {\n    top: 0;\n    bottom: 0;\n  }\n  & > .overlay, & > .overlay--dark {\n    @extend .text--dark;\n    background-color: rgba(#000, .4);\n  }\n  & > .overlay--light {\n    @extend .text--light;\n    background: rgba(#fff, .4);\n  }\n}\n\n.card--clickable {\n  cursor: pointer;\n  @include hover() {\n    @include box-shadow(2);\n    .card__image {\n      & > img {\n        height: inherit;\n      }\n    }\n  }\n  @include transition(map-get($clickable, transition));\n}\n\n.card--flat {\n  @include box-shadow(0);\n  .card__image {\n    & > img {\n      border-radius: map-get($base, border-radius);\n    }\n  }\n  .card__content {\n    padding-top: 0;\n    padding-left: 0;\n  }\n}\n",
+		".gallery {\n  height: 100%;\n  @include flexbox();\n  @include flex-direction(column);\n}\n\n.gallery__swiper {\n  @include flex(1);\n}\n\n.gallery-item {\n  @include flexbox();\n  @include align-items(center);\n  @include justify-content(center);\n  height: 100%;\n  overflow: hidden;\n}\n\n.gallery-item__main {\n  display: block;\n}\n",
+		".hero {\n  background-position: 50% 50%;\n  @include flexbox();\n  @include flex-direction(column);\n  @include justify-content(center);\n  h1 { font-size: map-get($base, font-size-h1-xl); }\n  h2 { font-size: map-get($base, font-size-h2-xl); }\n  h3 { font-size: map-get($base, font-size-h3-xl); }\n  h4 { font-size: map-get($base, font-size-h4-xl); }\n  h5 { font-size: map-get($base, font-size-h5-xl); }\n  h6 { font-size: map-get($base, font-size-h6-xl); }\n  p  { font-size: map-get($base, font-size-xl); }\n  @include media-breakpoint-down(lg) {\n    h1 { font-size: map-get($base, font-size-h1-lg); }\n    h2 { font-size: map-get($base, font-size-h2-lg); }\n    h3 { font-size: map-get($base, font-size-h3-lg); }\n    h4 { font-size: map-get($base, font-size-h4-lg); }\n    h5 { font-size: map-get($base, font-size-h5-lg); }\n    h6 { font-size: map-get($base, font-size-h6-lg); }\n    p  { font-size: map-get($base, font-size-lg); }\n  }\n  @include media-breakpoint-down(md) {\n    h1 { font-size: map-get($base, font-size-h1-sm); }\n    h2 { font-size: map-get($base, font-size-h2-sm); }\n    h3 { font-size: map-get($base, font-size-h3-sm); }\n    h4 { font-size: map-get($base, font-size-h4-sm); }\n    h5 { font-size: map-get($base, font-size-h5-sm); }\n    h6 { font-size: map-get($base, font-size-h6-sm); }\n    p  { font-size: map-get($base, font-size); }\n  }\n  background-size: cover;\n\n}\n\n.hero--center {\n  text-align: center;\n  .menu {\n    @extend .menu--center;\n  }\n}\n\n.hero--light {\n  @extend .text--light;\n}\n\n.hero--dark {\n  @extend .text--dark;\n}\n\n.hero__content {\n  margin: map-get($spacers, 5);\n  @include media-breakpoint-down(lg) {\n    margin: map-get($spacers, 5) map-get($spacers, 4);\n  }\n  @include media-breakpoint-down(md) {\n    margin: map-get($spacers, 4) map-get($spacers, 3);\n  }\n}\n\n.heros {\n  & > .hero {\n    margin: map-get($spacers, 5);\n    @include media-breakpoint-down(lg) {\n      margin: map-get($spacers, 3);\n    }\n    @include media-breakpoint-down(md) {\n      margin: map-get($spacers, 2) 0;\n    }\n  }\n}\n",
+		"@mixin menu-direction($direction: default) {\n  @if $direction == default {\n    $direction: \"horizontal\";\n  }\n  @if $direction == \"vertical\" {\n    @include flex-direction(column);\n  } @else {\n    @include flex-direction(row);\n  }\n}\n\n@mixin menu($horizontal-spacer: default, $horizontal-item-vertical-spacer: default, $wrap: default) {\n  @if $horizontal-spacer == default {\n    $horizontal-spacer: map-get($menu, horizontal-spacer);\n  }\n  @if $horizontal-item-vertical-spacer == default {\n    $horizontal-item-vertical-spacer: map-get($menu, horizontal-item-vertical-spacer);\n  }\n  @if $wrap == default {\n    $wrap: wrap;\n  }\n  @include flexbox();\n  @include flex-wrap($wrap);\n  margin-top: 0;\n  margin-bottom: 0;\n  & > li {\n    @if $horizontal-item-vertical-spacer {\n      margin-top: map-get($spacers, $horizontal-item-vertical-spacer);\n      margin-bottom: map-get($spacers, $horizontal-item-vertical-spacer);\n    }\n    margin-right: map-get($spacers, $horizontal-spacer);\n    list-style-type: none;\n    &:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n.menu {\n  @include menu();\n  @include menu-direction();\n  @include align-items(center);\n}\n\n.menu--vertical {\n  @include menu-direction(\"vertical\");\n  @include align-items(normal);\n  & > li {\n    margin-right: 0;\n  }\n}\n\n.menu--inline {\n  @include inline-flex();\n}\n\n.menu--center {\n  @include justify-content(center);\n}\n\n.menu--nowrap {\n  @include flex-wrap(nowrap);\n}\n\n.menu--grow {\n  @include flex-grow(1);\n}\n",
+		"@mixin modal($z-index: default, $color: default, $background-color: default) {\n  @if $z-index == default {\n    $z-index: map-get($z-indexes, modal);\n  }\n  @if $color == default {\n    $color: $text-color-theme-dark;\n  }\n  @if $background-color == default {\n    $background-color: $mask-color;\n  }\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: $z-index;\n  width: 100%;\n  height: 100%;\n  color: $color;\n  touch-action: none;\n  background-color: $background-color;\n  opacity: 0;\n  @include transform(translate(100%, 0));\n  @include transition(#{opacity map-get($animation, duration) map-get($animation, timing-function),\n  transform 0s map-get($animation, duration) map-get($animation, timing-function)});\n}\n@mixin modal--show() {\n  opacity: 1;\n  @include transform(translate(0, 0));\n  @include transition(#{opacity map-get($animation, duration) map-get($animation, timing-function)});\n}\n\n.modal {\n  @include modal();\n}\n.modal--show {\n  @include modal--show();\n}\n.modal--overflow {\n  @include overflow(auto);\n}\n",
+		"ul.toc {\n  display: block;\n  margin: 0;\n  color: $text-color;\n  list-style-type: none;\n  & > li {\n    margin: map-get($spacers, 1) / 2 0;\n    a {\n      display: inline-block;\n      margin: map-get($spacers, 1) / 4 0;\n      text-decoration: none !important;\n    }\n  }\n  .toc-h1,\n  .toc-h2,\n  .toc-h3,\n  .toc-h4,\n  .toc-h5,\n  .toc-h6 {\n    a {\n      @include link-colors($text-color, $main-color-1);\n    }\n    &.active {\n      a {\n        @include link-colors($main-color-1);\n      }\n    }\n  }\n\n  .toc-h2,\n  .toc-h3,\n  .toc-h4,\n  .toc-h5,\n  .toc-h6 {\n    &, a {\n      font-size: map-get($base, font-size-xs);\n      font-weight: map-get($base, font-weight);\n      line-height: map-get($base, line-height-xs);\n    }\n  }\n  .toc-h1 {\n    @include split-line(bottom);\n    padding: map-get($spacers, 2) 0 map-get($spacers, 1) 0;\n    margin-bottom: map-get($spacers, 2);\n    color: $text-color-d;\n    &, a {\n      font-size: map-get($base, font-size-sm);\n      font-weight: map-get($base, font-weight-bold);\n      line-height: map-get($base, line-height-sm);\n    }\n    a {\n      @include link-colors($text-color-d, $main-color-1);\n    }\n  }\n  .toc-h2 {\n    &, a {\n      font-weight: map-get($base, font-weight-bold);\n    }\n  }\n  .toc-h3 {\n    margin-left: map-get($spacers, 3);\n  }\n  .toc-h4 {\n    margin-left: map-get($spacers, 3) * 2;\n  }\n  .toc-h5,\n  .toc-h6 {\n    margin-left: map-get($spacers, 3) * 3;\n  }\n  .toc-h6 {\n    color: $text-color-l;\n    a {\n      @include link-colors($text-color-l, $main-color-1);\n    }\n  }\n}\n\nul.toc--ellipsis {\n  & > li {\n    @include overflow(hidden);\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n}\n\nul.toc--navigator {\n  & > li {\n    a {\n      padding-left: map-get($spacers, 2);\n      margin: map-get($spacers, 1) 0;\n    }\n    &.active {\n      a {\n        margin-left: -4px;\n        @include split-line(left, 4px, $main-color-1);\n      }\n    }\n  }\n  .toc-h2,\n  .toc-h3,\n  .toc-h4 {\n    color: $text-color-l;\n    a {\n      @include link-colors($text-color-l);\n    }\n  }\n  .toc-h1 {\n    &, a {\n      font-size: map-get($base, font-size);\n      line-height: map-get($base, line-height);\n    }\n    color: $text-color;\n    a {\n      @include link-colors($text-color-d);\n    }\n  }\n  .toc-h2 {\n    &, a {\n      font-size: map-get($base, font-size-sm);\n      font-weight: map-get($base, font-weight-bold);\n      line-height: map-get($base, line-height-sm);\n    }\n  }\n}\n",
+		".item {\n  @include flexbox();\n  @include media-breakpoint-down(md) {\n    @include flex-direction(column);\n  }\n}\n\n.item__image {\n  margin-right: map-get($spacers, 3);\n  & + .item__content {\n    & > :first-child {\n      margin-top: 0;\n      & > :first-child {\n        margin-top: 0;\n      }\n    }\n  }\n  @include media-breakpoint-down(md) {\n    margin-right: 0;\n  }\n}\n\n.item__content {\n  @include flex(1);\n  min-width: 0;\n}\n\na > .item__header, a.item__header, .item__header > a {\n  @include link-colors($text-color-d, $main-color-1);\n}\n\n.item__meta {\n  color: $text-color-l;\n}\n\n.item__description {\n  &, .article__content {\n    font-size: map-get($base, font-size-sm);\n    line-height: map-get($base, line-height);\n    @include block-elements() {\n      margin-top: map-get($spacers, 2);\n      margin-bottom: map-get($spacers, 2);\n    }\n    @include heading-elements() {\n      margin-top: map-get($spacers, 3);\n    }\n    h1, h2, h3 {\n      color: $text-color;\n    }\n    h1, h2 {\n      padding: 0;\n      border: none;\n    }\n    h1 {\n      font-size: map-get($base, font-size-h1-xs);\n    }\n    h2 {\n      font-size: map-get($base, font-size-h2-xs);\n    }\n    h3 {\n      font-size: map-get($base, font-size-h3-xs);\n    }\n    h4 {\n      font-size: map-get($base, font-size-h4-xs);\n    }\n    h5 {\n      font-size: map-get($base, font-size-h5-xs);\n    }\n    h6 {\n      font-size: map-get($base, font-size-h6-xs);\n    }\n    img {\n      max-height: 32rem;\n      @include media-breakpoint-down(md) {\n        max-height: 14rem;\n      }\n    }\n  }\n}\n\n.items {\n  & > .item {\n    &:not(:last-child) {\n      margin-bottom: map-get($spacers, 2);\n    }\n  }\n}\n\n.items--divided {\n  & > .item {\n    &:not(:first-child) {\n      padding-top: map-get($spacers, 4);\n    }\n    &:not(:last-child) {\n      padding-bottom: map-get($spacers, 4);\n      @include split-line(bottom);\n    }\n    list-style-type: none;\n  }\n}\n",
+		".swiper {\n  position: relative;\n  @include overflow(hidden);\n}\n\n.swiper__wrapper, .swiper__slide {\n  width: 100%;\n  height: 100%;\n}\n\n.swiper__wrapper {\n  @include flexbox();\n}\n\n.swiper__wrapper--animation {\n  @include transition(transform map-get($animation, duration) map-get($animation, timing-function));\n}\n\n.swiper__slide {\n  @include flex-shrink(0);\n  & > img {\n    max-width: 100%;\n  }\n}\n\n.swiper__button {\n  position: absolute;\n  top: 50%;\n  @extend .button, .button--circle;\n  @include transform(translate(0, -50%));\n  @include clickable($text-color-d, rgba($main-color-3, .4));\n}\n\n.swiper--light .swiper__button {\n  @include clickable($text-color-theme-light, rgba($main-color-theme-dark, .4));\n}\n\n.swiper--dark .swiper__button {\n  @include clickable($text-color-theme-dark, rgba($main-color-theme-light, .4));\n}\n\n.swiper__button--prev {\n  left: 10px;\n}\n\n.swiper__button--next {\n  right: 10px;\n}\n",
+		"@include keyframes(fade-in) {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n",
+		"@include keyframes(fade-in-down) {\n  from {\n    opacity: 0;\n    @include transform(translateY(-2rem));\n  }\n  to {\n    opacity: 1;\n    @include transform(translateY(0));\n  }\n}\n",
+		"@include keyframes(fade-in-up) {\n  from {\n    opacity: 0;\n    @include transform(translateY(2rem));\n  }\n  to {\n    opacity: 1;\n    @include transform(translateY(0));\n  }\n}\n",
+		".main {\n  width: 100%;\n  max-width: map-get($layout, content-max-width);\n  padding: 0 map-get($spacers, 5);\n  margin: 0 auto;\n  @include media-breakpoint-down(lg) {\n    padding: 0 map-get($spacers, 4);\n  }\n  @include media-breakpoint-down(md) {\n    padding: 0 map-get($spacers, 3);\n  }\n}\n\n.has-aside {\n  .main {\n    max-width: map-get($layout, content-max-width) + map-get($layout, aside-width);\n    @include media-breakpoint-down(lg) {\n      max-width: map-get($layout, content-max-width);\n    }\n  }\n}\n\n.full-width {\n  .main {\n    width: 100%;\n    max-width: 100%;\n  }\n}\n",
+		".header {\n  background: $header-background;\n  a {\n    font-weight: map-get($base, font-weight);\n    text-decoration: none !important;\n    @include link-colors($header-text-color, $main-color-1);\n  }\n  .main {\n    @include flexbox();\n    @include media-breakpoint-down(md) {\n      @include flex-direction(column);\n    }\n  }\n}\n\n.header--dark {\n  @extend .text--dark;\n  background: rgba(#000, .15);\n  .navigation__item--active {\n    &::after {\n      @include split-line(bottom, 4px, $text-color-theme-dark);\n    }\n  }\n}\n\n.header--light {\n  @extend .text--light;\n  background: rgba(#fff, .15);\n  .navigation__item--active {\n    &::after {\n      @include split-line(bottom, 4px, $text-color-theme-light);\n    }\n  }\n}\n\n.header__title {\n  @include menu(3, 0);\n  @include align-items(center);\n  @include flex-wrap(nowrap);\n  @include flex(1);\n  height: map-get($layout, header-height);\n  margin-right: map-get($spacers, 3);\n  white-space: nowrap;\n  @include media-breakpoint-down(md) {\n    height: auto;\n    margin-right: 0;\n  }\n  & > .header__brand {\n    @include flex(1);\n    @include media-breakpoint-down(md) {\n      height: map-get($layout, header-height-sm);\n    }\n  }\n  & > .search-button {\n    display: none;\n    margin-left: map-get($spacers, 2);\n    @include media-breakpoint-down(md) {\n      @include flexbox();\n    }\n  }\n}\n\n.header__brand {\n  @include flexbox();\n  @include align-items(center);\n  & > svg {\n    width: map-get($base, font-size-h4) * 1.6;\n    height: map-get($base, font-size-h4) * 1.6;\n    margin-right: map-get($spacers, 3);\n    vertical-align: middle;\n    @include media-breakpoint-down(md) {\n      width: map-get($base, font-size-h4) * 1.2;\n      height: map-get($base, font-size-h4) * 1.2;\n    }\n  }\n  & > a {\n    display: inline-block;\n    font-size: map-get($base, font-size-h4);\n    @include media-breakpoint-down(md) {\n      font-size: map-get($base, font-size-h4-small);\n    }\n  }\n}\n\n.navigation {\n  @include overflow(auto, \"x\");\n  & > ul {\n    height: map-get($layout, header-height);\n    padding-bottom: 0;\n    margin: 0;\n    @include media-breakpoint-down(md) {\n      padding-bottom: 4px;\n      margin: -4px 0 0 0;\n    }\n    @include menu(3, 2, nowrap);\n    @include align-items(center);\n    @include media-breakpoint-down(md) {\n      height: auto;\n    }\n    .search-button {\n      @include media-breakpoint-down(md) {\n        display: none;\n      }\n    }\n  }\n}\n\n.navigation__item {\n  &::after {\n    display: block;\n    margin-bottom: -4px;\n    content: \"\";\n    @include split-line(bottom, 4px, transparent);\n  }\n}\n.navigation__item--active {\n  a {\n    @include link-colors($main-color-1, $main-color-1);\n  }\n  &::after {\n    @include split-line(bottom, 4px, $main-color-1);\n  }\n}\n",
+		"/**\n * Site Info\n */\n\n.footer {\n  @include flexbox();\n  @include align-items(center);\n  color: $footer-text-color;\n  background: $footer-background;\n  a {\n    @include link-colors ($footer-text-color, $main-color-1);\n  }\n  .site-info {\n    font-size: map-get($base, font-size-xs);\n    text-align: center;\n    .menu {\n      line-height: map-get($base, line-height-xs);\n      & > * {\n        &:not(:last-child) {\n          @include split-line(right, default, $footer-text-color);\n          padding-right: map-get($spacers, 1);\n          margin-right: map-get($spacers, 1);\n        }\n      }\n    }\n  }\n}\n.footer__author-links {\n  @include overflow(auto);\n  .author-links {\n    text-align: center;\n  }\n}\n",
+		".article-list {\n  .item__meta {\n    padding: 0 map-get($spacers, 3) 0 0;\n    font-family: map-get($base, font-family-code);\n    font-size: map-get($base, font-size-sm);\n    white-space: nowrap;\n  }\n  &.grid--sm {\n    .card__header {\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n  }\n}\n.article-list__group-header {\n  margin-top: map-get($spacers, 3);\n}\n",
+		".article__info {\n  font-size: map-get($base, font-size-sm);\n  color: $text-color-l;\n  .left-col {\n    float: left;\n    @include media-breakpoint-down(md) {\n      float: none;\n    }\n  }\n  .right-col {\n    float: right;\n    margin-left: map-get($button, padding-x-sm);\n    @include media-breakpoint-down(md) {\n      float: none;\n    }\n    & > li {\n      &:not(:last-child) {\n        @include split-line(right, default, $text-color-l);\n        padding-right: map-get($spacers, 2);\n        margin-right: map-get($spacers, 2);\n        line-height: map-get($base, line-height-xs);\n      }\n    }\n  }\n}\n",
+		".article__header {\n  margin-top: map-get($spacers, 5);\n  margin-bottom: map-get($spacers, 4);\n  @include media-breakpoint-down(md) {\n    margin-top: map-get($spacers, 4);\n  }\n  header, h1 {\n    display: inline;\n  }\n  h1 {\n    word-wrap: break-word;\n  }\n  .split-space {\n    @include user-select(none);\n  }\n  .edit-on-github {\n    text-decoration: none !important;\n  }\n}\n\n.article__header--overlay {\n  .overlay {\n    min-height: 36rem;\n    padding-top: map-get($spacers, 5) * 2;\n    padding-bottom: map-get($spacers, 5) * 2;\n    @include media-breakpoint-down(md) {\n      min-height: 29rem;\n      padding-top: map-get($spacers, 5);\n      padding-bottom: map-get($spacers, 5);\n    }\n  }\n  .overlay__excerpt {\n    font-size: map-get($base, font-size-h3-xl);\n    @include media-breakpoint-down(lg) {\n      font-size: map-get($base, font-size-h3-lg);\n    }\n    @include media-breakpoint-down(md) {\n      font-size: map-get($base, font-size-h3-sm);\n    }\n    font-weight: map-get($base, font-weight-bold);\n  }\n\n  .article__header {\n    margin-top: 0;\n  }\n}\n\n.article__header--cover {\n  width: 100%;\n}\n",
+		".article__content {\n  line-height: map-get($base, line-height-lg);\n  word-wrap: break-word;\n  @media print {\n    line-height: map-get($base, line-height);\n  }\n  @include block-elements() {\n    margin: map-get($spacers, 3) 0;\n    @media print {\n      margin: map-get($spacers, 2) 0;\n    }\n  }\n  @include heading-elements() {\n    position: relative;\n    margin-top: map-get($spacers, 4);\n    @media print {\n      margin-top: map-get($spacers, 3);\n    }\n    & > .anchor {\n      @include link-colors($border-color, $main-color-1);\n      margin-left: map-get($spacers, 1);\n      text-decoration: none;\n      visibility: hidden;\n      opacity: 0;\n      & > i {\n        font-size: map-get($base, font-size-sm);\n      }\n    }\n    @include hover() {\n      & > .anchor {\n        cursor: pointer;\n        visibility: visible;\n        opacity: 1;\n      }\n    }\n  }\n  h1,\n  h2 {\n    @include split-line(bottom);\n  }\n  hr {\n    border: none;\n    @include horizontal-rules();\n  }\n  blockquote {\n    padding-left: map-get($spacers, 3);\n    font-size: map-get($base, font-size-sm);\n    color: $text-color-l;\n    @include split-line(left, 4px, $border-color);\n    p {\n      margin: map-get($spacers, 2) 0;\n    }\n    & > :last-child {\n      margin-bottom: 0;\n    }\n  }\n  img:not(.emoji) {\n    max-width: 100%;\n    vertical-align: middle;\n  }\n  .emoji {\n    display: inline-block;\n    width: map-get($base, line-height-lg) * .7rem;\n    height: map-get($base, line-height-lg) * .7rem;\n    vertical-align: text-bottom;\n  }\n  .footnotes {\n    @include split-line();\n    margin-top: map-get($spacers, 5);\n    @media print {\n      margin-top: map-get($spacers, 2) * 2;\n    }\n  }\n  code {\n    padding: map-get($spacers, 1) map-get($spacers, 2);\n    background-color: $text-background-color;\n    border-radius: map-get($base, border-radius);\n    span {\n      padding: 0;\n      margin: 0;\n    }\n  }\n  pre {\n    @include overflow(auto);\n    & > code {\n      padding: 0;\n      word-wrap: normal;\n      background-color: transparent;\n      &.language-mermaid, &.language-chart {\n        svg {\n          width: 100%;\n        }\n        display: none;\n        &[data-processed] {\n          display: block;\n        }\n      }\n    }\n  }\n  .highlighter-rouge > .highlight, figure.highlight {\n    & > pre {\n      padding: map-get($spacers, 3) 0 map-get($spacers, 3) map-get($spacers, 3);\n      margin: 0;\n      background-color: $text-background-color;\n      border-radius: map-get($base, border-radius);\n      & > code {\n        display: block;\n      }\n    }\n  }\n  figure.highlight {\n    &::before {\n      display: block;\n      padding: map-get($spacers, 2) map-get($spacers, 3) map-get($spacers, 2) 0;\n      font-weight: map-get($base, font-weight-bold);\n      color: $decorate-color;\n      text-align: right;\n      text-transform: uppercase;\n      content: attr(data-lang);\n      background-color: $text-background-color;\n      border-top-left-radius: map-get($base, border-radius);\n      border-top-right-radius: map-get($base, border-radius);\n    }\n    & > pre {\n      padding-top: 0;\n      border-top-left-radius: 0;\n      border-top-right-radius: 0;\n      & > code {\n        & > .rouge-table {\n          width: auto;\n          margin: 0 0 #{- map-get($spacers, 3)} #{- map-get($spacers, 3)};\n          tbody, tr, td {\n            padding-top: 0;\n            padding-bottom: 0;\n            border: none;\n          }\n          & > tbody {\n            @include flexbox;\n            & > tr {\n              width: 100%;\n              @include flexbox;\n              & > .code {\n                padding: 0 0 map-get($spacers, 3) map-get($spacers, 2);\n                @include overflow(auto);\n              }\n            }\n          }\n          tbody td {\n            &.gl {\n              padding-left: map-get($spacers, 3);\n            }\n            & > pre {\n              display: block;\n              margin: 0;\n              border-radius: 0;\n              @include overflow(auto);\n              &.lineno {\n                color: $text-color-l;\n                @include user-select(none);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n  ul, ol {\n    margin-left: map-get($spacers, 4);\n    ul, ol {\n      margin-top: 0;\n      margin-bottom: 0;\n    }\n    li {\n      p {\n        margin: map-get($spacers, 2);\n        @media print {\n          margin: map-get($spacers, 1);\n        }\n      }\n    }\n  }\n  dl {\n    dt, dd {\n      p {\n        margin: map-get($spacers, 2);\n        @media print {\n          margin: map-get($spacers, 1);\n        }\n      }\n    }\n    dt {\n      font-weight: map-get($base, font-weight-bold);\n    }\n    dd {\n      margin-left: 2rem;\n    }\n  }\n  ul.task-list {\n    margin-left: 0;\n    list-style-type: none;\n    ul, ol {\n      margin-left: map-get($spacers, 4);\n    }\n  }\n  table {\n    display: block;\n    width: 100%;\n    border-collapse: collapse;\n    @include overflow(auto);\n    thead, tfoot {\n      background-color: $text-background-color;\n    }\n    th, td {\n      padding: map-get($spacers, 2);\n      border: 1px solid $border-color-l;\n    }\n    th {\n      font-weight: map-get($base, font-weight-bold);\n    }\n  }\n}\n",
+		".article__footer {\n  margin: map-get($spacers, 4) 0;\n  font-size: map-get($base, font-size-sm);\n}\n\n.article__license, .article__subscribe {\n  a {\n    @include link-colors($text-color, $main-color-1);\n  }\n}\n\n.article__license {\n  color: $text-color-l;\n  img {\n    height: map-get($base, font-size) * 1.6;\n  }\n}\n",
+		".author-links {\n  & > ul {\n    margin: 0;\n    & > li > {\n      .mail-button {\n        @include clickable($text-color-1, $mail-color);\n      }\n      .facebook-button {\n        @include clickable($text-color-1, $facebook-color);\n      }\n      .twitter-button {\n        @include clickable($text-color-1, $twitter-color);\n      }\n      .weibo-button {\n        @include clickable($text-color-1, $weibo-color);\n      }\n      .googlepluse-button {\n        @include clickable($text-color-1, $google-plus-color);\n      }\n      .telegram-button {\n        @include clickable($text-color-1, $telegram-color);\n      }\n      .medium-button {\n        @include clickable($text-color-1, $medium-color);\n      }\n      .zhihu-button {\n        @include clickable($text-color-1, $zhihu-color);\n      }\n      .douban-button {\n        @include clickable($text-color-1, $douban-color);\n      }\n      .linkedin-button {\n        @include clickable($text-color-1, $linkedin-color);\n      }\n      .github-button {\n        @include clickable($text-color-1, $github-color);\n      }\n      .npm-button {\n        @include clickable($text-color-1, $npm-color);\n      }\n    }\n  }\n}\n",
+		".author-profile {\n  max-width: 25rem;\n  padding: map-get($spacers, 2) map-get($spacers, 3);\n  margin: map-get($spacers, 4) 0;\n  font-size: map-get($base, font-size-sm);\n  background-color: $text-background-color;\n  @include media-breakpoint-down(md) {\n    text-align: center;\n  }\n}\n.author-profile__avatar {\n  width: 5rem;\n  height: 5rem;\n  margin-top: map-get($spacers, 2);\n  border-radius: 50%;\n}\n.author-profile__name {\n  font-size: map-get($base, font-size-lg);\n  font-weight: map-get($base, font-weight-bold);\n  a {\n    @include link-colors($text-color, $main-color-1);\n  }\n}\n.author-profile__links {\n  @include overflow(auto);\n}\n",
+		".site-tags {\n  .tag-button {\n    @include clickable($text-color-3, $main-color-3, default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);\n    & > .tag-button__count {\n      display: inline-block;\n      margin-left: map-get($spacers, 1);\n      font-size: map-get($base, font-size-xs);\n      line-height: 1;\n      vertical-align: top;\n    }\n  }\n  .tag-button-1 {\n    @include clickable($text-color-1, rgba($main-color-1, .4), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);\n  }\n  .tag-button-2 {\n    @include clickable($text-color-1, rgba($main-color-1, .55), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);\n  }\n  .tag-button-3 {\n    @include clickable($text-color-1, rgba($main-color-1, .7), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);\n  }\n  .tag-button-4 {\n    @include clickable($text-color-1, rgba($main-color-1, .9), default, default, $text-color-2,$main-color-2, $text-color-2,$main-color-2);\n  }\n}\n",
+		".search {\n  @include overflow(auto);\n\n}\n.search--google-custom-search-engine {\n  .main {\n    padding-top: map-get($spacers, 4);\n    padding-bottom: map-get($spacers, 4);\n    @include media-breakpoint-down(md) {\n      position: absolute;\n      padding: 0;\n    }\n  }\n}\n\n.search__header {\n  margin-top: map-get($spacers, 4);\n  font-size: map-get($base, font-size-h1);\n  font-weight: map-get($base, font-weight-bold);\n  color: $text-color-d;\n  .search--light & {\n    color: $text-color-theme-light-d;\n  }\n  .search--dark & {\n    color: $text-color-theme-dark-d;\n  }\n  @include media-breakpoint-down(md) {\n    display: none;\n  }\n}\n\n.search-bar {\n  @include flexbox();\n  margin: map-get($spacers, 3) 0 map-get($spacers, 4) 0;\n}\n\n.search-box {\n  position: relative;\n  width: 100%;\n  max-width: 22rem;\n  @include media-breakpoint-down(md) {\n    width: 100%;\n    max-width: none;\n  }\n  & > input {\n    display: inline-block;\n    width: 100%;\n    height: $button-height-lg;\n    padding: 0 2rem;\n    margin: 0;\n    line-height: 1 !important;\n    color: $text-color;\n    background-color: transparent;\n    border: 2px solid $border-color;\n    border-radius: map-get($button, pill-radius);\n    -webkit-appearance: none; /* fix iOS don't display box-shadow properly */\n    @include transition(box-shadow map-get($animation, duration) map-get($animation, timing-function));\n    @include focus {\n      box-shadow: 0 0 0 2px rgba($border-color, .4);\n    }\n    .search--light & {\n      color: $text-color-theme-light;\n      border-color: $text-color-theme-light;\n      @include focus {\n        box-shadow: 0 0 0 2px rgba($text-color-theme-light, .4);\n      }\n    }\n    .search--dark & {\n      color: $text-color-theme-dark;\n      border-color: $text-color-theme-dark;\n      @include focus {\n        box-shadow: 0 0 0 2px rgba($text-color-theme-dark, .4);\n      }\n    }\n  }\n  & > .search-box__icon-search {\n    color: $text-color-l;\n    .search--light & {\n      color: $text-color-theme-light-l;\n    }\n    .search--dark & {\n      color: $text-color-theme-dark-l;\n    }\n  }\n  & > .search-box__icon-clear {\n    & > a {\n      @include link-colors($text-color);\n      .search--light & {\n        @include link-colors($text-color-theme-light);\n      }\n      .search--dark & {\n        @include link-colors($text-color-theme-dark);\n      }\n      cursor: pointer;\n    }\n  }\n  & > .search-box__icon-search, & > .search-box__icon-clear {\n    position: absolute;\n    width: $button-height-lg;\n    height: $button-height-lg;\n    line-height: $button-height-lg;\n    text-align: center;\n    vertical-align: middle;\n  }\n  &.not-empty > .search-box__icon-clear {\n    display: block;\n  }\n  & > .search-box__icon-clear {\n    top: 0;\n    right: 0;\n    display: none;\n  }\n  & > .search-box__icon-search {\n    top: 0;\n    left: 0;\n  }\n}\n\n.search__cancel {\n  margin-left: map-get($spacers, 2);\n  font-weight: map-get($base, font-weight-bold);\n  white-space: nowrap;\n}\n\n.search-result {\n  margin: map-get($spacers, 4) 0;\n  font-size: map-get($base, font-size-sm);\n  line-height: map-get($base, line-height-sm);\n}\n\n.search-result__header {\n  margin: map-get($spacers, 3) 0 map-get($spacers, 2) 0;\n  font-size: map-get($base, font-size-lg);\n  font-weight: map-get($base, font-weight-bold);\n  color: $text-color-l;\n  text-transform: uppercase;\n  .search--light & {\n    color: $text-color-theme-light-l;\n  }\n  .search--dark & {\n    color: $text-color-theme-dark-l;\n  }\n}\n\n.search-result__item {\n  list-style-type: none;\n  a {\n    padding: map-get($spacers, 1) map-get($spacers, 3);\n    @include transition(none);\n    @include clickable($text-color, transparent, $text-color-3, $main-color-3);\n    .search--light & {\n      @include clickable($text-color-theme-light, transparent, $text-color-theme-dark, $main-color-theme-light);\n    }\n    .search--dark & {\n      @include clickable($text-color-theme-dark, transparent, $text-color-theme-light, $main-color-theme-dark);\n    }\n  }\n  &.active {\n    a {\n      @include plain() {\n        color: $text-color-3;\n        background-color: $main-color-3;\n        .search--light & {\n          color: $text-color-theme-dark;\n          background-color: $main-color-theme-light;\n        }\n        .search--dark & {\n          color: $text-color-theme-light;\n          background-color: $main-color-theme-dark;\n        }\n      }\n      @include active() {\n        @include transition(map-get($clickable, transition));\n      }\n    }\n  }\n}\n\n// google search\n.gsc-control-cse {\n  *,\n  ::before,\n  ::after {\n    box-sizing: initial;\n  }\n}\n",
+		".popup-image {\n  cursor: pointer;\n  @include hover() {\n    @include box-shadow(2);\n  }\n  @include transition(map-get($clickable, transition));\n}\n",
+		".extensions {\n  margin: map-get($spacers, 3) 0;\n  @extend .d-print-none;\n}\n\n.extensions--video, .extensions--slide, .extensions--demo {\n  position: relative;\n  width: 100%;\n  padding: 0;\n  & > iframe {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n  }\n}\n\n.extensions--video {\n  padding-top: percentage(315 / 560);\n}\n\n.extensions--slide {\n  padding-top: percentage(487 / 599);\n}\n\n.extensions--demo {\n  min-height: 340px;\n  padding-top: percentage(315 / 560);\n}\n\n.extensions--audio {\n  display: block;\n  max-width: 100% !important;\n}\n",
+		".article__content {\n  p.success {\n    padding: map-get($spacers, 2) map-get($spacers, 3);\n    background-color: rgba($green, .1);\n    border: 1px solid $green;\n    border-radius: map-get($base, border-radius);\n  }\n\n  p.info {\n    padding: map-get($spacers, 2) map-get($spacers, 3);\n    background-color: rgba($blue, .1);\n    border: 1px solid $blue;\n    border-radius: map-get($base, border-radius);\n  }\n\n  p.warning {\n    padding: map-get($spacers, 2) map-get($spacers, 3);\n    background-color: rgba($yellow, .1);\n    border: 1px solid $yellow;\n    border-radius: map-get($base, border-radius);\n  }\n\n  p.error {\n    padding: map-get($spacers, 2) map-get($spacers, 3);\n    background-color: rgba($red, .1);\n    border: 1px solid $red;\n    border-radius: map-get($base, border-radius);\n  }\n}\n",
+		".article__content {\n  code.success {\n    color: $text-color-function;\n    background-color: $green;\n  }\n\n  code.info {\n    color: $text-color-function;\n    background-color: $blue;\n  }\n\n  code.warning {\n    color: $text-color-function;\n    background-color: $yellow;\n  }\n\n  code.error {\n    color: $text-color-function;\n    background-color: $red;\n  }\n}\n",
+		".article__content {\n  img.shadow, .shadow > img {\n    @include box-shadow();\n  }\n\n  img.border, .border > img {\n    border: 1px solid $border-color-l;\n  }\n\n  img.rounded, .rounded > img {\n    border-radius: map-get($base, border-radius);\n  }\n\n  img.circle, .circle > img {\n    border-radius: 50%;\n  }\n}\n",
+		".icon {\n  display: block;\n  > svg {\n    display: block;\n  }\n}\n",
+		"body,\nhtml,\n.root,\n.layout--page {\n  height: 100%;\n}\n\n.layout--page {\n  &.layout--page--sidebar {\n    .page__viewport,\n    .page__grid {\n      height: 100%;\n    }\n    @include media-breakpoint-down(lg) {\n      .page__main {\n        @include overflow(unset);\n      }\n    }\n  }\n}\n\n.page__main {\n  height: 100%;\n  color: $text-color;\n  .col-aside {\n    display: none;\n    & > aside {\n      position: absolute;\n      width: map-get($layout, aside-width);\n      @include overflow(hidden);\n    }\n  }\n}\n\n.page__main-inner {\n  position: relative;\n  @include flexbox();\n  @include flex-direction(column);\n  min-height: 100%;\n  background-color: $background-color;\n}\n\n.page__content {\n  @include flex(1);\n  width: 100%;\n  margin: 0 auto;\n  @media print {\n    padding-bottom: 0;\n  }\n}\n.hide-footer {\n  .page__content {\n    padding-bottom: 0;\n  }\n}\n\n.page__comments {\n  margin: map-get($spacers, 4) 0;\n}\n\n.page__aside {\n  .toc-aside {\n    padding: map-get($spacers, 5) 0 map-get($spacers, 3) map-get($spacers, 5);\n  }\n}\n\n.page__actions {\n  position: fixed;\n  bottom: map-get($spacers, 5);\n  left: map-get($spacers, 3);\n  z-index: map-get($z-indexes, actions);\n  display: none;\n}\n\n.page__sidebar {\n  z-index: map-get($z-indexes, sidebar);\n  display: block;\n  width: 80%;\n  max-width: map-get($layout, sidebar-width);\n  height: 100%;\n  background-color: $background-color;\n  @include split-line(right);\n  @include transition(transform map-get($animation, duration));\n  @include overflow(auto);\n  .sidebar-toc {\n    padding: map-get($spacers, 3) map-get($spacers, 3) map-get($spacers, 4) map-get($spacers, 4);\n  }\n}\n.sidebar-button {\n  @include clickable($text-color-d, rgba($main-color-3, .75));\n}\n\n.page__mask {\n  @include modal(map-get($z-indexes, mask));\n  cursor: pointer;\n}\n.layout--page--sidebar {\n  .page__main {\n    @include overflow(auto);\n    @media print {\n      @include overflow(unset);\n    }\n  }\n}\n\n.has-aside {\n  .col-aside {\n    position: relative;\n    display: block;\n    width: map-get($layout, aside-width);\n    & > aside {\n      &.fixed {\n        position: fixed;\n        -webkit-font-smoothing: subpixel-antialiased;\n      }\n    }\n    @include media-breakpoint-down(lg) {\n      display: none;\n    }\n  }\n}\n\n@include media-breakpoint-down(lg) {\n  .page__sidebar {\n    position: fixed;\n    @include transform(translate(- map-get($layout, sidebar-width), 0));\n  }\n\n  .page__actions {\n    display: block;\n  }\n\n  .show-sidebar {\n    .page__actions {\n      visibility: hidden;\n    }\n    .page__sidebar {\n      @include transform(translate(0));\n    }\n    .page__mask {\n      @include modal--show();\n    }\n  }\n}\n\n.hero--light {\n  .article__info {\n    color: $text-color-theme-light;\n  }\n}\n.hero--dark {\n  .article__info {\n    color: $text-color-theme-dark;\n  }\n}\n\n.page__main--immersive {\n  .page__header {\n    position: absolute;\n    width: 100%;\n  }\n  .hero__content {\n    padding-top: map-get($layout, header-height);\n  }\n}\n",
+		".article__sharing {\n  margin: map-get($spacers, 4) 0;\n}\n.article__section-navigator {\n  padding-top: map-get($spacers, 3);\n  margin: map-get($spacers, 4) 0 map-get($spacers, 3) 0;\n  word-wrap: break-word;\n  @include split-line(top, 4px);\n  & > .previous, & > .next {\n    width: 50%;\n    & > span {\n      font-weight: map-get($base, font-weight-bold);\n      color: $text-color-l;\n    }\n    & > a {\n      display: block;\n      @include link-colors($text-color, $main-color-1);\n    }\n  }\n  & > .previous {\n    float: left;\n    padding-right: map-get($spacers, 2);\n  }\n  & > .next {\n    float: right;\n    padding-left: map-get($spacers, 2);\n    text-align: right;\n  }\n}\n",
+		".layout--articles {\n  margin: map-get($spacers, 4) 0;\n  margin-top: map-get($spacers, 5);\n  @include media-breakpoint-down(md) {\n    margin-top: map-get($spacers, 4);\n  }\n  .card__header {\n    font-size: map-get($base, font-size);\n  }\n  .card__image {\n    & > .overlay {\n      &, .card__header {\n        font-size: map-get($base, font-size-sm);\n      }\n    }\n  }\n}\n",
+		".layout--archive {\n  & > .layout--archive__result {\n    margin: map-get($spacers, 4) 0;\n  }\n}\n",
+		".layout--home {\n  .pagination {\n    margin: map-get($spacers, 4) 0;\n  }\n  .pagination__menu {\n    max-width: 100%;\n    @include overflow(auto);\n  }\n  .pagination__omit {\n    color: $text-color-l;\n  }\n  .items {\n    margin-top: map-get($spacers, 4) * 1.5;\n  }\n}\n",
+		".layout--landing {\n  .heros {\n    max-width: map-get($layout, content-max-width) * 2;\n    margin-right: auto;\n    margin-left: auto;\n  }\n  .hero {\n    img {\n      display: block;\n      width: 100%;\n      margin: 0 auto;\n    }\n  }\n  .hero__content {\n    margin-bottom: 0;\n  }\n  .hero__cover {\n    max-width: map-get($layout, content-max-width);\n  }\n  .hero__cover--full-width {\n    max-width: none;\n  }\n}\n",
+		".layout--404 {\n  .sign {\n    display: table;\n    margin: map-get($spacers, 4) auto;\n    margin-top: map-get($spacers, 5);\n    h1 {\n      font-size: map-get($base, font-size-xl) * 4;\n      line-height: 1;\n    }\n    p {\n      font-size: map-get($base, font-size-xl) * 1.2;\n    }\n  }\n}\n",
+		"/* start custom scss snippet */\n\n/* end custom scss snippet */\n"
+	],
+	"names": [],
+	"mappings": "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AAE,EqBJJ,iBAAiB,CrBKf,EAAE,EqBLJ,iBAAiB,CrBMf,EAAE,EqBNJ,iBAAiB,CrBOf,CAAC,EqBPH,iBAAiB,CrBQf,EAAE,EqBRJ,iBAAiB,CrBSf,UAAU,EqBTZ,iBAAiB,CrBUf,MAAM,EqBVR,iBAAiB,CrBWf,GAAG,EqBXL,iBAAiB,CrBYf,kBAAkB,EqBZpB,iBAAiB,CrBaf,EAAE,EqBbJ,iBAAiB,CrBcf,EAAE,EqBdJ,iBAAiB,CrBef,EAAE,EqBfJ,iBAAiB,CrBgBf,KAAK,EqBhBP,iBAAiB,CrBiBf,UAAU,CAAC,EqBVT,MAAM,E1CkDgB,IAAI,C0ClDG,CAAC,GrBY/B;;AqBXC,MAAM,MrBPR,GqBDF,ArBCE,iBqBDe,CrBCf,EAAE,EqBDJ,iBAAiB,CrBEf,EAAE,EqBFJ,iBAAiB,CrBGf,EAAE,EqBHJ,iBAAiB,CrBIf,EAAE,EqBJJ,iBAAiB,CrBKf,EAAE,EqBLJ,iBAAiB,CrBMf,EAAE,EqBNJ,iBAAiB,CrBOf,CAAC,EqBPH,iBAAiB,CrBQf,EAAE,EqBRJ,iBAAiB,CrBSf,UAAU,EqBTZ,iBAAiB,CrBUf,MAAM,EqBVR,iBAAiB,CrBWf,GAAG,EqBXL,iBAAiB,CrBYf,kBAAkB,EqBZpB,iBAAiB,CrBaf,EAAE,EqBbJ,iBAAiB,CrBcf,EAAE,EqBdJ,iBAAiB,CrBef,EAAE,EqBfJ,iBAAiB,CrBgBf,KAAK,EqBhBP,iBAAiB,CrBiBf,UAAU,CAAC,EqBRP,MAAM,E1C0Dc,MAA2B,C0C1DlB,CAAC,GrBUjC,EAAA;;AqBnBH,ArBsBE,iBqBtBe,CrBsBf,EAAE,EqBtBJ,iBAAiB,CrBsBX,EAAE,EqBtBR,iBAAiB,CrBsBP,EAAE,EqBtBZ,iBAAiB,CrBsBH,EAAE,EqBtBhB,iBAAiB,CrBsBC,EAAE,EqBtBpB,iBAAiB,CrBsBK,EAAE,CAAC,EqBTrB,QAAQ,EAAE,QAAQ,EAClB,UAAU,E1CuDY,MAA4B,GqB7CnD;;AqBTC,MAAM,MrBOR,GqBtBF,ArBsBE,iBqBtBe,CrBsBf,EAAE,EqBtBJ,iBAAiB,CrBsBX,EAAE,EqBtBR,iBAAiB,CrBsBP,EAAE,EqBtBZ,i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"
+}
\ No newline at end of file
diff --git a/_site/assets/favicon-16x16.png b/_site/assets/favicon-16x16.png
new file mode 100644
index 0000000..7477a30
Binary files /dev/null and b/_site/assets/favicon-16x16.png differ
diff --git a/_site/assets/favicon-32x32.png b/_site/assets/favicon-32x32.png
new file mode 100644
index 0000000..7a61023
Binary files /dev/null and b/_site/assets/favicon-32x32.png differ
diff --git a/_site/assets/favicon.ico b/_site/assets/favicon.ico
new file mode 100644
index 0000000..6f48a2d
Binary files /dev/null and b/_site/assets/favicon.ico differ
diff --git a/_site/assets/images/logo/logo.svg b/_site/assets/images/logo/logo.svg
new file mode 100644
index 0000000..5ad04a6
--- /dev/null
+++ b/_site/assets/images/logo/logo.svg
@@ -0,0 +1,8 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
\ No newline at end of file
diff --git a/_site/assets/mstile-144x144.png b/_site/assets/mstile-144x144.png
new file mode 100644
index 0000000..1eddae6
Binary files /dev/null and b/_site/assets/mstile-144x144.png differ
diff --git a/_site/assets/mstile-150x150.png b/_site/assets/mstile-150x150.png
new file mode 100644
index 0000000..1e3579a
Binary files /dev/null and b/_site/assets/mstile-150x150.png differ
diff --git a/_site/assets/mstile-310x150.png b/_site/assets/mstile-310x150.png
new file mode 100644
index 0000000..e364ead
Binary files /dev/null and b/_site/assets/mstile-310x150.png differ
diff --git a/_site/assets/mstile-310x310.png b/_site/assets/mstile-310x310.png
new file mode 100644
index 0000000..1e4181b
Binary files /dev/null and b/_site/assets/mstile-310x310.png differ
diff --git a/_site/assets/mstile-70x70.png b/_site/assets/mstile-70x70.png
new file mode 100644
index 0000000..2ed5c66
Binary files /dev/null and b/_site/assets/mstile-70x70.png differ
diff --git a/_site/assets/safari-pinned-tab.svg b/_site/assets/safari-pinned-tab.svg
new file mode 100644
index 0000000..f300623
--- /dev/null
+++ b/_site/assets/safari-pinned-tab.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+</metadata>
+<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M2735 6469 c-98 -14 -126 -21 -178 -38 -188 -66 -289 -166 -332 -327
+-15 -58 -22 -232 -11 -284 3 -14 8 -41 11 -60 5 -32 4 -31 -10 10 -31 86 -104
+227 -143 277 -51 64 -127 119 -199 144 -69 25 -189 31 -255 13 -27 -7 -48 -11
+-48 -9 0 2 -33 -8 -72 -22 -193 -67 -452 -232 -702 -446 -27 -23 -60 -51 -73
+-62 -14 -11 -70 -63 -126 -116 l-101 -96 66 -69 c90 -94 114 -121 178 -194 30
+-35 60 -68 66 -74 5 -6 53 -65 105 -131 374 -471 603 -905 724 -1370 33 -127
+37 -148 56 -270 24 -157 33 -457 17 -620 -54 -579 -307 -1149 -767 -1729 -98
+-125 -114 -144 -196 -235 -54 -59 -60 -66 -120 -132 l-40 -44 50 46 c76 71
+104 96 175 158 36 31 70 61 76 66 14 13 72 60 154 125 36 28 73 57 83 65 9 8
+21 15 26 15 5 0 11 3 13 8 14 34 381 264 578 362 167 84 435 191 518 206 13 3
+42 11 65 18 23 8 56 17 72 20 17 4 41 9 55 12 81 16 185 33 245 39 39 4 81 8
+95 11 32 5 334 5 380 -1 19 -2 58 -7 86 -10 29 -3 62 -8 75 -10 13 -3 44 -8
+69 -11 25 -3 53 -8 62 -10 10 -3 29 -7 42 -10 113 -20 342 -93 501 -159 112
+-46 346 -164 406 -205 24 -16 48 -30 52 -30 20 0 346 -230 487 -343 173 -139
+259 -215 403 -355 l99 -96 102 104 c55 58 128 136 161 174 33 37 65 73 70 80
+32 36 129 163 181 236 301 423 344 745 130 953 -63 61 -216 145 -326 180 -8 2
+-1 2 15 0 284 -42 449 -5 574 129 105 111 163 330 155 588 -3 110 -13 245 -19
+275 -5 23 -14 82 -21 140 -3 22 -14 81 -24 130 -11 50 -21 101 -24 115 -6 36
+-75 311 -85 340 -5 14 -19 59 -31 100 -24 82 -74 227 -95 275 -7 17 -26 62
+-43 100 -147 339 -345 550 -573 610 -263 70 -586 -69 -944 -404 -57 -54 -54
+-41 5 19 35 35 140 171 186 240 109 162 183 332 199 455 7 51 8 158 2 185 -2
+8 -7 33 -12 55 -28 141 -168 324 -330 430 -47 31 -213 125 -221 125 -2 0 -32
+13 -66 29 -134 61 -322 122 -543 178 -33 8 -67 16 -75 18 -25 7 -303 65 -330
+70 -14 2 -45 7 -70 10 -25 3 -70 10 -100 15 -30 5 -80 12 -110 16 -79 9 -396
+12 -455 3z"/>
+</g>
+</svg>
diff --git a/_site/assets/search.js b/_site/assets/search.js
new file mode 100644
index 0000000..fa8829c
--- /dev/null
+++ b/_site/assets/search.js
@@ -0,0 +1 @@
+window.TEXT_SEARCH_DATA={'posts':[{'title':"Stop Talking is the worst title of one blog",'url':"/posts/welcome-to-my-blog"},{'title':"Using charles proxy to monitor mobile SSL traffics",'url':"/posts/charles-is-not-a-good-tool"},{'title':"Some of my previews experiment works: 2016",'url':"/posts/some-of-my-previews-exper-work"},{'title':"Xv6 introduction",'url':"/posts/intro-xv6"},{'title':"Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries",'url':"/posts/generate-word-cloud-with-chinese-fenci"},{'title':"EDDL: How do we train neural networks on limited edge devices - PART 1",'url':"/posts/eddl-how-do-we-train-on-limited-edge-devices"}]};
diff --git a/_site/assets/site.webmanifest b/_site/assets/site.webmanifest
new file mode 100644
index 0000000..2b120c4
--- /dev/null
+++ b/_site/assets/site.webmanifest
@@ -0,0 +1,19 @@
+{
+    "name": "TeXt Theme",
+    "short_name": "TeXt Theme",
+    "icons": [
+        {
+            "src": "android-chrome-192x192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+        },
+        {
+            "src": "android-chrome-512x512.png",
+            "sizes": "512x512",
+            "type": "image/png"
+        }
+    ],
+    "theme_color": "#ffffff",
+    "background_color": "#ffffff",
+    "display": "standalone"
+}
diff --git a/_site/category/index.html b/_site/category/index.html
deleted file mode 100644
index d5d39ce..0000000
--- a/_site/category/index.html
+++ /dev/null
@@ -1,182 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Category « Stop Talking, Start Doing</title>
-  <meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
-">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//category/">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="home">
-  <h1 class="page-heading">Category</h1>
-
-  <ul class="post-list">
-
-
-
-
-
-<h2 class="category" id="Network">NETWORK</h2>
-<ul>
-
-<li><span>Oct 27, 2016</span> » <a href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-
-</ul>
-
-
-<h2 class="category" id="Nonsense">NONSENSE</h2>
-<ul>
-
-<li><span>Oct 26, 2016</span> » <a href="/archivers/hello">Stop Talking is the worst title of one blog</a></li>
-
-</ul>
-
-
-<h2 class="category" id="Research">RESEARCH</h2>
-<ul>
-
-<li><span>Oct 13, 2021</span> » <a href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-
-<li><span>Oct 28, 2016</span> » <a href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-
-</ul>
-
-
-<h2 class="category" id="visualization">VISUALIZATION</h2>
-<ul>
-
-<li><span>Sep 15, 2020</span> » <a href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-
-</ul>
-
-
-<h2 class="category" id="xv6">XV6</h2>
-<ul>
-
-<li><span>Jul 28, 2017</span> » <a href="/archivers/intro-xv6">Xv6 introduction</a></li>
-
-</ul>
-
-
-  </ul>
-  
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/css/main.css b/_site/css/main.css
deleted file mode 100644
index 8b0f977..0000000
--- a/_site/css/main.css
+++ /dev/null
@@ -1,296 +0,0 @@
-body { margin: 0; font-family: "Arial"; font-size: 15px; line-height: 1.35; }
-
-a { text-decoration: none; color: #036; }
-
-a:hover, a:focus { text-decoration: underline; color: #069; }
-
-blockquote { background: #FFF; margin: 0; padding: 5px 20px; border-left: 10px solid #CCC; }
-
-code, pre { font-family: "Courier New"; font-size: 12px; }
-
-code { color: #900; background-color: #fff; padding: 2px 5px; border-radius: 5px; }
-
-pre { overflow-x: auto; padding: 20px 50px; }
-
-pre, pre code { color: #fafafa; background-color: #223; }
-
-pre code { padding: 0; }
-
-.hide { display: none; }
-
-.center { text-align: center; }
-
-table { border-collapse: collapse; border-spacing: 0; margin: 10pt auto; background: #FFF; }
-
-table td, table th { border: 1px solid #CCC; padding: 5px 15px; margin: 0; }
-
-table th { border-color: #555; background: #555; color: #eee; font-weight: normal; }
-
-table tr:hover { background: rgba(255, 255, 0, 0.2); }
-
-h1, h2, h3, h4, h5, h6 { font-weight: normal; }
-
-.wrapper { margin: 0 auto; max-width: 1100px; }
-
-@media (max-width: 1120px) { .wrapper { max-width: 800px; } }
-
-.header { line-height: 30px; background-color: black; padding: 10px; margin: 0; }
-
-.header:after { clear: both; content: ' '; display: block; }
-
-.header .site-title { float: left; color: white; text-decoration: none; font-size: 15px; line-height: 30px; }
-
-.header .site-nav { text-align: right; }
-
-.header .site-nav a { text-decoration: none; color: white; padding: 10px 20px; white-space: nowrap; }
-
-.header .site-nav a:hover, .header .site-nav a:focus { background: black; }
-
-.page-content { background: #e0e0e3; padding: 30px 0; }
-
-.page-content .wrapper { position: relative; background: #FAFAFA; box-shadow: 0 1px 4px #999; outline: 1px solid #CCC; }
-
-.page-content .wrapper:after { clear: both; content: ''; display: block; }
-
-.page-content .wrapper:before { content: ''; display: block; position: absolute; width: 300px; height: 100%; left: 800px; top: 0; background: #EEE; }
-
-.page-content img { max-width: 100%; }
-
-.col-main { position: relative; box-sizing: border-box; padding: 30px; width: 800px; float: left; }
-
-.col-second { position: relative; box-sizing: border-box; float: left; width: 300px; padding: 20px; background: #EEE; z-index: 10; }
-
-.col-box { color: #666; font-size: 15px; padding-bottom: 20px; }
-
-.col-box p { margin: 0; }
-
-.col-box ul { padding-left: 20px; margin: 0; }
-
-.col-box:not(:first-child) { border-top: 1px solid #ccc; padding-top: 20px; }
-
-.col-box .col-box-title { color: #333; margin-bottom: 10px; font-size: 16.5px; }
-
-@media (max-width: 1120px) { .page-content .wrapper:before { display: none; } .col-main, .col-second { width: auto; float: none; } .col-box { width: 50%; float: left; margin-bottom: 10px; } .col-box:not(:first-child) { border-top: none; padding-top: 0; } .col-second:after { clear: both; display: block; content: ' '; } }
-
-.col-box-author { text-align: center; }
-
-.col-box-author .avatar { width: 135px; height: 135px; border-radius: 100%; margin: 20px auto; display: block; }
-
-.col-box-author .name { font-size: 15px; }
-
-.col-box-author .contact { margin-top: 10px; }
-
-.col-box-author .contact a { background: #999; color: #eee; padding: 5px 10px; text-decoration: none; border-radius: 5px; white-space: nowrap; }
-
-.col-box-author .contact a:hover { transition: background 0.3s ease; background: #666; }
-
-.footer { padding: 60px 0; background-color: #e0e0e3; text-align: center; color: #666; font-size: 15px; }
-
-.post .post-header { margin: 0 100px; margin-bottom: 40px; padding: 0px; }
-
-.post .post-header .post-title { font-size: 40px; font-weight: normal; margin: 0 -100px; }
-
-@media screen and (max-width: 600px) { .post .post-header .post-title { font-size: 34px; } }
-
-.post .post-header .post-meta { color: #999; font-size: 15px; margin: 0 -100px; }
-
-@media screen and (max-width: 600px) { .post .post-header { text-align: center; margin-bottom: 10px; padding: 10px; } }
-
-.post .post-content { color: #333; }
-
-.post .post-content h1, .post .post-content h2, .post .post-content h3, .post .post-content h4, .post .post-content h5, .post .post-content h6 { color: #000; }
-
-.post .post-content h1 { font-size: xx-large; }
-
-.post .post-content h1, .post .post-content h2 { margin-bottom: 10px; margin-top: 30px; }
-
-.post .post-content h1, .post .post-content h2, .post .post-content h3 { border-bottom: 1px dotted #3f3f3f; }
-
-.post .post-content pre { margin: 0 -30px; }
-
-@media screen and (max-width: 600px) { .post .post-content pre { margin: 0 -10px; } }
-
-.post .post-content .middle-image { display: block; margin-left: auto; margin-right: auto; }
-
-.post .post-comments { padding-top: 30px; }
-
-.home .page-heading { font-size: 40px; font-weight: normal; margin: 0px; }
-
-@media screen and (max-width: 600px) { .home .page-heading { margin: 10px; font-size: 34px; } }
-
-.home .rss-link { float: right; text-decoration: none; border: 1px solid; color: #999; background: #fff; font-size: 10.5px; padding: 1px 8px; }
-
-.home .rss-link:hover, .home .rss-link:focus { color: #666; }
-
-.home .post-list { margin: 0; padding: 10px 0px; list-style: none; }
-
-.home .post-list > li { padding-bottom: 5px; border-bottom: 2px dotted #3f3f3f; margin-bottom: 5px; }
-
-.home .post-list .post-title { font-size: 28px; font-weight: bold; margin: 0; }
-
-.home .post-list .post-meta { font-size: 15px; color: #aaaaaa; margin: 0 0px; margin-bottom: .5em; }
-
-.home .post-list .post-excerpt { margin: 0 0px; }
-
-.home .post-list .post-excerpt, .home .post-list .post-excerpt * { font-size: 15px; line-height: 16.5px; padding-top: 0; padding-bottom: 0; color: #333; }
-
-.home .post-list .post-excerpt code, .home .post-list .post-excerpt pre, .home .post-list .post-excerpt pre * { color: #666; background-color: #eee; }
-
-.home .post-list .post-excerpt th { border-color: #ccc; background-color: #ccc; }
-
-.home .post-list .post-excerpt a { color: #002335; }
-
-.home .post-list .post-excerpt img { display: block; margin: 1em auto; max-height: 16em; opacity: .7; transition: opacity .3s; }
-
-.home .post-list .post-excerpt img:hover { opacity: 1; }
-
-@media screen and (max-width: 600px) { .home .post-list { padding: 10px; } }
-
-.home .pagination { text-align: center; text-decoration: none; color: #666; margin: 30px 0; }
-
-.home .pagination .page_number { margin: 0 30px; }
-
-.home .pagination .previous, .home .pagination .next { padding: 10px 20px; white-space: nowrap; }
-
-.home .pagination a.previous, .home .pagination a.next { color: #333; border-radius: 20px; border: 1px solid #CCC; }
-
-.home .pagination a.previous:hover, .home .pagination a.next:hover { background: #fefefe; color: #000; text-decoration: none; }
-
-@media screen and (max-width: 800px) { .page-content { padding: 0; } .footer { padding: 15px 0; } }
-
-@media screen and (max-width: 600px) { .header, .header .site-nav { text-align: center; } .header .site-title { float: none; } .col-main { padding: 10px; } .col-box { width: 100%; float: none; margin-bottom: 20px; } pre { padding: 10px; } }
-
-/* Monokai Theme from https://github.com/richleland/pygments-css/blob/master/monokai.css */
-.highlight { /* Comment */ /* Error */ /* Keyword */ /* Literal */ /* Name */ /* Operator */ /* Punctuation */ /* Comment.Multiline */ /* Comment.Preproc */ /* Comment.Single */ /* Comment.Special */ /* Generic.Emph */ /* Generic.Strong */ /* Keyword.Constant */ /* Keyword.Declaration */ /* Keyword.Namespace */ /* Keyword.Pseudo */ /* Keyword.Reserved */ /* Keyword.Type */ /* Literal.Date */ /* Literal.Number */ /* Literal.String */ /* Name.Attribute */ /* Name.Builtin */ /* Name.Class */ /* Name.Constant */ /* Name.Decorator */ /* Name.Entity */ /* Name.Exception */ /* Name.Function */ /* Name.Label */ /* Name.Namespace */ /* Name.Other */ /* Name.Property */ /* Name.Tag */ /* Name.Variable */ /* Operator.Word */ /* Text.Whitespace */ /* Literal.Number.Float */ /* Literal.Number.Hex */ /* Literal.Number.Integer */ /* Literal.Number.Oct */ /* Literal.String.Backtick */ /* Literal.String.Char */ /* Literal.String.Doc */ /* Literal.String.Double */ /* Literal.String.Escape */ /* Literal.String.Heredoc */ /* Literal.String.Interpol */ /* Literal.String.Other */ /* Literal.String.Regex */ /* Literal.String.Single */ /* Literal.String.Symbol */ /* Name.Builtin.Pseudo */ /* Name.Variable.Class */ /* Name.Variable.Global */ /* Name.Variable.Instance */ /* Literal.Number.Integer.Long */ /* Generic Heading & Diff Header */ /* Generic.Subheading & Diff Unified/Comment? */ /* Generic.Deleted & Diff Deleted */ /* Generic.Inserted & Diff Inserted */ }
-
-.highlight .hll { background-color: #49483e; }
-
-.highlight .c { color: #75715e; }
-
-.highlight .err { color: #960050; background-color: #1e0010; }
-
-.highlight .k { color: #66d9ef; }
-
-.highlight .l { color: #ae81ff; }
-
-.highlight .n { color: #f8f8f2; }
-
-.highlight .o { color: #f92672; }
-
-.highlight .p { color: #f8f8f2; }
-
-.highlight .cm { color: #75715e; }
-
-.highlight .cp { color: #75715e; }
-
-.highlight .c1 { color: #75715e; }
-
-.highlight .cs { color: #75715e; }
-
-.highlight .ge { font-style: italic; }
-
-.highlight .gs { font-weight: bold; }
-
-.highlight .kc { color: #66d9ef; }
-
-.highlight .kd { color: #66d9ef; }
-
-.highlight .kn { color: #f92672; }
-
-.highlight .kp { color: #66d9ef; }
-
-.highlight .kr { color: #66d9ef; }
-
-.highlight .kt { color: #66d9ef; }
-
-.highlight .ld { color: #e6db74; }
-
-.highlight .m { color: #ae81ff; }
-
-.highlight .s { color: #e6db74; }
-
-.highlight .na { color: #a6e22e; }
-
-.highlight .nb { color: #f8f8f2; }
-
-.highlight .nc { color: #a6e22e; }
-
-.highlight .no { color: #66d9ef; }
-
-.highlight .nd { color: #a6e22e; }
-
-.highlight .ni { color: #f8f8f2; }
-
-.highlight .ne { color: #a6e22e; }
-
-.highlight .nf { color: #a6e22e; }
-
-.highlight .nl { color: #f8f8f2; }
-
-.highlight .nn { color: #f8f8f2; }
-
-.highlight .nx { color: #a6e22e; }
-
-.highlight .py { color: #f8f8f2; }
-
-.highlight .nt { color: #f92672; }
-
-.highlight .nv { color: #f8f8f2; }
-
-.highlight .ow { color: #f92672; }
-
-.highlight .w { color: #f8f8f2; }
-
-.highlight .mf { color: #ae81ff; }
-
-.highlight .mh { color: #ae81ff; }
-
-.highlight .mi { color: #ae81ff; }
-
-.highlight .mo { color: #ae81ff; }
-
-.highlight .sb { color: #e6db74; }
-
-.highlight .sc { color: #e6db74; }
-
-.highlight .sd { color: #e6db74; }
-
-.highlight .s2 { color: #e6db74; }
-
-.highlight .se { color: #ae81ff; }
-
-.highlight .sh { color: #e6db74; }
-
-.highlight .si { color: #e6db74; }
-
-.highlight .sx { color: #e6db74; }
-
-.highlight .sr { color: #e6db74; }
-
-.highlight .s1 { color: #e6db74; }
-
-.highlight .ss { color: #e6db74; }
-
-.highlight .bp { color: #f8f8f2; }
-
-.highlight .vc { color: #f8f8f2; }
-
-.highlight .vg { color: #f8f8f2; }
-
-.highlight .vi { color: #f8f8f2; }
-
-.highlight .il { color: #ae81ff; }
-
-.highlight .gu { color: #75715e; }
-
-.highlight .gd { color: #f92672; }
-
-.highlight .gi { color: #a6e22e; }
-
-.page-content .wrapper .post-toc > ul { overflow: auto; }
-
-.util-notify1 { position: absolute; z-index: 100; background: rgba(0, 0, 0, 0.7); color: #FFF; padding: 5px 10px; font-size: 14px; pointer-events: none; opacity: 1; transition: .2s ease; }
-
-.util-notify1.hidden { opacity: 0; display: none; }
-
-/*# sourceMappingURL=main.css.map */
\ No newline at end of file
diff --git a/_site/css/main.css.map b/_site/css/main.css.map
deleted file mode 100644
index ef53b3e..0000000
--- a/_site/css/main.css.map
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-	"version": 3,
-	"file": "main.css",
-	"sources": [
-		"main.scss",
-		"_sass/_base.scss",
-		"_sass/_layout.scss",
-		"_sass/_post.scss",
-		"_sass/_home.scss",
-		"_sass/_syntax-highlighting.scss",
-		"_sass/_easybook.scss"
-	],
-	"sourcesContent": [
-		"@charset \"utf-8\";\n\n$base-font-family: \"Arial\";// \"Times New Roman\", \"DejaVu Sans Mono\", \"PingFang SC\", \"DejaVu Sans\", \"Open Sans\", \"Helvetica Neue\", Arial, \"Noto Sans CJK SC\", \"Hiragino Sans GB\", \"微软雅黑\",  Helvetica, sans-serif;\n$base-font-size:   15px;\n$small-font-size:  $base-font-size;\n$base-line-height: 1.35;\n\n$code-font-family:   \"Courier New\"; //Menlo, Monaco, Consolas, \"DejaVu Sans Mono\", \"Liberation Mono\", \"文泉驿等宽微米黑\", \"Courier New\", Courier, SimSun, monospace;\n$code-font-size:     12px;\n\n// Width of the content area\n$content-width:    800px;\n\n$on-palm:          600px;\n$on-laptop:        800px;\n\n$color-link: rgb(0, 0, 0);\n$color-link-hover: rgb(0, 35, 53);\n\n$header-bg: rgba(0, 0, 0, 1);\n$header-bg-hover: rgb(0, 0, 0);\n$header-link: rgb(255, 255, 255);\n$header-fg: rgb(255, 255, 255);\n\n@mixin media-query($device) {\n    @media screen and (max-width: $device) {\n        @content;\n    }\n}\n\n\n\n// Import partials from `sass_dir` (defaults to `_sass`)\n@import\n        \"base\",\n        \"layout\",\n        \"syntax-highlighting\",\n        \"easybook\"\n;\n",
-		"body {\n\tmargin: 0;\n\tfont-family: $base-font-family;\n\tfont-size: $base-font-size;\n\tline-height: $base-line-height;\n}\na {\n\ttext-decoration: none;\n\tcolor: #036;\n}\na:hover, a:focus {\n\ttext-decoration:underline;\n\tcolor: #069;\n}\nblockquote {\n\tbackground: #FFF;\n\tmargin:0;\n\tpadding: 5px 20px;\n\tborder-left: 10px solid #CCC;\n}\ncode,pre {\n\tfont-family:  $code-font-family;\n\tfont-size: $code-font-size;\n}\ncode {\n\tcolor: #900;\n\tbackground-color: #fff;\n\tpadding: 2px 5px;\n\tborder-radius: 5px;\n}\npre {\n\toverflow-x: auto;\n\tpadding: 20px 50px;\n}\npre, pre code {\n\tcolor: #fafafa;\n\tbackground-color: #223;\n}\npre code {\n\tpadding: 0;\t\n}\n.hide {\n    display: none;\n}\n.center {\n\ttext-align: center;\n}\ntable {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n    margin: 10pt auto;\n\tbackground: #FFF;\n\n\ttd, th {\n\t\tborder: 1px solid #CCC;\n\t\tpadding: 5px 15px;\n\t\tmargin: 0;\n\t}\n\t\n\tth {\n\t\tborder-color: #555;\n\t\tbackground: #555;\n\t\tcolor: #eee;\n\t\tfont-weight:normal;\n\t}\n\t\n\ttr:hover {\n\t\tbackground: rgba(255,255,0,0.2);\n\t}\n}\n\nh1,h2,h3,h4,h5,h6{\n\tfont-weight: normal;\n}",
-		".wrapper {\n\tmargin: 0 auto;\n\tmax-width: 1100px;\n}\n@media (max-width: 1120px) {\n\t.wrapper {\n\t\tmax-width: 800px;\n\t}\n}\n\n.header {\n\tline-height: $base-font-size * 2;\n\tbackground-color: $header-bg;\n\tpadding: 10px;\n\tmargin: 0;\n\t\n\t&:after {\n\t\tclear: both;\n\t\tcontent: ' ';\n\t\tdisplay: block;\n\t}\n\t\n\t.site-title {\n\t\tfloat: left;\n\t\tcolor: $header-fg;\n\t\ttext-decoration: none;\n\t\tfont-size: $base-font-size;\n\t\tline-height: $base-font-size * 2;\n\t}\n\t.site-nav {\n\t\ttext-align:right;\n\t\t\n\t\ta {\n\t\t\ttext-decoration: none;\n\t\t\tcolor: $header-link;\n\t\t\tpadding: 10px 20px;\n\t\t\twhite-space: nowrap;\n\t\t\n\t\t\t&:hover, &:focus {\n\t\t\t\tbackground: $header-bg-hover;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.page-content {\n\tbackground:#e0e0e3;\n\tpadding: 30px 0;\n\n\t.wrapper {\n\t\tposition: relative;\n\t\tbackground: #FAFAFA;\n\t\tbox-shadow: 0 1px 4px #999;\n\t\toutline: 1px solid #CCC;\n\t\t&:after {\n\t\t\tclear:both;\n\t\t\tcontent: '';\n\t\t\tdisplay:block;\n\t\t}\n\t\t&:before {\n\t\t\tcontent: '';\n\t\t\tdisplay:block;\n\t\t\tposition: absolute;\n\t\t\twidth: 300px;\n\t\t\theight: 100%;\n\t\t\tleft: 800px;\n\t\t\ttop: 0;\n\t\t\tbackground: #EEE;\n\t\t}\n\t}\n\t\n\timg {\n\t\tmax-width:100%;\n\t}\n}\n\n// Colum\n.col-main {\n\tposition: relative;\n\tbox-sizing: border-box;\n\tpadding: 30px;\n\twidth: 800px;\n\tfloat: left;\n}\n.col-second {\n\tposition: relative;\n\tbox-sizing: border-box;\n\tfloat: left;\n\twidth: 300px;\n\tpadding: 20px;\n\tbackground: #EEE;\n\tz-index: 10;\n}\n.col-box{\n\tcolor: #666;\n\tfont-size: $small-font-size;\n\tpadding-bottom: 20px;\n\t\n\tp {\n\t    margin: 0;\n\t}\n    ul {\n        padding-left: 20px;\n        margin: 0;\n    }\n\t\n\t&:not(:first-child) {\n    \tborder-top: 1px solid #ccc;\n    \tpadding-top: 20px;\n    }\n    \n    .col-box-title {\n    \tcolor: #333;\n\t    margin-bottom: 10px;\n\t    font-size: $small-font-size * 1.1;\n    }\n}\n@media (max-width: 1120px) {\n\t.page-content .wrapper:before {\n\t\tdisplay: none;\n\t}\n\t.col-main,\n\t.col-second {\n\t\twidth: auto;\n\t\tfloat: none;\n\t}\n\t.col-box {\n\t\twidth: 50%;\n\t\tfloat: left;\n\t\tmargin-bottom: 10px;\n\t}\n\t.col-box:not(:first-child) {\n\t\tborder-top: none;\n\t\tpadding-top:0;\n\t}\n\t.col-second:after {\n\t\tclear: both;\n\t\tdisplay: block;\n\t\tcontent: ' ';\n\t}\n}\n.col-box-author {\n\ttext-align: center;\n\t.avatar {\n\t\twidth: 135px;\n\t\theight: 135px;\n\t\tborder-radius: 100%;\n\t\tmargin: 20px auto;\n\t\tdisplay: block;\n\t}\n\t.name {\n\t\tfont-size: $base-font-size;\n\t}\n\t.contact {\n\t\tmargin-top: 10px;\n\t\ta {\n\t\t\tbackground: #999;\n\t\t\tcolor: #eee;\n\t\t\tpadding: 5px 10px;\n\t\t\ttext-decoration: none;\n\t\t\tborder-radius: 5px;\n    \t\twhite-space: nowrap;\n\t\t\t\n\t\t\t&:hover {\n\t\t\t\ttransition: background 0.3s ease;\n\t\t\t\tbackground: #666;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// footer\n.footer {\n\tpadding: 60px 0;\n\tbackground-color: #e0e0e3;\n\ttext-align:center;\n\tcolor:#666;\n\tfont-size:$small-font-size;\n}\n\n@import \"post\", \"home\";\n\n@include media-query($on-laptop) {\n\t.page-content {\n\t\tpadding: 0;\n\t}\n\t.footer {\n\t\tpadding: 15px 0 ;\n\t}\n}\n@include media-query($on-palm) {\n\t.header {\n\t\t&, .site-nav{\n\t\t\ttext-align:center;\n\t\t}\n\t\t.site-title {\n\t\t\tfloat: none;\n\t\t}\n\t}\n\t.col-main {\n\t\tpadding: 10px;\n\t}\n\t.col-box {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t\tmargin-bottom: 20px;\n\t}\n\tpre {\n\t\tpadding: 10px;\n\t}\n}\n",
-		".post {\n    .post-header {\n    \tmargin: 0 100px;\n    \tmargin-bottom: 40px;\n    \tpadding: 0px;\n        .post-title {\n        \tfont-size:40px;\n        \tfont-weight: normal;\n        \tmargin: 0 -100px;\n        \t@include media-query($on-palm) {\n        \t\tfont-size: 34px;\n        \t}\n        }\n        .post-meta {\n        \tcolor:#999;\n        \tfont-size:$small-font-size;\n        \tmargin: 0 -100px;\n        }\n        @include media-query($on-palm) {\n    \t\ttext-align:center;\n    \t\tmargin-bottom: 10px;\n    \t\tpadding: 10px;\n        }\n    }\n    .post-content {\n        color: #333;\n        \n        h1,h2,h3,h4,h5,h6 {\n            color: #000;\n        }\n\n        h1 {\n            font-size: xx-large;\n        }\n        \n        h1, h2 {\n            // font-weight: bold;\n        \tmargin-bottom: 10px;\n            margin-top: 30px;\n        }\n        \n        h1, h2, h3 {\n            border-bottom: 1px dotted rgb(63, 63, 63);\n        }\n        \n        pre {\n        \tmargin: 0 -30px;\n            @include media-query($on-palm) {\n\t\t        margin: 0 -10px;\n            }\n        }\n        \n        .middle-image {\n            display: block;\n            margin-left: auto;\n            margin-right: auto\n        }\n    }\n    .post-comments {\n        padding-top: 30px;\n    }\n}",
-		".home {\n.page-heading {\n\tfont-size:40px;\n\tfont-weight: normal;\n\tmargin: 0px;\n    @include media-query($on-palm) {\n\t\tmargin: 10px;\n\t\tfont-size: 34px;\n    }\n}\n.rss-link {\n\tfloat:right;\n    text-decoration: none;\n    border:1px solid;\n    color: #999;\n    background: #fff;\n    font-size: 0.7 * $base-font-size;\n    padding: 1px 8px;\n    \n    &:hover, &:focus {\n        color: #666;\n    }\n}\n.post-list {\n    margin: 0;\n\tpadding: 10px 0px;\n    list-style: none;\n    > li {\n        padding-bottom: 5px;\n        border-bottom: 2px dotted rgb(63, 63, 63);\n    \tmargin-bottom: 5px;\n    }\n    .post-title {\n    \tfont-size: 28px;\n    \tfont-weight: bold;\n    \tmargin: 0;\n    }\n    .post-meta {\n    \tfont-size: $small-font-size;\n    \tcolor: rgb(170, 170, 170);\n        margin: 0 0px;\n        margin-bottom: .5em;\n    }\n    .post-excerpt {\n        &, * {\n            font-size: $small-font-size;\n            line-height: $small-font-size * 1.1;\n            padding-top: 0;\n            padding-bottom: 0;\n\t        color: #333;\n        }\n        code, pre, pre * {\n            color: #666;\n            background-color: #eee;\n        }\n        th {\n            border-color: #ccc;\n            background-color: #ccc;\n        }\n        a {\n            color: $color-link-hover;\n        }\n        img {\n            display: block;\n            margin: 1em auto;\n            max-height: 16em;\n            opacity: .7;\n            transition: opacity .3s;\n            &:hover {\n                opacity: 1;\n            }\n        }\n        margin: 0 0px;\n    }\n    @include media-query($on-palm) {\n\t\tpadding: 10px;\n    }\n}\n.pagination {\n\ttext-align:center;\n\ttext-decoration:none;\n\tcolor: #666;\n\tmargin: 30px 0;\n    .page_number {\n    \tmargin:0 30px;\n    }\n    .previous,.next {\n    \tpadding: 10px 20px;\n    \twhite-space: nowrap;\n    }\n    a.previous,a.next {\n    \tcolor: #333;\n    \tborder-radius: 20px;\n    \tborder: 1px solid #CCC;\n    }\n    a.previous:hover,a.next:hover {\n    \tbackground: #fefefe;\n    \tcolor: #000;\n    \ttext-decoration:none;\n    }\n}\n}",
-		"/* Monokai Theme from https://github.com/richleland/pygments-css/blob/master/monokai.css */\n.highlight {\n    .hll { background-color: #49483e }\n    .c { color: #75715e } /* Comment */\n    .err { color: #960050; background-color: #1e0010 } /* Error */\n    .k { color: #66d9ef } /* Keyword */\n    .l { color: #ae81ff } /* Literal */\n    .n { color: #f8f8f2 } /* Name */\n    .o { color: #f92672 } /* Operator */\n    .p { color: #f8f8f2 } /* Punctuation */\n    .cm { color: #75715e } /* Comment.Multiline */\n    .cp { color: #75715e } /* Comment.Preproc */\n    .c1 { color: #75715e } /* Comment.Single */\n    .cs { color: #75715e } /* Comment.Special */\n    .ge { font-style: italic } /* Generic.Emph */\n    .gs { font-weight: bold } /* Generic.Strong */\n    .kc { color: #66d9ef } /* Keyword.Constant */\n    .kd { color: #66d9ef } /* Keyword.Declaration */\n    .kn { color: #f92672 } /* Keyword.Namespace */\n    .kp { color: #66d9ef } /* Keyword.Pseudo */\n    .kr { color: #66d9ef } /* Keyword.Reserved */\n    .kt { color: #66d9ef } /* Keyword.Type */\n    .ld { color: #e6db74 } /* Literal.Date */\n    .m { color: #ae81ff } /* Literal.Number */\n    .s { color: #e6db74 } /* Literal.String */\n    .na { color: #a6e22e } /* Name.Attribute */\n    .nb { color: #f8f8f2 } /* Name.Builtin */\n    .nc { color: #a6e22e } /* Name.Class */\n    .no { color: #66d9ef } /* Name.Constant */\n    .nd { color: #a6e22e } /* Name.Decorator */\n    .ni { color: #f8f8f2 } /* Name.Entity */\n    .ne { color: #a6e22e } /* Name.Exception */\n    .nf { color: #a6e22e } /* Name.Function */\n    .nl { color: #f8f8f2 } /* Name.Label */\n    .nn { color: #f8f8f2 } /* Name.Namespace */\n    .nx { color: #a6e22e } /* Name.Other */\n    .py { color: #f8f8f2 } /* Name.Property */\n    .nt { color: #f92672 } /* Name.Tag */\n    .nv { color: #f8f8f2 } /* Name.Variable */\n    .ow { color: #f92672 } /* Operator.Word */\n    .w { color: #f8f8f2 } /* Text.Whitespace */\n    .mf { color: #ae81ff } /* Literal.Number.Float */\n    .mh { color: #ae81ff } /* Literal.Number.Hex */\n    .mi { color: #ae81ff } /* Literal.Number.Integer */\n    .mo { color: #ae81ff } /* Literal.Number.Oct */\n    .sb { color: #e6db74 } /* Literal.String.Backtick */\n    .sc { color: #e6db74 } /* Literal.String.Char */\n    .sd { color: #e6db74 } /* Literal.String.Doc */\n    .s2 { color: #e6db74 } /* Literal.String.Double */\n    .se { color: #ae81ff } /* Literal.String.Escape */\n    .sh { color: #e6db74 } /* Literal.String.Heredoc */\n    .si { color: #e6db74 } /* Literal.String.Interpol */\n    .sx { color: #e6db74 } /* Literal.String.Other */\n    .sr { color: #e6db74 } /* Literal.String.Regex */\n    .s1 { color: #e6db74 } /* Literal.String.Single */\n    .ss { color: #e6db74 } /* Literal.String.Symbol */\n    .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */\n    .vc { color: #f8f8f2 } /* Name.Variable.Class */\n    .vg { color: #f8f8f2 } /* Name.Variable.Global */\n    .vi { color: #f8f8f2 } /* Name.Variable.Instance */\n    .il { color: #ae81ff } /* Literal.Number.Integer.Long */\n    \n    .gh { } /* Generic Heading & Diff Header */\n    .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */\n    .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */\n    .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */\n}",
-		".page-content .wrapper {\n    .post-toc {\n        &>ul {\n            overflow: auto;\n        }\n    }\n}\n\n.util-notify1 {\n    position: absolute;\n    z-index: 100;\n    background: rgba(0,0,0,0.7);\n    color: #FFF;\n    padding: 5px 10px;\n    font-size: 14px;\n    pointer-events: none;\n    opacity: 1;\n    transition: .2s ease;\n    \n    &.hidden {\n        opacity: 0;\n        display: none;\n    }\n}"
-	],
-	"names": [],
-	"mappings": "ACAA,AAAA,IAAI,CAAC,EACJ,MAAM,EAAE,CAAC,EACT,WAAW,EDAO,OAAO,ECCzB,SAAS,EDAS,IAAI,ECCtB,WAAW,EDCO,IAAI,GCAtB;;AACD,AAAA,CAAC,CAAC,EACD,eAAe,EAAE,IAAI,EACrB,KAAK,EAAE,IAAI,GACX;;AACD,AAAA,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAChB,eAAe,EAAC,SAAS,EACzB,KAAK,EAAE,IAAI,GACX;;AACD,AAAA,UAAU,CAAC,EACV,UAAU,EAAE,IAAI,EAChB,MAAM,EAAC,CAAC,EACR,OAAO,EAAE,QAAQ,EACjB,WAAW,EAAE,eAAe,GAC5B;;AACD,AAAA,IAAI,EAAC,GAAG,CAAC,EACR,WAAW,EDdS,aAAa,ECejC,SAAS,EDdW,IAAI,GCexB;;AACD,AAAA,IAAI,CAAC,EACJ,KAAK,EAAE,IAAI,EACX,gBAAgB,EAAE,IAAI,EACtB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,GAAG,GAClB;;AACD,AAAA,GAAG,CAAC,EACH,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,SAAS,GAClB;;AACD,AAAA,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EACb,KAAK,EAAE,OAAO,EACd,gBAAgB,EAAE,IAAI,GACtB;;AACD,AAAA,GAAG,CAAC,IAAI,CAAC,EACR,OAAO,EAAE,CAAC,GACV;;AACD,AAAA,KAAK,CAAC,EACF,OAAO,EAAE,IAAI,GAChB;;AACD,AAAA,OAAO,CAAC,EACP,UAAU,EAAE,MAAM,GAClB;;AACD,AAAA,KAAK,CAAC,EACL,eAAe,EAAE,QAAQ,EACzB,cAAc,EAAE,CAAC,EACd,MAAM,EAAE,SAAS,EACpB,UAAU,EAAE,IAAI,GAkBhB;;AAtBD,AAMC,KANI,CAMJ,EAAE,EANH,KAAK,CAMA,EAAE,CAAC,EACN,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,CAAC,GACT;;AAVF,AAYC,KAZI,CAYJ,EAAE,CAAC,EACF,YAAY,EAAE,IAAI,EAClB,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,IAAI,EACX,WAAW,EAAC,MAAM,GAClB;;AAjBF,AAmBC,KAnBI,CAmBJ,EAAE,CAAC,KAAK,CAAC,EACR,UAAU,EAAE,sBAAmB,GAC/B;;AAGF,AAAA,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,CAAA,EAChB,WAAW,EAAE,MAAM,GACnB;;ACzED,AAAA,QAAQ,CAAC,EACR,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GACjB;;AACD,MAAM,oBACL,GAAA,AAAA,QAAQ,CAAC,EACR,SAAS,EAAE,KAAK,GAChB,EAAA;;AAGF,AAAA,OAAO,CAAC,EACP,WAAW,EAAE,IAAmB,EAChC,gBAAgB,EFOL,KAAgB,EEN3B,OAAO,EAAE,IAAI,EACb,MAAM,EAAE,CAAC,GA6BT;;AAjCD,AAMC,OANM,CAMJ,KAAK,CAAC,EACP,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,KAAK,GACd;;AAVF,AAYC,OAZM,CAYN,WAAW,CAAC,EACX,KAAK,EAAE,IAAI,EACX,KAAK,EFFK,KAAkB,EEG5B,eAAe,EAAE,IAAI,EACrB,SAAS,EFvBQ,IAAI,EEwBrB,WAAW,EAAE,IAAmB,GAChC;;AAlBF,AAmBC,OAnBM,CAmBN,SAAS,CAAC,EACT,UAAU,EAAC,KAAK,GAYhB;;AAhCF,AAsBE,OAtBK,CAmBN,SAAS,CAGR,CAAC,CAAC,EACD,eAAe,EAAE,IAAI,EACrB,KAAK,EFbM,KAAkB,EEc7B,OAAO,EAAE,SAAS,EAClB,WAAW,EAAE,MAAM,GAKnB;;AA/BH,AA4BG,OA5BI,CAmBN,SAAS,CAGR,CAAC,CAME,KAAK,EA5BV,OAAO,CAmBN,SAAS,CAGR,CAAC,CAMW,KAAK,CAAC,EAChB,UAAU,EFnBI,KAAY,GEoB1B;;AAKJ,AAAA,aAAa,CAAC,EACb,UAAU,EAAC,OAAO,EAClB,OAAO,EAAE,MAAM,GA2Bf;;AA7BD,AAIC,aAJY,CAIZ,QAAQ,CAAC,EACR,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,cAAc,GAgBvB;;AAxBF,AASE,aATW,CAIZ,QAAQ,CAKL,KAAK,CAAC,EACP,KAAK,EAAC,IAAI,EACV,OAAO,EAAE,EAAE,EACX,OAAO,EAAC,KAAK,GACb;;AAbH,AAcE,aAdW,CAIZ,QAAQ,CAUL,MAAM,CAAC,EACR,OAAO,EAAE,EAAE,EACX,OAAO,EAAC,KAAK,EACb,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,IAAI,EACZ,IAAI,EAAE,KAAK,EACX,GAAG,EAAE,CAAC,EACN,UAAU,EAAE,IAAI,GAChB;;AAvBH,AA0BC,aA1BY,CA0BZ,GAAG,CAAC,EACH,SAAS,EAAC,IAAI,GACd;;AAIF,AAAA,SAAS,CAAC,EACT,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,IAAI,GACX;;AACD,AAAA,WAAW,CAAC,EACX,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,IAAI,EACb,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,EAAE,GACX;;AACD,AAAA,QAAQ,CAAA,EACP,KAAK,EAAE,IAAI,EACX,SAAS,EF5FS,IAAI,EE6FtB,cAAc,EAAE,IAAI,GAoBpB;;AAvBD,AAKC,QALO,CAKP,CAAC,CAAC,EACE,MAAM,EAAE,CAAC,GACZ;;AAPF,AAQI,QARI,CAQJ,EAAE,CAAC,EACC,YAAY,EAAE,IAAI,EAClB,MAAM,EAAE,CAAC,GACZ;;AAXL,AAaC,QAbO,CAaN,GAAK,EAAC,WAAW,EAAE,EAChB,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,IAAI,GACjB;;AAhBL,AAkBI,QAlBI,CAkBJ,cAAc,CAAC,EACd,KAAK,EAAE,IAAI,EACX,aAAa,EAAE,IAAI,EACnB,SAAS,EAAE,MAAsB,GACjC;;AAEL,MAAM,oBACL,GAAA,AAAA,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC7B,OAAO,EAAE,IAAI,GACb,CACD,AAAA,SAAS,EACT,WAAW,CAAC,EACX,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,IAAI,GACX,CACD,AAAA,QAAQ,CAAC,EACR,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,IAAI,EACX,aAAa,EAAE,IAAI,GACnB,CACD,AAAA,QAAQ,CAAA,GAAK,EAAC,WAAW,EAAE,EAC1B,UAAU,EAAE,IAAI,EAChB,WAAW,EAAC,CAAC,GACb,CACD,AAAA,WAAW,CAAC,KAAK,CAAC,EACjB,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,KAAK,EACd,OAAO,EAAE,GAAG,GACZ,EAnBA;;AAqBF,AAAA,eAAe,CAAC,EACf,UAAU,EAAE,MAAM,GA2BlB;;AA5BD,AAEC,eAFc,CAEd,OAAO,CAAC,EACP,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,KAAK,EACb,aAAa,EAAE,IAAI,EACnB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,KAAK,GACd;;AARF,AASC,eATc,CASd,KAAK,CAAC,EACL,SAAS,EFpJQ,IAAI,GEqJrB;;AAXF,AAYC,eAZc,CAYd,QAAQ,CAAC,EACR,UAAU,EAAE,IAAI,GAchB;;AA3BF,AAcE,eAda,CAYd,QAAQ,CAEP,CAAC,CAAC,EACD,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,QAAQ,EACjB,eAAe,EAAE,IAAI,EACrB,aAAa,EAAE,GAAG,EACf,WAAW,EAAE,MAAM,GAMtB;;AA1BH,AAsBG,eAtBY,CAYd,QAAQ,CAEP,CAAC,CAQE,KAAK,CAAC,EACP,UAAU,EAAE,oBAAoB,EAChC,UAAU,EAAE,IAAI,GAChB;;AAMJ,AAAA,OAAO,CAAC,EACP,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAC,MAAM,EACjB,KAAK,EAAC,IAAI,EACV,SAAS,EF9KS,IAAI,GE+KtB;;AClLD,AACI,KADC,CACD,YAAY,CAAC,EACZ,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,IAAI,EACnB,OAAO,EAAE,GAAG,GAmBZ;;AAvBL,AAKQ,KALH,CACD,YAAY,CAIR,WAAW,CAAC,EACX,SAAS,EAAC,IAAI,EACd,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,QAAQ,GAIhB;;AHaL,MAAM,8BGpBF,GALR,AAKQ,KALH,CACD,YAAY,CAIR,WAAW,CAAC,EAKV,SAAS,EAAE,IAAI,GAEhB,EAAA;;AAZT,AAaQ,KAbH,CACD,YAAY,CAYR,UAAU,CAAC,EACV,KAAK,EAAC,IAAI,EACV,SAAS,EHZC,IAAI,EGad,MAAM,EAAE,QAAQ,GAChB;;AHQL,MAAM,8BGxBN,GADJ,AACI,KADC,CACD,YAAY,CAAC,EAkBX,UAAU,EAAC,MAAM,EACjB,aAAa,EAAE,IAAI,EACnB,OAAO,EAAE,IAAI,GAEd,EAAA;;AAvBL,AAwBI,KAxBC,CAwBD,aAAa,CAAC,EACV,KAAK,EAAE,IAAI,GAgCd;;AAzDL,AA2BQ,KA3BH,CAwBD,aAAa,CAGT,EAAE,EA3BV,KAAK,CAwBD,aAAa,CAGN,EAAE,EA3Bb,KAAK,CAwBD,aAAa,CAGH,EAAE,EA3BhB,KAAK,CAwBD,aAAa,CAGA,EAAE,EA3BnB,KAAK,CAwBD,aAAa,CAGG,EAAE,EA3BtB,KAAK,CAwBD,aAAa,CAGM,EAAE,CAAC,EACd,KAAK,EAAE,IAAI,GACd;;AA7BT,AA+BQ,KA/BH,CAwBD,aAAa,CAOT,EAAE,CAAC,EACC,SAAS,EAAE,QAAQ,GACtB;;AAjCT,AAmCQ,KAnCH,CAwBD,aAAa,CAWT,EAAE,EAnCV,KAAK,CAwBD,aAAa,CAWL,EAAE,CAAC,EAEN,aAAa,EAAE,IAAI,EAChB,UAAU,EAAE,IAAI,GACnB;;AAvCT,AAyCQ,KAzCH,CAwBD,aAAa,CAiBT,EAAE,EAzCV,KAAK,CAwBD,aAAa,CAiBL,EAAE,EAzCd,KAAK,CAwBD,aAAa,CAiBD,EAAE,CAAC,EACP,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,OAAe,GAC5C;;AA3CT,AA6CQ,KA7CH,CAwBD,aAAa,CAqBT,GAAG,CAAC,EACH,MAAM,EAAE,OAAO,GAIf;;AHzBL,MAAM,8BGoBF,GA7CR,AA6CQ,KA7CH,CAwBD,aAAa,CAqBT,GAAG,CAAC,EAGF,MAAM,EAAE,OAAO,GAEhB,EAAA;;AAlDT,AAoDQ,KApDH,CAwBD,aAAa,CA4BT,aAAa,CAAC,EACV,OAAO,EAAE,KAAK,EACd,WAAW,EAAE,IAAI,EACjB,YAAY,EAAE,IAClB,GAAC;;AAxDT,AA0DI,KA1DC,CA0DD,cAAc,CAAC,EACX,WAAW,EAAE,IAAI,GACpB;;AC5DL,AACA,KADK,CACL,aAAa,CAAC,EACb,SAAS,EAAC,IAAI,EACd,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,GAAG,GAKX;;AJgBG,MAAM,8BIxBV,GADA,AACA,KADK,CACL,aAAa,CAAC,EAKZ,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,IAAI,GAEhB,EAAA;;AATD,AAUA,KAVK,CAUL,SAAS,CAAC,EACT,KAAK,EAAC,KAAK,EACR,eAAe,EAAE,IAAI,EACrB,MAAM,EAAC,SAAS,EAChB,KAAK,EAAE,IAAI,EACX,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,MAAqB,EAChC,OAAO,EAAE,OAAO,GAKnB;;AAtBD,AAmBI,KAnBC,CAUL,SAAS,CASH,KAAK,EAnBX,KAAK,CAUL,SAAS,CASM,KAAK,CAAC,EACb,KAAK,EAAE,IAAI,GACd;;AArBL,AAuBA,KAvBK,CAuBL,UAAU,CAAC,EACP,MAAM,EAAE,CAAC,EACZ,OAAO,EAAE,QAAQ,EACd,UAAU,EAAE,IAAI,GAmDnB;;AA7ED,AA2BI,KA3BC,CAuBL,UAAU,GAIJ,EAAE,CAAC,EACD,cAAc,EAAE,GAAG,EACnB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,OAAe,EAC5C,aAAa,EAAE,GAAG,GAClB;;AA/BL,AAgCI,KAhCC,CAuBL,UAAU,CASN,WAAW,CAAC,EACX,SAAS,EAAE,IAAI,EACf,WAAW,EAAE,IAAI,EACjB,MAAM,EAAE,CAAC,GACT;;AApCL,AAqCI,KArCC,CAuBL,UAAU,CAcN,UAAU,CAAC,EACV,SAAS,EJnCK,IAAI,EIoClB,KAAK,EAAE,OAAkB,EACtB,MAAM,EAAE,KAAK,EACb,aAAa,EAAE,IAAI,GACtB;;AA1CL,AA2CI,KA3CC,CAuBL,UAAU,CAoBN,aAAa,CAAC,EA6BV,MAAM,EAAE,KAAK,GAChB;;AAzEL,AA4CQ,KA5CH,CAuBL,UAAU,CAoBN,aAAa,EA3CjB,KAAK,CAuBL,UAAU,CAoBN,aAAa,CACN,CAAC,CAAC,EACD,SAAS,EJ1CF,IAAI,EI2CX,WAAW,EAAE,MAAsB,EACnC,WAAW,EAAE,CAAC,EACd,cAAc,EAAE,CAAC,EACpB,KAAK,EAAE,IAAI,GACX;;AAlDT,AAmDQ,KAnDH,CAuBL,UAAU,CAoBN,aAAa,CAQT,IAAI,EAnDZ,KAAK,CAuBL,UAAU,CAoBN,aAAa,CAQH,GAAG,EAnDjB,KAAK,CAuBL,UAAU,CAoBN,aAAa,CAQE,GAAG,CAAC,CAAC,CAAC,EACb,KAAK,EAAE,IAAI,EACX,gBAAgB,EAAE,IAAI,GACzB;;AAtDT,AAuDQ,KAvDH,CAuBL,UAAU,CAoBN,aAAa,CAYT,EAAE,CAAC,EACC,YAAY,EAAE,IAAI,EAClB,gBAAgB,EAAE,IAAI,GACzB;;AA1DT,AA2DQ,KA3DH,CAuBL,UAAU,CAoBN,aAAa,CAgBT,CAAC,CAAC,EACE,KAAK,EJ3CE,OAAc,GI4CxB;;AA7DT,AA8DQ,KA9DH,CAuBL,UAAU,CAoBN,aAAa,CAmBT,GAAG,CAAC,EACA,OAAO,EAAE,KAAK,EACd,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,EAAE,EACX,UAAU,EAAE,WAAW,GAI1B;;AAvET,AAoEY,KApEP,CAuBL,UAAU,CAoBN,aAAa,CAmBT,GAAG,CAMG,KAAK,CAAC,EACJ,OAAO,EAAE,CAAC,GACb;;AJ7CT,MAAM,8BIFV,GAvBA,AAuBA,KAvBK,CAuBL,UAAU,CAAC,EAoDT,OAAO,EAAE,IAAI,GAEd,EAAA;;AA7ED,AA8EA,KA9EK,CA8EL,WAAW,CAAC,EACX,UAAU,EAAC,MAAM,EACjB,eAAe,EAAC,IAAI,EACpB,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,MAAM,GAkBd;;AApGD,AAmFI,KAnFC,CA8EL,WAAW,CAKP,YAAY,CAAC,EACZ,MAAM,EAAC,MAAM,GACb;;AArFL,AAsFI,KAtFC,CA8EL,WAAW,CAQP,SAAS,EAtFb,KAAK,CA8EL,WAAW,CAQG,KAAK,CAAC,EACf,OAAO,EAAE,SAAS,EAClB,WAAW,EAAE,MAAM,GACnB;;AAzFL,AA0FI,KA1FC,CA8EL,WAAW,CAYP,CAAC,AAAA,SAAS,EA1Fd,KAAK,CA8EL,WAAW,CAYI,CAAC,AAAA,KAAK,CAAC,EACjB,KAAK,EAAE,IAAI,EACX,aAAa,EAAE,IAAI,EACnB,MAAM,EAAE,cAAc,GACtB;;AA9FL,AA+FI,KA/FC,CA8EL,WAAW,CAiBP,CAAC,AAAA,SAAS,CAAC,KAAK,EA/FpB,KAAK,CA8EL,WAAW,CAiBU,CAAC,AAAA,KAAK,CAAC,KAAK,CAAC,EAC7B,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,IAAI,EACX,eAAe,EAAC,IAAI,GACpB;;AJ1ED,MAAM,8BE8JT,GAAA,AAAA,aAAa,CAAC,EACb,OAAO,EAAE,CAAC,GACV,CACD,AAAA,OAAO,CAAC,EACP,OAAO,EAAE,MAAO,GAChB,EAHA;;AFhKE,MAAM,8BEuKR,GADD,AACC,OADM,EAAP,OAAO,CACH,SAAS,CAAA,EACX,UAAU,EAAC,MAAM,GACjB,CAHF,AAIC,OAJM,CAIN,WAAW,CAAC,EACX,KAAK,EAAE,IAAI,GACX,CAEF,AAAA,SAAS,CAAC,EACT,OAAO,EAAE,IAAI,GACb,CACD,AAAA,QAAQ,CAAC,EACR,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,IAAI,EACX,aAAa,EAAE,IAAI,GACnB,CACD,AAAA,GAAG,CAAC,EACH,OAAO,EAAE,IAAI,GACb,EAfC;;AGlMH,2FAA2F;AAC3F,AAAA,UAAU,CAAC,EAEe,aAAa,CACgB,WAAW,CACxC,aAAa,CACb,aAAa,CACb,UAAU,CACV,cAAc,CACd,iBAAiB,CAChB,uBAAuB,CACvB,qBAAqB,CACrB,oBAAoB,CACpB,qBAAqB,CACjB,kBAAkB,CACnB,oBAAoB,CACvB,sBAAsB,CACtB,yBAAyB,CACzB,uBAAuB,CACvB,oBAAoB,CACpB,sBAAsB,CACtB,kBAAkB,CAClB,kBAAkB,CACnB,oBAAoB,CACpB,oBAAoB,CACnB,oBAAoB,CACpB,kBAAkB,CAClB,gBAAgB,CAChB,mBAAmB,CACnB,oBAAoB,CACpB,iBAAiB,CACjB,oBAAoB,CACpB,mBAAmB,CACnB,gBAAgB,CAChB,oBAAoB,CACpB,gBAAgB,CAChB,mBAAmB,CACnB,cAAc,CACd,mBAAmB,CACnB,mBAAmB,CACpB,qBAAqB,CACpB,0BAA0B,CAC1B,wBAAwB,CACxB,4BAA4B,CAC5B,wBAAwB,CACxB,6BAA6B,CAC7B,yBAAyB,CACzB,wBAAwB,CACxB,2BAA2B,CAC3B,2BAA2B,CAC3B,4BAA4B,CAC5B,6BAA6B,CAC7B,0BAA0B,CAC1B,0BAA0B,CAC1B,2BAA2B,CAC3B,2BAA2B,CAC3B,yBAAyB,CACzB,yBAAyB,CACzB,0BAA0B,CAC1B,4BAA4B,CAC5B,iCAAiC,CAEhD,mCAAmC,CACnB,gDAAgD,CAChD,oCAAoC,CACpC,sCAAsC,EACjE;;AAjED,AACI,UADM,CACN,IAAI,CAAC,EAAE,gBAAgB,EAAE,OAAQ,GAAE;;AADvC,AAEI,UAFM,CAEN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAF1B,AAGI,UAHM,CAGN,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAQ,GAAE;;AAHvD,AAII,UAJM,CAIN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAJ1B,AAKI,UALM,CAKN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAL1B,AAMI,UANM,CAMN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAN1B,AAOI,UAPM,CAON,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAP1B,AAQI,UARM,CAQN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAR1B,AASI,UATM,CASN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAT3B,AAUI,UAVM,CAUN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAV3B,AAWI,UAXM,CAWN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAX3B,AAYI,UAZM,CAYN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAZ3B,AAaI,UAbM,CAaN,GAAG,CAAC,EAAE,UAAU,EAAE,MAAO,GAAE;;AAb/B,AAcI,UAdM,CAcN,GAAG,CAAC,EAAE,WAAW,EAAE,IAAK,GAAE;;AAd9B,AAeI,UAfM,CAeN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAf3B,AAgBI,UAhBM,CAgBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAhB3B,AAiBI,UAjBM,CAiBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAjB3B,AAkBI,UAlBM,CAkBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAlB3B,AAmBI,UAnBM,CAmBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAnB3B,AAoBI,UApBM,CAoBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AApB3B,AAqBI,UArBM,CAqBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AArB3B,AAsBI,UAtBM,CAsBN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAtB1B,AAuBI,UAvBM,CAuBN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAvB1B,AAwBI,UAxBM,CAwBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAxB3B,AAyBI,UAzBM,CAyBN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAzB3B,AA0BI,UA1BM,CA0BN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA1B3B,AA2BI,UA3BM,CA2BN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA3B3B,AA4BI,UA5BM,CA4BN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA5B3B,AA6BI,UA7BM,CA6BN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA7B3B,AA8BI,UA9BM,CA8BN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA9B3B,AA+BI,UA/BM,CA+BN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA/B3B,AAgCI,UAhCM,CAgCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAhC3B,AAiCI,UAjCM,CAiCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAjC3B,AAkCI,UAlCM,CAkCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAlC3B,AAmCI,UAnCM,CAmCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAnC3B,AAoCI,UApCM,CAoCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AApC3B,AAqCI,UArCM,CAqCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AArC3B,AAsCI,UAtCM,CAsCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAtC3B,AAuCI,UAvCM,CAuCN,EAAE,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAvC1B,AAwCI,UAxCM,CAwCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAxC3B,AAyCI,UAzCM,CAyCN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAzC3B,AA0CI,UA1CM,CA0CN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA1C3B,AA2CI,UA3CM,CA2CN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA3C3B,AA4CI,UA5CM,CA4CN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA5C3B,AA6CI,UA7CM,CA6CN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA7C3B,AA8CI,UA9CM,CA8CN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA9C3B,AA+CI,UA/CM,CA+CN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA/C3B,AAgDI,UAhDM,CAgDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAhD3B,AAiDI,UAjDM,CAiDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAjD3B,AAkDI,UAlDM,CAkDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAlD3B,AAmDI,UAnDM,CAmDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAnD3B,AAoDI,UApDM,CAoDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AApD3B,AAqDI,UArDM,CAqDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AArD3B,AAsDI,UAtDM,CAsDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAtD3B,AAuDI,UAvDM,CAuDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAvD3B,AAwDI,UAxDM,CAwDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAxD3B,AAyDI,UAzDM,CAyDN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AAzD3B,AA0DI,UA1DM,CA0DN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA1D3B,AA2DI,UA3DM,CA2DN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAQ,GAAE;;AA3D3B,AA8DI,UA9DM,CA8DN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,GAAI;;AA9D5B,AA+DI,UA/DM,CA+DN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,GAAI;;AA/D5B,AAgEI,UAhEM,CAgEN,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,GAAI;;ACjE5B,AAEQ,aAFK,CAAC,QAAQ,CAClB,SAAS,GACH,EAAE,CAAC,EACD,QAAQ,EAAE,IAAI,GACjB;;AAIT,AAAA,aAAa,CAAC,EACV,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EACZ,UAAU,EAAE,kBAAe,EAC3B,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,IAAI,EACf,cAAc,EAAE,IAAI,EACpB,OAAO,EAAE,CAAC,EACV,UAAU,EAAE,QAAQ,GAMvB;;AAfD,AAWI,aAXS,AAWR,OAAO,CAAC,EACL,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,IAAI,GAChB"
-}
\ No newline at end of file
diff --git a/_site/css/timeline.css b/_site/css/timeline.css
deleted file mode 100644
index 114ff73..0000000
--- a/_site/css/timeline.css
+++ /dev/null
@@ -1,235 +0,0 @@
-.timeline{
-  --uiTimelineMainColor: var(--timelineMainColor, #35008a);
-  --uiTimelineSecondaryColor: var(--timelineSecondaryColor, #fff);
-  --uiTimelineDateColor: var(--timelineYearColor, #1470ff);
-
-  position: relative;
-  /* padding-top: 3rem; */
-  /* padding-bottom: 3rem; */
-}
-
-.timeline:before{
-  content: "";
-  width: 4px;
-  height: 100%;
-  background-color: var(--uiTimelineMainColor);
-
-  position: absolute;
-  top: 0;
-}
-
-.timeline__group{
-  position: relative;
-}
-
-.timeline__group:not(:first-of-type){
-  margin-top: 2rem;
-}
-
-.timeline__group:last-of-type{
-  margin-bottom: 0rem;
-}
-
-.timeline__year{
-  padding: .5rem 1.5rem;
-  color: var(--uiTimelineSecondaryColor);
-  background-color: var(--uiTimelineMainColor);
-
-  position: absolute;
-  left: 0;
-  bottom: 0;
-}
-
-.timeline__box{
-  position: relative;
-  bottom: 6rem;
-}
-
-.timeline__box:not(:last-of-type){
-  margin-bottom: 30px;
-}
-
-.timeline__box:before{
-  content: "";
-  /* width: 100%; */
-  width: auto;
-  height: 2px;
-  background-color: var(--uiTimelineMainColor);
-
-  position: absolute;
-  left: 0;
-  z-index: -1;
-}
-
-.timeline__date{
-  min-width: 65px;
-  position: absolute;
-  left: 0;
-
-  box-sizing: border-box;
-  padding: .5rem 1.5rem;
-  text-align: center;
-
-  background-color: var(--uiTimelineDateColor);
-  color: var(--uiTimelineSecondaryColor);
-}
-
-.timeline__day{
-  font-size: 2rem;
-  font-weight: 700;
-  display: block;
-}
-
-.timeline__month{
-  display: block;
-  font-size: .8em;
-  text-transform: uppercase;
-}
-
-.timeline__post{
-  padding: 1.5rem 1rem 1.5rem 1rem;
-  border-radius: 2px;
-  border-left: 3px solid var(--uiTimelineMainColor);
-  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 1px 2px 0 rgba(0, 0, 0, .24);
-  background-color: var(--uiTimelineSecondaryColor);
-  display: inline-block;
-}
-
-@media screen and (min-width: 641px){
-
-  .timeline:before{
-	left: 30px;
-  }
-
-  .timeline__group{
-	padding-top: 55px;
-  }
-
-  .timeline__box{
-	padding-left: 80px;
-  }
-
-  .timeline__box:before{
-    top: 50%;
-    transform: translateY(-50%);  
-  }  
-
-  .timeline__date{
-    top: 50%;
-    margin-top: -27px;
-  }
-}
-
-@media screen and (max-width: 640px){
-
-  .timeline:before{
-    left: 0;
-  }
-
-  .timeline__group{
-    padding-top: 40px;
-  }
-
-  .timeline__box{
-    padding-left: 20px;
-    padding-top: 70px;
-  }
-
-  .timeline__box:before{
-    top: 90px;
-  }    
-
-  .timeline__date{
-    top: 0;
-  }
-}
-
-.timeline{
-  --timelineMainColor: #4557bb;
-  font-size: 16px;
-}
-
-@media screen and (min-width: 768px){
-
-  html{
-    font-size: 62.5%;
-  }
-}
-
-@media screen and (max-width: 767px){
-
-  html{
-    font-size: 55%;
-  }
-}
-
-/*
-* demo page
-*/
-
-@media screen and (min-width: 768px){
-
-  html{
-    font-size: 62.5%;
-  }
-}
-
-@media screen and (max-width: 767px){
-
-  html{
-    font-size: 50%;
-  }
-}
-
-.page{
-  min-height: 100vh;
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-}
-
-.page__demo{
-  flex-grow: 1;
-}
-
-.main-container{
-  max-width: 960px;
-  padding-left: 2rem;
-  padding-right: 2rem;
-
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.page__container{
-  padding-top: 30px;
-  padding-bottom: 30px;
-  max-width: 800px;
-}
-
-.footer{
-  padding-top: 1rem;
-  padding-bottom: 1rem;
-  text-align: center;  
-  font-size: 1.4rem;
-}
-
-.footer__link{
-  text-decoration: none;
-  color: inherit;
-}
-
-@media screen and (min-width: 361px){
-
-  .footer__container{
-    display: flex;
-    justify-content: space-between;
-  }
-}
-
-@media screen and (max-width: 360px){
-
-  .melnik909{
-    display: none;
-  } 
-}
diff --git a/_site/feed.xml b/_site/feed.xml
index 704df68..695da2d 100644
--- a/_site/feed.xml
+++ b/_site/feed.xml
@@ -1,18 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
-  <channel>
-    <title>Stop Talking, Start Doing</title>
-    <description>My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
-</description>
-    <link>https://codersherlock.github.com//</link>
-    <atom:link href="https://codersherlock.github.com//feed.xml" rel="self" type="application/rss+xml"/>
-    <pubDate>Wed, 13 Oct 2021 19:10:30 -0400</pubDate>
-    <lastBuildDate>Wed, 13 Oct 2021 19:10:30 -0400</lastBuildDate>
-    <generator>Jekyll v4.1.1</generator>
-    
-      <item>
-        <title>EDDL: How do we train neural networks on limited edge devices - PART 1</title>
-        <description>&lt;p&gt;This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
+<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.2.1">Jekyll</generator><link href="http://localhost:4000/feed.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" hreflang="en" /><updated>2021-10-25T11:57:39-04:00</updated><id>http://localhost:4000/feed.xml</id><title type="html">Stop Talking, Start Doing</title><subtitle>My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+</subtitle><author><name>Pengzhan Hao</name><email>haopengzhan@gmail.com</email></author><entry><title type="html">EDDL: How do we train neural networks on limited edge devices - PART 1</title><link href="http://localhost:4000/posts/eddl-how-do-we-train-on-limited-edge-devices" rel="alternate" type="text/html" title="EDDL: How do we train neural networks on limited edge devices - PART 1" /><published>2021-10-13T16:53:20-04:00</published><updated>2021-10-13T16:53:20-04:00</updated><id>http://localhost:4000/posts/eddl-how-do-we-train-on-limited-edge-devices</id><content type="html" xml:base="http://localhost:4000/posts/eddl-how-do-we-train-on-limited-edge-devices">&lt;p&gt;This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
 As the first part of the introductions, I focus only on the motivation and summary of our works.
 More details in design and implementation can be found in late posts.&lt;/p&gt;
 
@@ -88,20 +75,7 @@ Smartly schedule work balance and handle join/exit issues also need under consid
   Devices with sufficient bandwidth can also work as virtual leader devices.
   This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.&lt;/p&gt;
   &lt;/li&gt;
-&lt;/ul&gt;
-</description>
-        <pubDate>Wed, 13 Oct 2021 16:53:20 -0400</pubDate>
-        <link>https://codersherlock.github.com//archivers/eddl-how-do-we-train-on-limited-edge-devices</link>
-        <guid isPermaLink="true">https://codersherlock.github.com//archivers/eddl-how-do-we-train-on-limited-edge-devices</guid>
-        
-        
-        <category>Research</category>
-        
-      </item>
-    
-      <item>
-        <title>Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</title>
-        <description>&lt;p&gt;Let’s generate a word cloud like this. 
+&lt;/ul&gt;</content><author><name>Pengzhan Hao</name><email>haopengzhan@gmail.com</email></author><category term="Research" /><summary type="html">This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published. As the first part of the introductions, I focus only on the motivation and summary of our works. More details in design and implementation can be found in late posts. Why do we need training on edge? Cloud is not trustworthy anymore. More and more facts supports that breach on cloud happens frequently than before. Nowadays, with more generated personal sensitive data has been uploaded to the cloud center, tech company know better to someones than user themselves. Researchers, no matter in industry on academia, are working in a way that still learning from users’ data but also keeping raw sensitive data under users’ control. Many publications already showed feasibility of only sharing after-trained model instead of raw data. One recent popular study on this is google’s federated learning. During investigated this problem, we found that let end user train their own data is safe, but sacrifice efficiency. Since one end device has limited resources, training time and power consumption can be disappointing. We believe there must have a leverage between privacy and efficiency in some target scenarios. Fortunately, we observed that users who belongs to the same campus, plant, firm and community always share similar interests. Therefore, these co-located users have similar demands in using AI-involved routines. Also, co-located users are easily targeted by same type of threats, such as ransomware to financial practitioners. Think about this, sending features of a new malware app to cloud services in order to train a neural networks used by antivirus program. This process may takes long time and small amount of samples may not be recognized by the global neural networks model. With a customized local model trained and deployed on the edge can successfully counter the problem. With edge training as a supplement of cloud training can achieve better response time and let the whole system more flexible. Why training on edge is hard? Since all co-located users’ device can be used for an edge training, issues and challenges occur as deploying this distributed system. The first challenge is struggling workers. Training devices are heterogeneity, from limited IoT camera to high-end media center with powerful GPU. They are not designed to do machine learnings. So, a good edge-based distributed learning framework must can handle variety speeds in training tasks. The second challenge is how to scale up clusters. In a campus, thousands and more devices may contribute computing resources to the same training tasks. However, these devices may located in far not matter in physical or in network topology. How can we well use them well, without struggled with endless transmission time remains a challenge. The third issue is frequently joining and exiting of devices. We can’t rely on each devices to faithfully working on training tasks rather than their original workload. Smartly schedule work balance and handle join/exit issues also need under consideration. Our proposal Dynamic training data distribution and runtime profiler We design a dynamic training data distribution mechanism that helps to both the first and the third challenges. Preprocessing data can be transmitted without leakage of raw sensitive information. This can helps with struggling workers who can train small batches in order to upload parameters with a similar training time. Also, for extremely slow devices, join and exit of devices cases, dynamic data distribution and profiler can helps with keep global training parameters from polluted and staleness. To counter heterogeneity’s, more approaches were applied in our later research. More details were introduced to runtime profiler in the later works. Asynchronous and synchronous aggregation enabled In our findings, asynchronous and synchronous parameter update have their pros and cons. Keeping sync all the time leads struggling worker issue unsolvable. However, async’s harm to accuracy and convergence time also need attentions. To carefully chose between these two update policies at the runtime is what we proposed to make use of their own advantages. Leader role splitting The idea is to let worker devices with higher bandwidth taking leader role during training. Parameter updating does not require much computation but only need bandwidth. Devices with sufficient bandwidth can also work as virtual leader devices. This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.</summary></entry><entry><title type="html">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</title><link href="http://localhost:4000/posts/generate-word-cloud-with-chinese-fenci" rel="alternate" type="text/html" title="Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries" /><published>2020-09-15T22:00:14-04:00</published><updated>2020-09-15T22:00:14-04:00</updated><id>http://localhost:4000/posts/generate-word-cloud-with-chinese-fenci</id><content type="html" xml:base="http://localhost:4000/posts/generate-word-cloud-with-chinese-fenci">&lt;p&gt;Let’s generate a word cloud like this. 
 Don’t understand the language is not a big deal.
 If your written language is based on latin alphabet(or other language has space between words), skip tokenization.&lt;/p&gt;
 
@@ -143,7 +117,7 @@ If your written language is based on latin alphabet(or other language has space
 &lt;p&gt;Two popular tokenization library were used, and I chose &lt;a href=&quot;https://github.com/fxsjy/jieba&quot;&gt;jieba&lt;/a&gt; after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks.&lt;/p&gt;
 
 &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;remove_biaodian&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
-    &lt;span class=&quot;n&quot;&gt;punct&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;u''':!),.:;?]}¢'&quot;、。〉》」』】〕〗〞︰︱︳﹐､﹒
+    &lt;span class=&quot;n&quot;&gt;punct&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;''':!),.:;?]}¢'&quot;、。〉》」』】〕〗〞︰︱︳﹐､﹒
                 ﹔﹕﹖﹗﹚﹜﹞！），．：；？｜｝︴︶︸︺︼︾﹀﹂﹄﹏､～￠
                 々‖•·ˇˉ―--′’”([{£¥'&quot;‵〈《「『【〔〖（［｛￡￥〝︵︷︹︻
                 ︽︿﹁﹃﹙﹛﹝（｛“‘-—_…'''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
@@ -259,21 +233,7 @@ If your written language is based on latin alphabet(or other language has space
 
 &lt;p&gt;&lt;img src=&quot;/static/2020-09/2020-06-28.png&quot; height=&quot;150&quot; /&gt;&lt;/p&gt;
 
-&lt;p&gt;This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.&lt;/p&gt;
-
-</description>
-        <pubDate>Tue, 15 Sep 2020 22:00:14 -0400</pubDate>
-        <link>https://codersherlock.github.com//archivers/generate-word-cloud-with-chinese-fenci</link>
-        <guid isPermaLink="true">https://codersherlock.github.com//archivers/generate-word-cloud-with-chinese-fenci</guid>
-        
-        
-        <category>visualization</category>
-        
-      </item>
-    
-      <item>
-        <title>Xv6 introduction</title>
-        <description>&lt;p&gt;In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
+&lt;p&gt;This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.&lt;/p&gt;</content><author><name>Pengzhan Hao</name><email>haopengzhan@gmail.com</email></author><category term="visualization" /><summary type="html">Let’s generate a word cloud like this. Don’t understand the language is not a big deal. If your written language is based on latin alphabet(or other language has space between words), skip tokenization. Background Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used TinyTinyRSS, or as ttrss, a popular RSS client which friendly to docker. Thanks to developer HenryQW, a well-written Nginx-based docker configuration is already available in docker hub. With more feeds were added, I found some feeds does not need to be checked everyday. Thus I was thinking to create a script to automatically list all keywords appears in a last period and generate a heat map kind figure of it. Before you go further, I’ll tell you all my settings to give readers a general overview. My first step is to read all text-based information from TTRSS’s PostgreSQL database. With information, I used a Chinese-NLP library, jieba, to extract all keyword with their occurrences frequency. By using WordCloud, a python library, word cloud figure is generated and present. More details will be discussed in later sections. Get RSS feeds’ text My first thought is generating a keyword heat map for economy news of a last week. Since this blog post are more skewed to Chinese tokenization and draw the word cloud figure. I’ll leave my code here just in case. The SQL connector I used is psycopg2, an easy-use PostgreSQL library. def __init__(self): self.dbe = psycopg2.connect( host=DB_HOST, port=DB_PORT, database=DB_NAME, user=DB_USER, password=DB_PASS) def get_1w_of_feed_byid(self, id=1) -&amp;gt; list: cur = self.dbe.cursor() cur.execute('SELECT content FROM public.ttrss_entries \ where date_updated &amp;gt; now() - interval \'1 week\' AND id in ( \ select int_id from DB_TABLE_NAME \ where feed_id=' + str(id) + ' \ ) \ ORDER BY id ASC ' ) rows = cur.fetchall() return rows Most arguments are intuitive and easy to understand. The only exception is argument of function get_1w_of_feed_byid. This id is the feed index of my subscriptions. Tokenize with frequency Two popular tokenization library were used, and I chose jieba after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks. def remove_biaodian(text: str) -&amp;gt; str: punct = set(u''':!),.:;?]}¢'&quot;、。〉》」』】〕〗〞︰︱︳﹐､﹒ ﹔﹕﹖﹗﹚﹜﹞！），．：；？｜｝︴︶︸︺︼︾﹀﹂﹄﹏､～￠ 々‖•·ˇˉ―--′’”([{£¥'&quot;‵〈《「『【〔〖（［｛￡￥〝︵︷︹︻ ︽︿﹁﹃﹙﹛﹝（｛“‘-—_…''') ret = &quot;&quot; for x in text: if x in punct: ret += '' else: ret += x return ret After we have an all characters string, we can call jieba. By using the function jieba.posseg.cut with or without paddle, we can have a word list and their “part of speech”. As you can see in the following code, I also did two more works. First, in the if statement, I only kept all nouns with some categories. Category abbreviation such as “nr” and “ns” represent different “part of speech”, I attached with categories I used in the following table. For more details you can find in this link. The second work is only keeping words with length longer than 2 characters. In Chinese, there’s no space between words such as Latin writing systems. Since then, some single-character-words such as conjunction words are easy to be misrecognized as specialty-noun. And this misrecognition will cause more single-character being regarded as specialty-noun. I am not able to improve NLP method, so I used a easy way to fix this by removing any words less than 2 characters. import jieba.posseg as pseg def get_noun_jieba(self, content: str) -&amp;gt; list: content = remove_biaodian(content) words = pseg.cut(content) # Invoking jieba.posseg.cut function ret = [] for word, flag in words: # print(word, flag) if flag in ['nr', 'ns', 'nt', 'nw', 'nz', 'PER', 'ORG', 'x']: # LOC ret.append(word) return [remove_biaodian(i) for i in ret if i.strip() != &quot;&quot; and len(remove_biaodian(i.strip())) &amp;gt;= 2] Word category names and abbreviations Abbreviation Category name/ Part of speech nr People name noun ns Location name noun nt Organization name noun nw Arts work noun nz Other noun PER People name noun ORG Location name noun x Non-morpheme word With all words extracted, we can easily calculate their frequencies. After this, we can using the following line of code to print a sorted result to verify correctness. noun = seg.get_noun_jieba(test_content) # ... Calculate frequency of above word list ... print(sorted(a_dict.items(), key=lambda x: x[1])) Draw word cloud With a keyword and frequency dictionary(data structure), we can just call built-in functions from wordcloud library to generate the figure. First we need to initialize an instance of wordcloud class. As you can see in my code, I set it with 6 parameters. Width and Height of the canvas, maximum amount of words used to generate the figure, the font of words, background color and margin between any two words. After having the instance, we call function generate_from_frequencies and pass keyword dictionary to it. The return value of this function is an bitmap image, which we can use matplotlib to plot it to your screen. I tested my plot on ubuntu-subsystem on Windows 10, unfortunately matplotlib under subsystem depends on x11 window manager and its not default available on windows. We need to install an x11 manager to support. Xming is the one I used. from wordcloud import WordCloud import matplotlib.pyplot as plt font_path = &quot;./font/haipai.ttf&quot; output_path = &quot;./font/out.png&quot; def show_figure_with_frequency(keywords: dict): wc = WordCloud(width=828, height=1792, max_words=200, font_path=font_path, background_color=&quot;white&quot;, margin=1).generate_from_frequencies(keywords) plt.imshow(wc) plt.axis('off') plt.show() If everything work fine, a word cloud figure will show up in a new window. My version looks like this. This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.</summary></entry><entry><title type="html">Xv6 introduction</title><link href="http://localhost:4000/posts/intro-xv6" rel="alternate" type="text/html" title="Xv6 introduction" /><published>2017-07-28T14:56:55-04:00</published><updated>2017-07-28T14:56:55-04:00</updated><id>http://localhost:4000/posts/intro-xv6</id><content type="html" xml:base="http://localhost:4000/posts/intro-xv6">&lt;p&gt;In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
 Understand system call and know how to implement a simple one will be coved as the first half.
 In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.&lt;/p&gt;
 
@@ -347,20 +307,7 @@ Using ssh may connect to different physical devices under same domain name, this
 
 &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;target remote localhost:28467
 &lt;span class=&quot;c&quot;&gt;# target remote [ip-addr]:28467&lt;/span&gt;
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-</description>
-        <pubDate>Fri, 28 Jul 2017 14:56:55 -0400</pubDate>
-        <link>https://codersherlock.github.com//archivers/intro-xv6</link>
-        <guid isPermaLink="true">https://codersherlock.github.com//archivers/intro-xv6</guid>
-        
-        
-        <category>xv6</category>
-        
-      </item>
-    
-      <item>
-        <title>Some of my previews experiment works: 2016</title>
-        <description>&lt;p&gt;This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.&lt;/p&gt;
+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Pengzhan Hao</name><email>haopengzhan@gmail.com</email></author><category term="xv6" /><summary type="html">In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes. Understand system call and know how to implement a simple one will be coved as the first half. In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb. Xv6 Systemcall To invoke a system call, we have to first define a user mode function to be the interface of the kernel instruction in file user.h. void function (void); This interface-like function will then pass the function name, in this case function, to usys.S. When using user mode function in programs, usys.S will generate a reference to SYS_function and push system call number of this function into %eax. After that, system can know from syscall.c and determining whether this system call is available. We must define same name system function and add it into syscall.h and syscall.c. #define SYS_function ## // ## is the system call number [SYS_function] sys_function // real system function name extern int sys_function(void); // real system function declaration After adding these sentences to syscall files, we can implement real function in specific place where you want to make the function works well. Sometimes, we need to pass variables among system calls. In this case, variables’ values are not necessary and even can’t be pass directly into system_function. When invoke a system call function, all variables of this system call will be pushed into current process’ stack. In file syscall.c, multiple functions are provided to get these variables from the process. I won’t waste time on explaining how to use these functions especially when elegant and detailed comments were written in source codes. However, I will explain concepts and how process organized and works in xv6 in future articles. Debug xv6 with gdb Please make sure that you have used gdb before. If you never used gdb, you may write a simple 50-100 lines c code and practice how to use gdb first. GDB Manual GDB cheatsheet (pdf) To make sure xv6 gdb enabled, please check if .gdbinit.tmpl file exist. This file is used for generate .gdbinit file which you can late consider it as a configuration for gdb. Before running the xv6 instance in QEMU, one more thing you need to know is that using gdb to debug xv6 must be attached remotely. This is because xv6 was running within QEMU, and emulator is virtually gapped from the host device. Later when you start debugging, QEMU will open a gdb server to let gdb client connect to. Once you want to start, using following command to compile and run xv6 $ make qemu-nox-gdb *** Now run 'gdb'. qemu-system-i386 -nographic -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 2 7 At this moment, it feels xv6 was stuck, this is because QEMU is ready to be connected by the gdb client. You may use the .gdbinit to automatically finish this remote connection by simple typein following command in another terminal. $ gdb -x .gdbinit GNU gdb (Debian 8.2.1-2+b3) 8.2.1 ... The target architecture is assumed to be i8086 [f000:fff0] 0xffff0: ljmp $0x3630,$0xf000e05b 0x0000fff0 in ?? () + symbol-file kernel warning: A handler for the OS ABI &quot;GNU/Linux&quot; is not built into this configuration of GDB. Attempting to continue with the default i8086 settings. (gdb) Now within this gdb client shell, type ‘c’ to continue the xv6, and you will see xv6 start execution in the first terminal. At this moment, you may add breakpoints to your code to see if your code is correctly implemented or not. One more thing, if you open .gdbinit file, you’ll find that it by default connect to a localhost target. If you are working on some other environment that target and client were not placed in the same device, change the localhost to ip address correspondingly. Using ssh may connect to different physical devices under same domain name, this is because load balancer were used. To check ip address, search command ip. target remote localhost:28467 # target remote [ip-addr]:28467</summary></entry><entry><title type="html">Some of my previews experiment works: 2016</title><link href="http://localhost:4000/posts/some-of-my-previews-exper-work" rel="alternate" type="text/html" title="Some of my previews experiment works: 2016" /><published>2016-10-28T12:27:33-04:00</published><updated>2016-10-28T12:27:33-04:00</updated><id>http://localhost:4000/posts/some-of-my-previews-exper-work</id><content type="html" xml:base="http://localhost:4000/posts/some-of-my-previews-exper-work">&lt;p&gt;This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.&lt;/p&gt;
 
 &lt;h1 id=&quot;2016-10&quot;&gt;2016-10&lt;/h1&gt;
 
@@ -469,20 +416,7 @@ unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz
 &lt;span class=&quot;c&quot;&gt;# dump file&lt;/span&gt;
 su
 &lt;span class=&quot;nb&quot;&gt;dd &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/block/mmcblk0p37 &lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/sdcard/boot.img
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-</description>
-        <pubDate>Fri, 28 Oct 2016 12:27:33 -0400</pubDate>
-        <link>https://codersherlock.github.com//archivers/some-of-my-previews-exper-work</link>
-        <guid isPermaLink="true">https://codersherlock.github.com//archivers/some-of-my-previews-exper-work</guid>
-        
-        
-        <category>Research</category>
-        
-      </item>
-    
-      <item>
-        <title>Using charles proxy to monitor mobile SSL traffics</title>
-        <description>&lt;p&gt;In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.&lt;br /&gt;
+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Pengzhan Hao</name><email>haopengzhan@gmail.com</email></author><category term="Research" /><summary type="html">This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics. 2016-10 Time Experiment of rsync Patch is based on rsync with version 3.1.2. [Rsync|Patch] How to collect data Basically, everything of transmission time and computation time will be output with overall time will be printed on the console. But we also need some bash script to collect data through different size of random size and with different modification through them. Start from 8K to 64M, modify at beginning, [Bash script] Start from 8K to 64M, modify at last, [Bash script] Start from 8K to 64M, modify at random place with a (slow) python script, [Bash script|Python program] Time Experiment of seafile Patch is based on seafile 5.1.4. You can find the release from seafile official repo. You may follow official compile instructions from here. [Patch no longer avaiable, new version at following sections] How to collect data We also need everything be done using scripting. But this time I only design added some distance between two increasing files’ sizes. Start from 8K to 16M, 4 times increasing, modify at beginning/ at 1024 different places with python script. [Bash Script|Python program] After using this auto testing script, everything of output will be marked in log files of seafile, which located in ~/.ccnet/log/seafile.log We need to use this simple awk code and vim operation to extract data. # CDC: content defined chucks # HUT: Http upload traffic # ALL: overall time of one commit &amp;amp; upload awk '/CDC|HUT|ALL/ {print $4,$5}' ~/.ccnet/log/seafile.log &amp;gt; results.stat Install Seafile on odroid xu Due to failure of my cross-compile to seafile on android. I used develop board as a replacement experiment platform for ARM-seafile testing. I used a odroid xu as hardware standard. Because all I need is an ARM platform, only an ARM-Ubuntu is enough for me. But develop prototype on a board is much fun than coding, I won’t address much this time. But I’ll start a blog telling some really cool stuff I made for a strange aim. To install a ubuntu with GUI is my all preparation work. I found to way to do this. armhf is a website for arm-based ubuntu. It has a detailed instruction to follow at here. They also provide ubuntu 12.04/ 14.04 and debian 7.5 to choose. But unfortunately odroid xu’s hdmi output doesn’t supported by ubuntu native firmware. So install ubuntu-desktop might can’t be boot up for video output. Burn images is much easy to install a pre-complied ubuntu system. I found this on odroid xu’s forum, which contains xubuntu image [download] for odroid xu. With this image, you just need to use dd command to write whole system mirror into sdcard. # If .img end with xz, use this command to uncompress first unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz # Burn image into SD-card sudo dd if=ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img of=/dev/sdb bs=1M conv=fsync sync 2016-11 Android Kernel How to build an Android Kernel? Generally, I won’t tell anything in this parts, just mark some related links, and point out some mistakes or error solutions. Google Official Guide – If you don’t have AOSP sources, you have to download prebuilt toolchains which recommended in this guide might not be correct. Use following links to choose your fitting tools. — ASOP git root, under sub class “/platform/prebuilts/gcc” Packing and Flashing a Boot.img [highly recommend] 2016-12 Android Kernel How to compile with ftrace? If we want to debug under android, ftrace is a great tool for working. But, ftrace is not available in android if we used default configure file. Android kernel configuration is in arch/arm64/kernel/configs. We need to add few lines under that. CONFIG_STRICT_MEMORY_RWX=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_PERSISTENT_TRACER=y CONFIG_IRQSOFF_TRACER=y CONFIG_PREEMPT_TRACER=y CONFIG_SCHED_TRACER=y CONFIG_STACK_TRACER=y How to extract android images: Dump an image If we want to hold a rooted status after flashing boot, we need to extract an image from android devices. We can first use following command to find which blocks belongs to. According to some references, this article provide three ways to dump an image, I picked one for easy using. adb shell ls -al /dev/block/platform/$SOME\_DEVICE../../by-name # {Partitions} -&amp;gt; {Device Block} # dump file su dd if=/dev/block/mmcblk0p37 of=/sdcard/boot.img</summary></entry><entry><title type="html">Using charles proxy to monitor mobile SSL traffics</title><link href="http://localhost:4000/posts/charles-is-not-a-good-tool" rel="alternate" type="text/html" title="Using charles proxy to monitor mobile SSL traffics" /><published>2016-10-27T22:50:33-04:00</published><updated>2016-10-27T22:50:33-04:00</updated><id>http://localhost:4000/posts/charles-is-not-a-good-tool</id><content type="html" xml:base="http://localhost:4000/posts/charles-is-not-a-good-tool">&lt;p&gt;In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.&lt;br /&gt;
 My current solution is using AP to forward all SSL traffic to a proxy, &lt;a href=&quot;https://www.charlesproxy.com/&quot;&gt;charles proxy&lt;/a&gt; is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.&lt;/p&gt;
 
 &lt;h3 id=&quot;preparations&quot;&gt;Preparations&lt;/h3&gt;
@@ -510,29 +444,4 @@ You also need to save charles Root Certificate, it also contains in the same men
 
 &lt;ul&gt;
   &lt;li&gt;Set Proxy and SSL Proxy&lt;/li&gt;
-&lt;/ul&gt;
-</description>
-        <pubDate>Thu, 27 Oct 2016 22:50:33 -0400</pubDate>
-        <link>https://codersherlock.github.com//archivers/charles-is-not-a-good-tool</link>
-        <guid isPermaLink="true">https://codersherlock.github.com//archivers/charles-is-not-a-good-tool</guid>
-        
-        
-        <category>Network</category>
-        
-      </item>
-    
-      <item>
-        <title>Stop Talking is the worst title of one blog</title>
-        <description>
-</description>
-        <pubDate>Wed, 26 Oct 2016 22:50:33 -0400</pubDate>
-        <link>https://codersherlock.github.com//archivers/hello</link>
-        <guid isPermaLink="true">https://codersherlock.github.com//archivers/hello</guid>
-        
-        
-        <category>Nonsense</category>
-        
-      </item>
-    
-  </channel>
-</rss>
+&lt;/ul&gt;</content><author><name>Pengzhan Hao</name><email>haopengzhan@gmail.com</email></author><category term="Network" /><summary type="html">In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one. My current solution is using AP to forward all SSL traffic to a proxy, charles proxy is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy. Preparations Monitor device situation: Linux Machine with wireless adapter Download the newest version(4.0.1) of charles Target android devices with root privilege Install Charles and Configuration You have to install charles first. After downloading the charles proxy, you have to unzip it and configure some basic settings. # open charles first ./bin/charles Save charles’ private key and public key In Help -&amp;gt; SSL Proxying -&amp;gt; Export Charles Root Certificate and Private Key, enter a password and save the public and private key in *.p12 format. You also need to save charles Root Certificate, it also contains in the same menu. For convience, save it as *.pem format. Set Proxy and SSL Proxy</summary></entry><entry><title type="html">Stop Talking is the worst title of one blog</title><link href="http://localhost:4000/posts/welcome-to-my-blog" rel="alternate" type="text/html" title="Stop Talking is the worst title of one blog" /><published>2016-10-26T22:50:33-04:00</published><updated>2016-10-26T22:50:33-04:00</updated><id>http://localhost:4000/posts/welcome-to-my-blog</id><content type="html" xml:base="http://localhost:4000/posts/welcome-to-my-blog"></content><author><name>Pengzhan Hao</name><email>haopengzhan@gmail.com</email></author><category term="Nonsense" /><summary type="html"></summary></entry></feed>
\ No newline at end of file
diff --git a/_site/index.html b/_site/index.html
index 9ba998d..296241d 100644
--- a/_site/index.html
+++ b/_site/index.html
@@ -1,237 +1,916 @@
-<!DOCTYPE html>
-<html>
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Home - Stop Talking, Start Doing</title>
 
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Stop Talking, Start Doing</title>
-  <meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+<meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
 ">
+<link rel="canonical" href="http://localhost:4000/"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
 
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
 
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
 
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
     });
-  </script>
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
 </head>
-
-
   <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport cell cell--auto">
 
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
 
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="home">
-  <a class="rss-link" href="/feed.xml">RSS Feed</a>
-  <h1 class="page-heading">Articles</h1>
+              <div class="col-aside d-print-none js-col-aside"></div>
 
-  <ul class="post-list">
-    
-      <li>
-        <h2>
-          <a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a>
-        </h2>
-        
-        <div class="post-meta">Oct 13, 2021</div>
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
 
-        <div class="post-excerpt">
-          <p>This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/WebPage"><header style="display:none;"><h1>Home</h1></header><meta itemprop="headline" content="Home"><meta itemprop="author" content="Pengzhan Hao"/><div class="js-article-content"><div class="layout--articles"><div class="article-list items items--divided"><article class="item" itemscope itemtype="http://schema.org/BlogPosting"><div class="item__content">
+          <header><a href="/posts/eddl-how-do-we-train-on-limited-edge-devices"><h2 itemprop="headline" class="item__header">EDDL: How do we train neural networks on limited edge devices - PART 1</h2></a></header>
+          <div class="item__description"><div class="article__content" itemprop="description articleBody">This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
 As the first part of the introductions, I focus only on the motivation and summary of our works.
-More details in design and implementation can be found in late posts.</p>
-
-          <p>
-            <a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">Read More &raquo;</a>
-          </p>
-        </div>
-      </li>
-    
-      <li>
-        <h2>
-          <a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a>
-        </h2>
-        
-        <div class="post-meta">Sep 15, 2020</div>
-
-        <div class="post-excerpt">
-          <p>Let’s generate a word cloud like this. 
+More details in design and implementation can be found in l...</div><p><a href="/posts/eddl-how-do-we-train-on-limited-edge-devices">Read more</a></p></div><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=Research">Research</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 13, 2021</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2021-10-13T16:53:20-04:00">
+    <meta itemprop="keywords" content="Research"></div>
+      </article><article class="item" itemscope itemtype="http://schema.org/BlogPosting"><div class="item__content">
+          <header><a href="/posts/generate-word-cloud-with-chinese-fenci"><h2 itemprop="headline" class="item__header">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</h2></a></header>
+          <div class="item__description"><div class="article__content" itemprop="description articleBody">Let’s generate a word cloud like this. 
 Don’t understand the language is not a big deal.
-If your written language is based on latin alphabet(or other language has space between words), skip tokenization.</p>
+If your written language is based on latin alphabet(or other language has space between words), skip tokenization.
 
-<p><img src="/static/2020-09/2020-06-28.png" height="250" /></p>
 
-          <p>
-            <a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Read More &raquo;</a>
-          </p>
-        </div>
-      </li>
-    
-      <li>
-        <h2>
-          <a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a>
-        </h2>
-        
-        <div class="post-meta">Jul 28, 2017</div>
 
-        <div class="post-excerpt">
-          <p>In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
+Background
+
+Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used TinyTinyRSS, or as ttrss, a popula...</div><p><a href="/posts/generate-word-cloud-with-chinese-fenci">Read more</a></p></div><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=visualization">visualization</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Sep 15, 2020</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2020-09-15T22:00:14-04:00">
+    <meta itemprop="keywords" content="visualization"></div>
+      </article><article class="item" itemscope itemtype="http://schema.org/BlogPosting"><div class="item__content">
+          <header><a href="/posts/intro-xv6"><h2 itemprop="headline" class="item__header">Xv6 introduction</h2></a></header>
+          <div class="item__description"><div class="article__content" itemprop="description articleBody">In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
 Understand system call and know how to implement a simple one will be coved as the first half.
-In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.</p>
+In the second half of this post, I will discuss a little bit more on how to debug ...</div><p><a href="/posts/intro-xv6">Read more</a></p></div><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=xv6">xv6</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Jul 28, 2017</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2017-07-28T14:56:55-04:00">
+    <meta itemprop="keywords" content="xv6"></div>
+      </article><article class="item" itemscope itemtype="http://schema.org/BlogPosting"><div class="item__content">
+          <header><a href="/posts/some-of-my-previews-exper-work"><h2 itemprop="headline" class="item__header">Some of my previews experiment works: 2016</h2></a></header>
+          <div class="item__description"><div class="article__content" itemprop="description articleBody">This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.
 
-          <p>
-            <a class="post-link" href="/archivers/intro-xv6">Read More &raquo;</a>
-          </p>
-        </div>
-      </li>
-    
-      <li>
-        <h2>
-          <a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a>
-        </h2>
-        
-        <div class="post-meta">Oct 28, 2016</div>
+2016-10
 
-        <div class="post-excerpt">
-          <p>This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.</p>
+Time Experiment of rsync
 
-          <p>
-            <a class="post-link" href="/archivers/some-of-my-previews-exper-work">Read More &raquo;</a>
-          </p>
-        </div>
-      </li>
-    
-      <li>
-        <h2>
-          <a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a>
-        </h2>
-        
-        <div class="post-meta">Oct 27, 2016</div>
+Patch is based on rsync with version 3.1.2. [Rsync|Patch]
 
-        <div class="post-excerpt">
-          <p>In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.<br />
-My current solution is using AP to forward all SSL traffic to a proxy, <a href="https://www.charlesproxy.com/">charles proxy</a> is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.</p>
+How to collect data
 
-          <p>
-            <a class="post-link" href="/archivers/charles-is-not-a-good-tool">Read More &raquo;</a>
-          </p>
-        </div>
-      </li>
-    
-  </ul>
-  
-  <!-- Pagination links -->
-<div class="pagination">
-  
-    <span class="previous">PREV</span>
-  
-  <span class="page_number ">1 of 2</span>
-  
-    <a href="/page2" class="next">NEXT</a>
-  
+Basically, everything of transmission time and computation time will be output with overall time wil...</div><p><a href="/posts/some-of-my-previews-exper-work">Read more</a></p></div><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=Research">Research</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 28, 2016</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2016-10-28T12:27:33-04:00">
+    <meta itemprop="keywords" content="Research"></div>
+      </article><article class="item" itemscope itemtype="http://schema.org/BlogPosting"><div class="item__content">
+          <header><a href="/posts/charles-is-not-a-good-tool"><h2 itemprop="headline" class="item__header">Using charles proxy to monitor mobile SSL traffics</h2></a></header>
+          <div class="item__description"><div class="article__content" itemprop="description articleBody">In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still did...</div><p><a href="/posts/charles-is-not-a-good-tool">Read more</a></p></div><div class="article__info clearfix"><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 27, 2016</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2016-10-27T22:50:33-04:00"></div>
+      </article><article class="item" itemscope itemtype="http://schema.org/BlogPosting"><div class="item__content">
+          <header><a href="/posts/welcome-to-my-blog"><h2 itemprop="headline" class="item__header">Stop Talking is the worst title of one blog</h2></a></header>
+          <div class="item__description"><div class="article__content" itemprop="description articleBody"></div><p><a href="/posts/welcome-to-my-blog">Read more</a></p></div><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=Nonsense">Nonsense</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 26, 2016</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2016-10-26T22:50:33-04:00">
+    <meta itemprop="keywords" content="Nonsense"></div>
+      </article></div>
+</div><div class="layout--home"></div>
+<script>/*(function () {
+
+})();*/
+</script>
+
+
+
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
 </div>
-
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
 </div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
+        </a>
+      </li></ul>
 </div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
 </div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
       </div>
     </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
+  </div>
 </footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
 
-<script src="/js/easybook.js"></script>
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
 
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
   </body>
-
 </html>
+
diff --git a/_site/js/easybook.js b/_site/js/easybook.js
deleted file mode 100644
index 5007703..0000000
--- a/_site/js/easybook.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/*!
- * EasyBook Jekyll Theme Javascript
- * 
- * http://laobubu.github.io/jekyll-theme-EasyBook
- * https://github.com/laobubu/jekyll-theme-EasyBook
- *
- * This is just a extension for my theme.
- */
-
-function TOCize(toc, content, matchHeightTo) {
-    if (!(toc && content && matchHeightTo)) return false
-    
-    var cnt = 0;
-    
-    var make = function(tag) {
-        return document.createElement(tag)
-    }
-    
-    var aniscroll = {
-        to: function(top) {
-            aniscroll.target = top;
-            if (aniscroll.running) return;
-            aniscroll.running = setInterval(aniscroll.tick, 20);
-        },
-        target: 0,
-        running: 0,
-        getTop: function() {
-            return window.scrollY || window.pageYOffset || document.documentElement.scrollTop;
-        },
-        setTop: function(value) {
-            (window['scrollTo'] && window.scrollTo(window.scrollX, value))
-        },
-        tick: function() {
-            var oldST = aniscroll.getTop(), newST = ~~((oldST + aniscroll.target) / 2);
-            aniscroll.setTop(newST);
-            if (aniscroll.getTop() < newST || Math.abs(newST - aniscroll.target) < 10) {
-                aniscroll.setTop(aniscroll.target);
-                clearInterval(aniscroll.running)
-                aniscroll.running = 0
-            }
-        }
-    }
-    
-    function scrollToHeader(header, hash, ev) {
-        var y = header.getBoundingClientRect().top + aniscroll.getTop();
-        if (window.history['pushState']) {
-            window.history.pushState({}, header.textContent, "#" + hash);
-            aniscroll.to(y);
-            ev.preventDefault();
-        } else {
-            var y2 = aniscroll.getTop();
-            setTimeout(function() {
-                aniscroll.setTop(y2);
-                aniscroll.to(y);
-            }, 0);
-        }
-    }
-    
-    var generateLink = function(h) {
-        var q = make('a');
-        cnt++;
-        var hash = h.getAttribute('id');
-        if (!hash) {
-            hash = ('generated-hash-' + cnt);
-            h.setAttribute('id', hash);
-        }
-        q.textContent = h.textContent;
-        q.setAttribute('href', '#' + hash );
-        q.addEventListener('click', scrollToHeader.bind(this, h, hash), false);
-        return q;
-    };
-    
-    var hs = content.querySelectorAll('h1, h2, h3, h4, h5, h6');
-    var cul = null, plevel = 1;
-    var uls = [make('ul')];
-    for (var i=0;i<hs.length;i++) {
-        var level = +hs[i].tagName.substr(1);
-        var hi = hs[i];
-        var ti = make('li');
-        ti.appendChild(generateLink(hi));
-        if (plevel < level) {
-            do {
-                uls.push(make('ul'));
-                uls[uls.length-2].appendChild(uls[uls.length-1]);
-            } while (++plevel < level);
-        } else if (plevel > level) {
-            do {
-                cul = uls.pop();
-            } while (--plevel > level);
-        }
-        cul = uls[uls.length-1];
-        cul.appendChild(ti);
-    }
-    while(true) {
-        var chs = uls[0].children;
-        if (chs.length == 1 && chs[0].tagName == 'UL')
-            uls.shift();
-        else
-            break;
-    }
-    
-    if (!cnt) return false;
-    
-    var scrolldummy=make('div');
-    toc.appendChild(scrolldummy);
-    toc.appendChild(uls[0]);
-    toc.style.display = 'block';
-    
-    var maxHeightTOC = '';
-    var ppc = document.querySelector('.col-main');
-    var s1 = function(){
-        var scrollTop=aniscroll.getTop(), dummyClientTop=scrolldummy.getBoundingClientRect().top,
-            margin = 10,c,d; // c = dummyHeight, d = TOC.maxHeight (+'px')
-        if ((c = -dummyClientTop + margin) < 0) c = 0;
-        if (c) {
-            var wh = window.innerHeight
-                || document.documentElement.clientHeight
-                || document.body.clientHeight,
-            cbox = matchHeightTo.getBoundingClientRect(),
-            vq = cbox.bottom - dummyClientTop - uls[0].offsetHeight;
-            if (c>vq) c=vq;
-            d = (wh - (margin<<1)) + 'px';
-        } else {
-            d = "";
-        }
-        if (d != maxHeightTOC) { //status lock.
-            maxHeightTOC = d;
-            if (d) {
-                uls[0].setAttribute('style', 'max-height:' + d + '; width:' + (toc.offsetWidth-20) + "px" );
-            } else {
-                uls[0].setAttribute("style","");
-            }
-        }
-        scrolldummy.style.height = (c+'px');
-    };
-    window.addEventListener('scroll', s1, false);
-    window.addEventListener('resize', s1, false);
-}
-
-function SelectAllize(selector,tips) {
-    if (!window.getSelection) return null;
-    
-    var obj = document.querySelectorAll(selector);
-    var selection=window.getSelection();
-    var z = document.createElement("div");
-    z.className = "util-notify1";
-    z.textContent = tips;
-    document.body.appendChild(z)
-    
-    function hide() {
-        z.classList.add('hidden')
-        z.style.top = '-200px'
-    }
-    
-    hide();
-    z.addEventListener('mouseover', hide, false);
-    
-    function clickHandler(e){
-        if (!selection.isCollapsed) return;
-        
-        var tt = e.pageY-z.offsetHeight - 15;
-        z.setAttribute('style', 'left:' + (e.pageX-z.offsetWidth/2) + 'px;top:' + (tt+10) + 'px');
-        z.classList.remove('hidden');
-        setTimeout(hide, 1000);
-    }
-    
-    function dblClickHandler(e){
-        selection.selectAllChildren(this);
-        hide();
-    }
-    
-    for(var i = obj.length; i--;) {
-        var oi = obj[i];
-        oi.addEventListener('click', clickHandler, false);
-        oi.addEventListener('dblclick', dblClickHandler, false);
-    }
-    
-    return true;
-}
-
-function RealLoad(){
-    TOCize(
-        document.querySelector('.post-toc'), 
-        document.querySelector('.post-content'), 
-        document.querySelector('.col-main')
-    );
-    
-    SelectAllize("pre.highlight", "Dblclick to select all");
-    
-    var imgs = document.querySelectorAll('.post-content > p > img');
-    for(var i=imgs.length; i--;){
-        if (imgs[i].parentElement.childNodes.length === 1) {
-            imgs[i].classList.add('middle-image');
-        }
-    }
-}
-
-RealLoad();
diff --git a/_site/js/html5shiv.js b/_site/js/html5shiv.js
deleted file mode 100644
index 77dace4..0000000
--- a/_site/js/html5shiv.js
+++ /dev/null
@@ -1,322 +0,0 @@
-/**
-* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
-*/
-;(function(window, document) {
-/*jshint evil:true */
-  /** version */
-  var version = '3.7.2';
-
-  /** Preset options */
-  var options = window.html5 || {};
-
-  /** Used to skip problem elements */
-  var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
-
-  /** Not all elements can be cloned in IE **/
-  var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
-
-  /** Detect whether the browser supports default html5 styles */
-  var supportsHtml5Styles;
-
-  /** Name of the expando, to work with multiple documents or to re-shiv one document */
-  var expando = '_html5shiv';
-
-  /** The id for the the documents expando */
-  var expanID = 0;
-
-  /** Cached data for each document */
-  var expandoData = {};
-
-  /** Detect whether the browser supports unknown elements */
-  var supportsUnknownElements;
-
-  (function() {
-    try {
-        var a = document.createElement('a');
-        a.innerHTML = '<xyz></xyz>';
-        //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
-        supportsHtml5Styles = ('hidden' in a);
-
-        supportsUnknownElements = a.childNodes.length == 1 || (function() {
-          // assign a false positive if unable to shiv
-          (document.createElement)('a');
-          var frag = document.createDocumentFragment();
-          return (
-            typeof frag.cloneNode == 'undefined' ||
-            typeof frag.createDocumentFragment == 'undefined' ||
-            typeof frag.createElement == 'undefined'
-          );
-        }());
-    } catch(e) {
-      // assign a false positive if detection fails => unable to shiv
-      supportsHtml5Styles = true;
-      supportsUnknownElements = true;
-    }
-
-  }());
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Creates a style sheet with the given CSS text and adds it to the document.
-   * @private
-   * @param {Document} ownerDocument The document.
-   * @param {String} cssText The CSS text.
-   * @returns {StyleSheet} The style element.
-   */
-  function addStyleSheet(ownerDocument, cssText) {
-    var p = ownerDocument.createElement('p'),
-        parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
-
-    p.innerHTML = 'x<style>' + cssText + '</style>';
-    return parent.insertBefore(p.lastChild, parent.firstChild);
-  }
-
-  /**
-   * Returns the value of `html5.elements` as an array.
-   * @private
-   * @returns {Array} An array of shived element node names.
-   */
-  function getElements() {
-    var elements = html5.elements;
-    return typeof elements == 'string' ? elements.split(' ') : elements;
-  }
-
-  /**
-   * Extends the built-in list of html5 elements
-   * @memberOf html5
-   * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
-   * @param {Document} ownerDocument The context document.
-   */
-  function addElements(newElements, ownerDocument) {
-    var elements = html5.elements;
-    if(typeof elements != 'string'){
-      elements = elements.join(' ');
-    }
-    if(typeof newElements != 'string'){
-      newElements = newElements.join(' ');
-    }
-    html5.elements = elements +' '+ newElements;
-    shivDocument(ownerDocument);
-  }
-
-   /**
-   * Returns the data associated to the given document
-   * @private
-   * @param {Document} ownerDocument The document.
-   * @returns {Object} An object of data.
-   */
-  function getExpandoData(ownerDocument) {
-    var data = expandoData[ownerDocument[expando]];
-    if (!data) {
-        data = {};
-        expanID++;
-        ownerDocument[expando] = expanID;
-        expandoData[expanID] = data;
-    }
-    return data;
-  }
-
-  /**
-   * returns a shived element for the given nodeName and document
-   * @memberOf html5
-   * @param {String} nodeName name of the element
-   * @param {Document} ownerDocument The context document.
-   * @returns {Object} The shived element.
-   */
-  function createElement(nodeName, ownerDocument, data){
-    if (!ownerDocument) {
-        ownerDocument = document;
-    }
-    if(supportsUnknownElements){
-        return ownerDocument.createElement(nodeName);
-    }
-    if (!data) {
-        data = getExpandoData(ownerDocument);
-    }
-    var node;
-
-    if (data.cache[nodeName]) {
-        node = data.cache[nodeName].cloneNode();
-    } else if (saveClones.test(nodeName)) {
-        node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
-    } else {
-        node = data.createElem(nodeName);
-    }
-
-    // Avoid adding some elements to fragments in IE < 9 because
-    // * Attributes like `name` or `type` cannot be set/changed once an element
-    //   is inserted into a document/fragment
-    // * Link elements with `src` attributes that are inaccessible, as with
-    //   a 403 response, will cause the tab/window to crash
-    // * Script elements appended to fragments will execute when their `src`
-    //   or `text` property is set
-    return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
-  }
-
-  /**
-   * returns a shived DocumentFragment for the given document
-   * @memberOf html5
-   * @param {Document} ownerDocument The context document.
-   * @returns {Object} The shived DocumentFragment.
-   */
-  function createDocumentFragment(ownerDocument, data){
-    if (!ownerDocument) {
-        ownerDocument = document;
-    }
-    if(supportsUnknownElements){
-        return ownerDocument.createDocumentFragment();
-    }
-    data = data || getExpandoData(ownerDocument);
-    var clone = data.frag.cloneNode(),
-        i = 0,
-        elems = getElements(),
-        l = elems.length;
-    for(;i<l;i++){
-        clone.createElement(elems[i]);
-    }
-    return clone;
-  }
-
-  /**
-   * Shivs the `createElement` and `createDocumentFragment` methods of the document.
-   * @private
-   * @param {Document|DocumentFragment} ownerDocument The document.
-   * @param {Object} data of the document.
-   */
-  function shivMethods(ownerDocument, data) {
-    if (!data.cache) {
-        data.cache = {};
-        data.createElem = ownerDocument.createElement;
-        data.createFrag = ownerDocument.createDocumentFragment;
-        data.frag = data.createFrag();
-    }
-
-
-    ownerDocument.createElement = function(nodeName) {
-      //abort shiv
-      if (!html5.shivMethods) {
-          return data.createElem(nodeName);
-      }
-      return createElement(nodeName, ownerDocument, data);
-    };
-
-    ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
-      'var n=f.cloneNode(),c=n.createElement;' +
-      'h.shivMethods&&(' +
-        // unroll the `createElement` calls
-        getElements().join().replace(/[\w\-:]+/g, function(nodeName) {
-          data.createElem(nodeName);
-          data.frag.createElement(nodeName);
-          return 'c("' + nodeName + '")';
-        }) +
-      ');return n}'
-    )(html5, data.frag);
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Shivs the given document.
-   * @memberOf html5
-   * @param {Document} ownerDocument The document to shiv.
-   * @returns {Document} The shived document.
-   */
-  function shivDocument(ownerDocument) {
-    if (!ownerDocument) {
-        ownerDocument = document;
-    }
-    var data = getExpandoData(ownerDocument);
-
-    if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
-      data.hasCSS = !!addStyleSheet(ownerDocument,
-        // corrects block display not defined in IE6/7/8/9
-        'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
-        // adds styling not present in IE6/7/8/9
-        'mark{background:#FF0;color:#000}' +
-        // hides non-rendered elements
-        'template{display:none}'
-      );
-    }
-    if (!supportsUnknownElements) {
-      shivMethods(ownerDocument, data);
-    }
-    return ownerDocument;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * The `html5` object is exposed so that more elements can be shived and
-   * existing shiving can be detected on iframes.
-   * @type Object
-   * @example
-   *
-   * // options can be changed before the script is included
-   * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
-   */
-  var html5 = {
-
-    /**
-     * An array or space separated string of node names of the elements to shiv.
-     * @memberOf html5
-     * @type Array|String
-     */
-    'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',
-
-    /**
-     * current version of html5shiv
-     */
-    'version': version,
-
-    /**
-     * A flag to indicate that the HTML5 style sheet should be inserted.
-     * @memberOf html5
-     * @type Boolean
-     */
-    'shivCSS': (options.shivCSS !== false),
-
-    /**
-     * Is equal to true if a browser supports creating unknown/HTML5 elements
-     * @memberOf html5
-     * @type boolean
-     */
-    'supportsUnknownElements': supportsUnknownElements,
-
-    /**
-     * A flag to indicate that the document's `createElement` and `createDocumentFragment`
-     * methods should be overwritten.
-     * @memberOf html5
-     * @type Boolean
-     */
-    'shivMethods': (options.shivMethods !== false),
-
-    /**
-     * A string to describe the type of `html5` object ("default" or "default print").
-     * @memberOf html5
-     * @type String
-     */
-    'type': 'default',
-
-    // shivs the document according to the specified `html5` object options
-    'shivDocument': shivDocument,
-
-    //creates a shived element
-    createElement: createElement,
-
-    //creates a shived documentFragment
-    createDocumentFragment: createDocumentFragment,
-
-    //extends list of elements
-    addElements: addElements
-  };
-
-  /*--------------------------------------------------------------------------*/
-
-  // expose html5
-  window.html5 = html5;
-
-  // shiv the document
-  shivDocument(document);
-
-}(this, document));
diff --git a/_site/js/respond.js b/_site/js/respond.js
deleted file mode 100644
index 58883e4..0000000
--- a/_site/js/respond.js
+++ /dev/null
@@ -1,353 +0,0 @@
-/* Respond.js: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs  */
-(function( w ){
-
-	"use strict";
-
-	//exposed namespace
-	var respond = {};
-	w.respond = respond;
-
-	//define update even in native-mq-supporting browsers, to avoid errors
-	respond.update = function(){};
-
-	//define ajax obj
-	var requestQueue = [],
-		xmlHttp = (function() {
-			var xmlhttpmethod = false;
-			try {
-				xmlhttpmethod = new w.XMLHttpRequest();
-			}
-			catch( e ){
-				xmlhttpmethod = new w.ActiveXObject( "Microsoft.XMLHTTP" );
-			}
-			return function(){
-				return xmlhttpmethod;
-			};
-		})(),
-
-		//tweaked Ajax functions from Quirksmode
-		ajax = function( url, callback ) {
-			var req = xmlHttp();
-			if (!req){
-				return;
-			}
-			req.open( "GET", url, true );
-			req.onreadystatechange = function () {
-				if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){
-					return;
-				}
-				callback( req.responseText );
-			};
-			if ( req.readyState === 4 ){
-				return;
-			}
-			req.send( null );
-		},
-		isUnsupportedMediaQuery = function( query ) {
-			return query.replace( respond.regex.minmaxwh, '' ).match( respond.regex.other );
-		};
-
-	//expose for testing
-	respond.ajax = ajax;
-	respond.queue = requestQueue;
-	respond.unsupportedmq = isUnsupportedMediaQuery;
-	respond.regex = {
-		media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
-		keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
-		comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,
-		urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
-		findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
-		only: /(only\s+)?([a-zA-Z]+)\s?/,
-		minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
-		maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
-		minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,
-		other: /\([^\)]*\)/g
-	};
-
-	//expose media query support flag for external use
-	respond.mediaQueriesSupported = w.matchMedia && w.matchMedia( "only all" ) !== null && w.matchMedia( "only all" ).matches;
-
-	//if media queries are supported, exit here
-	if( respond.mediaQueriesSupported ){
-		return;
-	}
-
-	//define vars
-	var doc = w.document,
-		docElem = doc.documentElement,
-		mediastyles = [],
-		rules = [],
-		appendedEls = [],
-		parsedSheets = {},
-		resizeThrottle = 30,
-		head = doc.getElementsByTagName( "head" )[0] || docElem,
-		base = doc.getElementsByTagName( "base" )[0],
-		links = head.getElementsByTagName( "link" ),
-
-		lastCall,
-		resizeDefer,
-
-		//cached container for 1em value, populated the first time it's needed
-		eminpx,
-
-		// returns the value of 1em in pixels
-		getEmValue = function() {
-			var ret,
-				div = doc.createElement('div'),
-				body = doc.body,
-				originalHTMLFontSize = docElem.style.fontSize,
-				originalBodyFontSize = body && body.style.fontSize,
-				fakeUsed = false;
-
-			div.style.cssText = "position:absolute;font-size:1em;width:1em";
-
-			if( !body ){
-				body = fakeUsed = doc.createElement( "body" );
-				body.style.background = "none";
-			}
-
-			// 1em in a media query is the value of the default font size of the browser
-			// reset docElem and body to ensure the correct value is returned
-			docElem.style.fontSize = "100%";
-			body.style.fontSize = "100%";
-
-			body.appendChild( div );
-
-			if( fakeUsed ){
-				docElem.insertBefore( body, docElem.firstChild );
-			}
-
-			ret = div.offsetWidth;
-
-			if( fakeUsed ){
-				docElem.removeChild( body );
-			}
-			else {
-				body.removeChild( div );
-			}
-
-			// restore the original values
-			docElem.style.fontSize = originalHTMLFontSize;
-			if( originalBodyFontSize ) {
-				body.style.fontSize = originalBodyFontSize;
-			}
-
-
-			//also update eminpx before returning
-			ret = eminpx = parseFloat(ret);
-
-			return ret;
-		},
-
-		//enable/disable styles
-		applyMedia = function( fromResize ){
-			var name = "clientWidth",
-				docElemProp = docElem[ name ],
-				currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
-				styleBlocks	= {},
-				lastLink = links[ links.length-1 ],
-				now = (new Date()).getTime();
-
-			//throttle resize calls
-			if( fromResize && lastCall && now - lastCall < resizeThrottle ){
-				w.clearTimeout( resizeDefer );
-				resizeDefer = w.setTimeout( applyMedia, resizeThrottle );
-				return;
-			}
-			else {
-				lastCall = now;
-			}
-
-			for( var i in mediastyles ){
-				if( mediastyles.hasOwnProperty( i ) ){
-					var thisstyle = mediastyles[ i ],
-						min = thisstyle.minw,
-						max = thisstyle.maxw,
-						minnull = min === null,
-						maxnull = max === null,
-						em = "em";
-
-					if( !!min ){
-						min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
-					}
-					if( !!max ){
-						max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
-					}
-
-					// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
-					if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
-						if( !styleBlocks[ thisstyle.media ] ){
-							styleBlocks[ thisstyle.media ] = [];
-						}
-						styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
-					}
-				}
-			}
-
-			//remove any existing respond style element(s)
-			for( var j in appendedEls ){
-				if( appendedEls.hasOwnProperty( j ) ){
-					if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){
-						head.removeChild( appendedEls[ j ] );
-					}
-				}
-			}
-			appendedEls.length = 0;
-
-			//inject active styles, grouped by media type
-			for( var k in styleBlocks ){
-				if( styleBlocks.hasOwnProperty( k ) ){
-					var ss = doc.createElement( "style" ),
-						css = styleBlocks[ k ].join( "\n" );
-
-					ss.type = "text/css";
-					ss.media = k;
-
-					//originally, ss was appended to a documentFragment and sheets were appended in bulk.
-					//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
-					head.insertBefore( ss, lastLink.nextSibling );
-
-					if ( ss.styleSheet ){
-						ss.styleSheet.cssText = css;
-					}
-					else {
-						ss.appendChild( doc.createTextNode( css ) );
-					}
-
-					//push to appendedEls to track for later removal
-					appendedEls.push( ss );
-				}
-			}
-		},
-		//find media blocks in css text, convert to style blocks
-		translate = function( styles, href, media ){
-			var qs = styles.replace( respond.regex.comments, '' )
-					.replace( respond.regex.keyframes, '' )
-					.match( respond.regex.media ),
-				ql = qs && qs.length || 0;
-
-			//try to get CSS path
-			href = href.substring( 0, href.lastIndexOf( "/" ) );
-
-			var repUrls = function( css ){
-					return css.replace( respond.regex.urls, "$1" + href + "$2$3" );
-				},
-				useMedia = !ql && media;
-
-			//if path exists, tack on trailing slash
-			if( href.length ){ href += "/"; }
-
-			//if no internal queries exist, but media attr does, use that
-			//note: this currently lacks support for situations where a media attr is specified on a link AND
-				//its associated stylesheet has internal CSS media queries.
-				//In those cases, the media attribute will currently be ignored.
-			if( useMedia ){
-				ql = 1;
-			}
-
-			for( var i = 0; i < ql; i++ ){
-				var fullq, thisq, eachq, eql;
-
-				//media attr
-				if( useMedia ){
-					fullq = media;
-					rules.push( repUrls( styles ) );
-				}
-				//parse for styles
-				else{
-					fullq = qs[ i ].match( respond.regex.findStyles ) && RegExp.$1;
-					rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
-				}
-
-				eachq = fullq.split( "," );
-				eql = eachq.length;
-
-				for( var j = 0; j < eql; j++ ){
-					thisq = eachq[ j ];
-
-					if( isUnsupportedMediaQuery( thisq ) ) {
-						continue;
-					}
-
-					mediastyles.push( {
-						media : thisq.split( "(" )[ 0 ].match( respond.regex.only ) && RegExp.$2 || "all",
-						rules : rules.length - 1,
-						hasquery : thisq.indexOf("(") > -1,
-						minw : thisq.match( respond.regex.minw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ),
-						maxw : thisq.match( respond.regex.maxw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
-					} );
-				}
-			}
-
-			applyMedia();
-		},
-
-		//recurse through request queue, get css text
-		makeRequests = function(){
-			if( requestQueue.length ){
-				var thisRequest = requestQueue.shift();
-
-				ajax( thisRequest.href, function( styles ){
-					translate( styles, thisRequest.href, thisRequest.media );
-					parsedSheets[ thisRequest.href ] = true;
-
-					// by wrapping recursive function call in setTimeout
-					// we prevent "Stack overflow" error in IE7
-					w.setTimeout(function(){ makeRequests(); },0);
-				} );
-			}
-		},
-
-		//loop stylesheets, send text content to translate
-		ripCSS = function(){
-
-			for( var i = 0; i < links.length; i++ ){
-				var sheet = links[ i ],
-				href = sheet.href,
-				media = sheet.media,
-				isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
-
-				//only links plz and prevent re-parsing
-				if( !!href && isCSS && !parsedSheets[ href ] ){
-					// selectivizr exposes css through the rawCssText expando
-					if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
-						translate( sheet.styleSheet.rawCssText, href, media );
-						parsedSheets[ href ] = true;
-					} else {
-						if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) ||
-							href.replace( RegExp.$1, "" ).split( "/" )[0] === w.location.host ){
-							// IE7 doesn't handle urls that start with '//' for ajax request
-							// manually add in the protocol
-							if ( href.substring(0,2) === "//" ) { href = w.location.protocol + href; }
-							requestQueue.push( {
-								href: href,
-								media: media
-							} );
-						}
-					}
-				}
-			}
-			makeRequests();
-		};
-
-	//translate CSS
-	ripCSS();
-
-	//expose update for re-running respond later on
-	respond.update = ripCSS;
-
-	//expose getEmValue
-	respond.getEmValue = getEmValue;
-
-	//adjust on resize
-	function callMedia(){
-		applyMedia( true );
-	}
-
-	if( w.addEventListener ){
-		w.addEventListener( "resize", callMedia, false );
-	}
-	else if( w.attachEvent ){
-		w.attachEvent( "onresize", callMedia );
-	}
-})(this);
diff --git a/_site/page2/index.html b/_site/page2/index.html
deleted file mode 100644
index 418c536..0000000
--- a/_site/page2/index.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Stop Talking, Start Doing</title>
-  <meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
-">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//page2/">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="home">
-  <a class="rss-link" href="/feed.xml">RSS Feed</a>
-  <h1 class="page-heading">Articles</h1>
-
-  <ul class="post-list">
-    
-      <li>
-        <h2>
-          <a class="post-link" href="/archivers/hello">Stop Talking is the worst title of one blog</a>
-        </h2>
-        
-        <div class="post-meta">Oct 26, 2016</div>
-
-        <div class="post-excerpt">
-          
-
-          <p>
-            <a class="post-link" href="/archivers/hello">Read More &raquo;</a>
-          </p>
-        </div>
-      </li>
-    
-  </ul>
-  
-  <!-- Pagination links -->
-<div class="pagination">
-  
-    <a href="/" class="previous">PREV</a>
-  
-  <span class="page_number ">2 of 2</span>
-  
-    <span class="next ">NEXT</span>
-  
-</div>
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/_site/posts/charles-is-not-a-good-tool.html b/_site/posts/charles-is-not-a-good-tool.html
new file mode 100644
index 0000000..e9d5176
--- /dev/null
+++ b/_site/posts/charles-is-not-a-good-tool.html
@@ -0,0 +1,974 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Using charles proxy to monitor mobile SSL traffics - Stop Talking, Start Doing</title>
+
+<meta name="description" content="In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL t...">
+<link rel="canonical" href="http://localhost:4000/posts/charles-is-not-a-good-tool"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport has-aside cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"><aside class="page__aside js-page-aside"><div class="toc-aside js-toc-root"></div>
+</aside></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1>Using charles proxy to monitor mobile SSL traffics</h1></header><span class="split-space">&nbsp;</span>
+          <a class="edit-on-github"
+            title="Edit on Github"
+            href="https://github.com/CoderSherlock/CoderSherlock.github.io/tree/master/_posts/2016-10-27-charles-is-not-a-good-tool.md">
+            <i class="far fa-edit"></i></a></div><meta itemprop="headline" content="Using charles proxy to monitor mobile SSL traffics"><div class="article__info clearfix"><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 27, 2016</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2016-10-27T22:50:33-04:00"><div class="js-article-content"><div class="layout--article"><!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
+<div class="article__content" itemprop="articleBody"><p>In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.<br />
+My current solution is using AP to forward all SSL traffic to a proxy, <a href="https://www.charlesproxy.com/">charles proxy</a> is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.</p>
+
+<h3 id="preparations">Preparations</h3>
+<ul>
+  <li>Monitor device situation: Linux Machine with wireless adapter</li>
+  <li>Download the newest version(4.0.1) of charles</li>
+  <li>Target android devices with root privilege</li>
+</ul>
+
+<h3 id="install-charles-and-configuration">Install Charles and Configuration</h3>
+
+<ul>
+  <li>You have to install charles first. After downloading the charles proxy, you have to unzip it and configure some basic settings.</li>
+</ul>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># open charles first</span>
+./bin/charles  
+</code></pre></div></div>
+<ul>
+  <li>Save charles’ private key and public key</li>
+</ul>
+
+<p>In Help -&gt; SSL Proxying -&gt; Export Charles Root Certificate and Private Key, enter a password and save the public and private key in *.p12 format.<br />
+You also need to save charles Root Certificate, it also contains in the same menu. For convience, save it as *.pem format.</p>
+
+<ul>
+  <li>Set Proxy and SSL Proxy</li>
+</ul>
+</div><section class="article__sharing d-print-none"></section><div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2016-10-27T22:50:33-04:00"><!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
+<div class="article__subscribe"><div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="/feed.xml">Subscribe</a></div>
+</div><div class="article__license"></div></footer>
+<div class="article__section-navigator clearfix"><div class="previous"><span>PREVIOUS</span><a href="/posts/welcome-to-my-blog">Stop Talking is the worst title of one blog</a></div><div class="next"><span>NEXT</span><a href="/posts/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></div></div></div>
+
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
+</script>
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script><script>
+  /* toc must before affix, since affix need to konw toc' height. */(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window);
+    var $articleContent = $('.js-article-content');
+    var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
+    var toc;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+    var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
+
+    function disabled() {
+      return $col2.css('display') === 'none' || !hasToc;
+    }
+
+    tocDisabled = disabled();
+
+    toc = $tocRoot.toc({
+      selectors: TOC_SELECTOR,
+      container: $articleContent,
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      tocDisabled = disabled();
+      toc && toc.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window), $pageFooter = $('.js-page-footer');
+    var $pageAside = $('.js-page-aside');
+    var affix;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+
+    affix = $pageAside.affix({
+      offsetBottom: $pageFooter.outerHeight(),
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      scroll: hasSidebar ? $('.js-page-main').children() : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      affix && affix.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+    window.pageAsideAffix = affix;
+  });
+})();
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/posts/eddl-how-do-we-train-on-limited-edge-devices.html b/_site/posts/eddl-how-do-we-train-on-limited-edge-devices.html
new file mode 100644
index 0000000..8244f26
--- /dev/null
+++ b/_site/posts/eddl-how-do-we-train-on-limited-edge-devices.html
@@ -0,0 +1,1026 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>EDDL: How do we train neural networks on limited edge devices - PART 1 - Stop Talking, Start Doing</title>
+
+<meta name="description" content="This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Compu...">
+<link rel="canonical" href="http://localhost:4000/posts/eddl-how-do-we-train-on-limited-edge-devices"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport has-aside cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"><aside class="page__aside js-page-aside"><div class="toc-aside js-toc-root"></div>
+</aside></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1>EDDL: How do we train neural networks on limited edge devices - PART 1</h1></header><span class="split-space">&nbsp;</span>
+          <a class="edit-on-github"
+            title="Edit on Github"
+            href="https://github.com/CoderSherlock/CoderSherlock.github.io/tree/master/_posts/2021-10-13-eddl-how-do-we-train-on-limited-edge-devices.md">
+            <i class="far fa-edit"></i></a></div><meta itemprop="headline" content="EDDL: How do we train neural networks on limited edge devices - PART 1"><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=Research">Research</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 13, 2021</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2021-10-13T16:53:20-04:00">
+    <meta itemprop="keywords" content="Research"><div class="js-article-content"><div class="layout--article"><!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
+<div class="article__content" itemprop="articleBody"><p>This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
+As the first part of the introductions, I focus only on the motivation and summary of our works.
+More details in design and implementation can be found in late posts.</p>
+
+<p><img src="/static/2021-10/edgelearn-1.png" height="250" /></p>
+
+<h2 id="why-do-we-need-training-on-edge">Why do we need training on edge?</h2>
+
+<p>Cloud is not trustworthy anymore. More and more facts supports that breach on cloud happens frequently than before.
+Nowadays, with more generated personal sensitive data has been uploaded to the cloud center, tech company know better to someones than user themselves.</p>
+
+<p>Researchers, no matter in industry on academia, are working in a way that still learning from users’ data but also keeping raw sensitive data under users’ control.
+Many publications already showed feasibility of only sharing after-trained model instead of raw data.
+One recent popular study on this is google’s <a href="https://ai.googleblog.com/2017/04/federated-learning-collaborative.html">federated learning</a>.</p>
+
+<p>During investigated this problem, we found that let end user train their own data is safe, but sacrifice efficiency.
+Since one end device has limited resources, training time and power consumption can be disappointing.
+We believe there must have a leverage between privacy and efficiency in some target scenarios.</p>
+
+<p>Fortunately, we observed that users who belongs to the same campus, plant, firm and community always share similar interests.
+Therefore, these co-located users have similar demands in using AI-involved routines.
+Also, co-located users are easily targeted by same type of threats, such as ransomware to financial practitioners.</p>
+
+<p>Think about this, sending features of a new malware app to cloud services in order to train a neural networks used by antivirus program.
+This process may takes long time and small amount of samples may not be recognized by the global neural networks model.
+With a customized local model trained and deployed on the edge can successfully counter the problem.
+With edge training as a supplement of cloud training can achieve better response time and let the whole system more flexible.</p>
+
+<h2 id="why-training-on-edge-is-hard">Why training on edge is hard?</h2>
+
+<p>Since all co-located users’ device can be used for an edge training, issues and challenges occur as deploying this distributed system.</p>
+
+<p>The first challenge is <strong>struggling workers</strong>.
+Training devices are heterogeneity, from limited IoT camera to high-end media center with powerful GPU.
+They are not designed to do machine learnings.
+So, a good edge-based distributed learning framework must can handle variety speeds in training tasks.</p>
+
+<p>The second challenge is how to <strong>scale up</strong> clusters.
+In a campus, thousands and more devices may contribute computing resources to the same training tasks.
+However, these devices may located in far not matter in physical or in network topology. 
+How can we well use them well, without struggled with endless transmission time remains a challenge.</p>
+
+<p>The third issue is frequently <strong>joining and exiting</strong> of devices.
+We can’t rely on each devices to faithfully working on training tasks rather than their original workload.
+Smartly schedule work balance and handle join/exit issues also need under consideration.</p>
+
+<h2 id="our-proposal">Our proposal</h2>
+
+<ul>
+  <li>
+    <p>Dynamic training data distribution and runtime profiler</p>
+
+    <p>We design a dynamic training data distribution mechanism that helps to both the first and the third challenges.
+  Preprocessing data can be transmitted without leakage of raw sensitive information. 
+  This can helps with struggling workers who can train small batches in order to upload parameters with a similar training time.
+  Also, for extremely slow devices, join and exit of devices cases, dynamic data distribution and profiler can helps with keep global training parameters from polluted and staleness.</p>
+
+    <p>To counter heterogeneity’s, more approaches were applied in our later research.
+  More details were introduced to runtime profiler in the later works.</p>
+  </li>
+  <li>
+    <p>Asynchronous and synchronous aggregation enabled</p>
+
+    <p>In our findings, asynchronous and synchronous parameter update have their pros and cons. 
+  Keeping sync all the time leads struggling worker issue unsolvable.
+  However, async’s harm to accuracy and convergence time also need attentions.
+  To carefully chose between these two update policies at the runtime is what we proposed to make use of their own advantages.</p>
+  </li>
+  <li>
+    <p>Leader role splitting</p>
+
+    <p>The idea is to let worker devices with higher bandwidth taking leader role during training.
+  Parameter updating does not require much computation but only need bandwidth. 
+  Devices with sufficient bandwidth can also work as virtual leader devices.
+  This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.</p>
+  </li>
+</ul>
+</div><section class="article__sharing d-print-none"></section><div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2021-10-13T16:53:20-04:00"><!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
+<div class="article__subscribe"><div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="/feed.xml">Subscribe</a></div>
+</div><div class="article__license"></div></footer>
+<div class="article__section-navigator clearfix"><div class="previous"><span>PREVIOUS</span><a href="/posts/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></div></div></div>
+
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
+</script>
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script><script>
+  /* toc must before affix, since affix need to konw toc' height. */(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window);
+    var $articleContent = $('.js-article-content');
+    var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
+    var toc;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+    var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
+
+    function disabled() {
+      return $col2.css('display') === 'none' || !hasToc;
+    }
+
+    tocDisabled = disabled();
+
+    toc = $tocRoot.toc({
+      selectors: TOC_SELECTOR,
+      container: $articleContent,
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      tocDisabled = disabled();
+      toc && toc.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window), $pageFooter = $('.js-page-footer');
+    var $pageAside = $('.js-page-aside');
+    var affix;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+
+    affix = $pageAside.affix({
+      offsetBottom: $pageFooter.outerHeight(),
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      scroll: hasSidebar ? $('.js-page-main').children() : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      affix && affix.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+    window.pageAsideAffix = affix;
+  });
+})();
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/posts/generate-word-cloud-with-chinese-fenci.html b/_site/posts/generate-word-cloud-with-chinese-fenci.html
new file mode 100644
index 0000000..7fe6aea
--- /dev/null
+++ b/_site/posts/generate-word-cloud-with-chinese-fenci.html
@@ -0,0 +1,1109 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries - Stop Talking, Start Doing</title>
+
+<meta name="description" content="Let’s generate a word cloud like this. Don’t understand the language is not a big deal.If your written language is based on latin alphabet(or other language ...">
+<link rel="canonical" href="http://localhost:4000/posts/generate-word-cloud-with-chinese-fenci"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport has-aside cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"><aside class="page__aside js-page-aside"><div class="toc-aside js-toc-root"></div>
+</aside></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1>Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</h1></header><span class="split-space">&nbsp;</span>
+          <a class="edit-on-github"
+            title="Edit on Github"
+            href="https://github.com/CoderSherlock/CoderSherlock.github.io/tree/master/_posts/2020-09-15-generate-word-cloud-with-chinese-fenci.md">
+            <i class="far fa-edit"></i></a></div><meta itemprop="headline" content="Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries"><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=visualization">visualization</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Sep 15, 2020</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2020-09-15T22:00:14-04:00">
+    <meta itemprop="keywords" content="visualization"><div class="js-article-content"><div class="layout--article"><!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
+<div class="article__content" itemprop="articleBody"><p>Let’s generate a word cloud like this. 
+Don’t understand the language is not a big deal.
+If your written language is based on latin alphabet(or other language has space between words), skip tokenization.</p>
+
+<p><img src="/static/2020-09/2020-06-28.png" height="250" /></p>
+
+<h2 id="background">Background</h2>
+
+<p>Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used <a href="https://tt-rss.org/">TinyTinyRSS</a>, or as ttrss, a popular RSS client which friendly to docker. Thanks to developer <a href="https://ttrss.henry.wang/#about">HenryQW</a>, a well-written Nginx-based docker configuration is already available in docker hub. With more feeds were added, I found some feeds does not need to be checked everyday. Thus I was thinking to create a script to automatically list all keywords appears in a last period and generate a heat map kind figure of it.</p>
+
+<p>Before you go further, I’ll tell you all my settings to give readers a general overview.</p>
+
+<p>My first step is to read all text-based information from TTRSS’s PostgreSQL database. With information, I used a Chinese-NLP library, <a href="https://github.com/fxsjy/jieba">jieba</a>, to extract all keyword with their occurrences frequency. By using <a href="https://github.com/amueller/word_cloud">WordCloud</a>, a python library, word cloud figure is generated and present. More details will be discussed in later sections.</p>
+
+<h2 id="get-rss-feeds-text">Get RSS feeds’ text</h2>
+
+<p>My first thought is generating a keyword heat map for economy news of a last week. Since this blog post are more skewed to Chinese tokenization and draw the word cloud figure. I’ll leave my code here just in case. The SQL connector I used is <a href="https://pypi.org/project/psycopg2/">psycopg2</a>, an easy-use PostgreSQL library.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+	<span class="bp">self</span><span class="p">.</span><span class="n">dbe</span> <span class="o">=</span> <span class="n">psycopg2</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span>
+    	<span class="n">host</span><span class="o">=</span><span class="n">DB_HOST</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="n">DB_PORT</span><span class="p">,</span> <span class="n">database</span><span class="o">=</span><span class="n">DB_NAME</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">DB_USER</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="n">DB_PASS</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">get_1w_of_feed_byid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
+	<span class="n">cur</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">dbe</span><span class="p">.</span><span class="n">cursor</span><span class="p">()</span>
+    <span class="n">cur</span><span class="p">.</span><span class="n">execute</span><span class="p">(</span><span class="s">'SELECT content FROM public.ttrss_entries </span><span class="se">\
+</span><span class="s">    	where date_updated &gt; now() - interval </span><span class="se">\'</span><span class="s">1 week</span><span class="se">\'</span><span class="s"> AND id in ( </span><span class="se">\
+</span><span class="s">        select int_id from DB_TABLE_NAME </span><span class="se">\
+</span><span class="s">        where feed_id='</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span> <span class="o">+</span> <span class="s">' </span><span class="se">\
+</span><span class="s">        ) </span><span class="se">\
+</span><span class="s">        ORDER BY id ASC '</span>
+        <span class="p">)</span>
+	<span class="n">rows</span> <span class="o">=</span> <span class="n">cur</span><span class="p">.</span><span class="n">fetchall</span><span class="p">()</span>
+	<span class="k">return</span> <span class="n">rows</span>
+</code></pre></div></div>
+
+<p>Most arguments are intuitive and easy to understand. The only exception is argument of function <em>get_1w_of_feed_byid</em>. This <strong>id</strong> is the feed index of my subscriptions.</p>
+
+<h2 id="tokenize-with-frequency">Tokenize with frequency</h2>
+
+<p>Two popular tokenization library were used, and I chose <a href="https://github.com/fxsjy/jieba">jieba</a> after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">remove_biaodian</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+    <span class="n">punct</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="sa">u</span><span class="s">''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐､﹒
+                ﹔﹕﹖﹗﹚﹜﹞！），．：；？｜｝︴︶︸︺︼︾﹀﹂﹄﹏､～￠
+                々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖（［｛￡￥〝︵︷︹︻
+                ︽︿﹁﹃﹙﹛﹝（｛“‘-—_…'''</span><span class="p">)</span>
+    <span class="n">ret</span> <span class="o">=</span> <span class="s">""</span>
+    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
+        <span class="k">if</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">punct</span><span class="p">:</span>
+            <span class="n">ret</span> <span class="o">+=</span> <span class="s">''</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">ret</span> <span class="o">+=</span> <span class="n">x</span>
+    <span class="k">return</span> <span class="n">ret</span>
+</code></pre></div></div>
+
+<p>After we have an all characters string, we can call jieba. By using the function <em>jieba.posseg.cut</em> with or without paddle, we can have a word list and their “part of speech”.  As you can see in the following code, I also did two more works.</p>
+
+<p>First, in the if statement, I only kept all nouns with some categories. Category abbreviation such as “nr” and “ns” represent different “part of speech”, I attached with categories I used in the following table. For more details you can find in this <a href="https://github.com/fxsjy/jieba">link</a>.</p>
+
+<p>The second work is only keeping words with length longer than 2 characters. In Chinese, there’s no space between words such as Latin writing systems. Since then, some single-character-words such as conjunction words are easy to be misrecognized as specialty-noun.  And this misrecognition will cause more single-character being regarded as specialty-noun. I am not able to improve NLP method, so I used a easy way to fix this by removing any words less than 2 characters.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">jieba.posseg</span> <span class="k">as</span> <span class="n">pseg</span>
+
+<span class="k">def</span> <span class="nf">get_noun_jieba</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
+	<span class="n">content</span> <span class="o">=</span> <span class="n">remove_biaodian</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
+	<span class="n">words</span> <span class="o">=</span> <span class="n">pseg</span><span class="p">.</span><span class="n">cut</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>	<span class="c1"># Invoking jieba.posseg.cut function 
+</span>
+	<span class="n">ret</span> <span class="o">=</span> <span class="p">[]</span>
+	<span class="k">for</span> <span class="n">word</span><span class="p">,</span> <span class="n">flag</span> <span class="ow">in</span> <span class="n">words</span><span class="p">:</span>
+		<span class="c1"># print(word, flag)
+</span>		<span class="k">if</span> <span class="n">flag</span> <span class="ow">in</span> <span class="p">[</span><span class="s">'nr'</span><span class="p">,</span> <span class="s">'ns'</span><span class="p">,</span> <span class="s">'nt'</span><span class="p">,</span> <span class="s">'nw'</span><span class="p">,</span> <span class="s">'nz'</span><span class="p">,</span> <span class="s">'PER'</span><span class="p">,</span> <span class="s">'ORG'</span><span class="p">,</span> <span class="s">'x'</span><span class="p">]:</span>   <span class="c1"># LOC
+</span>			<span class="n">ret</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
+	<span class="k">return</span> <span class="p">[</span><span class="n">remove_biaodian</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">ret</span> <span class="k">if</span> <span class="n">i</span><span class="p">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">!=</span> <span class="s">""</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">remove_biaodian</span><span class="p">(</span><span class="n">i</span><span class="p">.</span><span class="n">strip</span><span class="p">()))</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">]</span>
+</code></pre></div></div>
+
+<ul>
+  <li>Word category names and abbreviations</li>
+</ul>
+
+<table>
+  <thead>
+    <tr>
+      <th>Abbreviation</th>
+      <th>Category name/ Part of speech</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>nr</td>
+      <td>People name noun</td>
+    </tr>
+    <tr>
+      <td>ns</td>
+      <td>Location name noun</td>
+    </tr>
+    <tr>
+      <td>nt</td>
+      <td>Organization name noun</td>
+    </tr>
+    <tr>
+      <td>nw</td>
+      <td>Arts work noun</td>
+    </tr>
+    <tr>
+      <td>nz</td>
+      <td>Other noun</td>
+    </tr>
+    <tr>
+      <td>PER</td>
+      <td>People name noun</td>
+    </tr>
+    <tr>
+      <td>ORG</td>
+      <td>Location name noun</td>
+    </tr>
+    <tr>
+      <td>x</td>
+      <td>Non-morpheme word</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>With all words extracted, we can easily calculate their frequencies.  After this, we can using the following line of code to print a sorted result to verify correctness.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">noun</span> <span class="o">=</span> <span class="n">seg</span><span class="p">.</span><span class="n">get_noun_jieba</span><span class="p">(</span><span class="n">test_content</span><span class="p">)</span>
+<span class="c1"># ... Calculate frequency of above word list ...
+</span><span class="k">print</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">a_dict</span><span class="p">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
+</code></pre></div></div>
+
+<h2 id="draw-word-cloud">Draw word cloud</h2>
+
+<p>With a keyword and frequency dictionary(data structure), we can just call built-in functions from wordcloud library to generate the figure.</p>
+
+<p>First we need to initialize an instance of wordcloud class. As you can see in my code, I set it with 6 parameters. Width and Height of the canvas, maximum amount of words used to generate the figure, the font of words, background color and margin between any two words.</p>
+
+<p>After having the instance, we call function <em>generate_from_frequencies</em> and pass keyword dictionary to it. The return value of this function is an bitmap image, which we can use <a href="https://matplotlib.org/">matplotlib</a> to plot it to your screen.</p>
+
+<p>I tested my plot on ubuntu-subsystem on Windows 10, unfortunately matplotlib under subsystem depends on x11 window manager and its not default available on windows. We need to install an  x11 manager to support. <a href="https://sourceforge.net/projects/xming/">Xming</a> is the one I used.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">wordcloud</span> <span class="kn">import</span> <span class="n">WordCloud</span>
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
+
+<span class="n">font_path</span> <span class="o">=</span> <span class="s">"./font/haipai.ttf"</span>
+<span class="n">output_path</span> <span class="o">=</span> <span class="s">"./font/out.png"</span>
+
+
+<span class="k">def</span> <span class="nf">show_figure_with_frequency</span><span class="p">(</span><span class="n">keywords</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+    <span class="n">wc</span> <span class="o">=</span> <span class="n">WordCloud</span><span class="p">(</span><span class="n">width</span><span class="o">=</span><span class="mi">828</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">1792</span><span class="p">,</span> <span class="n">max_words</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">font_path</span><span class="o">=</span><span class="n">font_path</span><span class="p">,</span>
+                   <span class="n">background_color</span><span class="o">=</span><span class="s">"white"</span><span class="p">,</span> <span class="n">margin</span><span class="o">=</span><span class="mi">1</span><span class="p">).</span><span class="n">generate_from_frequencies</span><span class="p">(</span><span class="n">keywords</span><span class="p">)</span>
+    <span class="n">plt</span><span class="p">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">wc</span><span class="p">)</span>
+    <span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">'off'</span><span class="p">)</span>
+    <span class="n">plt</span><span class="p">.</span><span class="n">show</span><span class="p">()</span>
+</code></pre></div></div>
+
+<p>If everything work fine, a word cloud figure will show up in a new window. My version looks like this.</p>
+
+<p><img src="/static/2020-09/2020-06-28.png" height="150" /></p>
+
+<p>This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.</p>
+
+</div><section class="article__sharing d-print-none"></section><div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2020-09-15T22:00:14-04:00"><!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
+<div class="article__subscribe"><div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="/feed.xml">Subscribe</a></div>
+</div><div class="article__license"></div></footer>
+<div class="article__section-navigator clearfix"><div class="previous"><span>PREVIOUS</span><a href="/posts/intro-xv6">Xv6 introduction</a></div><div class="next"><span>NEXT</span><a href="/posts/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></div></div></div>
+
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
+</script>
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script><script>
+  /* toc must before affix, since affix need to konw toc' height. */(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window);
+    var $articleContent = $('.js-article-content');
+    var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
+    var toc;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+    var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
+
+    function disabled() {
+      return $col2.css('display') === 'none' || !hasToc;
+    }
+
+    tocDisabled = disabled();
+
+    toc = $tocRoot.toc({
+      selectors: TOC_SELECTOR,
+      container: $articleContent,
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      tocDisabled = disabled();
+      toc && toc.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window), $pageFooter = $('.js-page-footer');
+    var $pageAside = $('.js-page-aside');
+    var affix;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+
+    affix = $pageAside.affix({
+      offsetBottom: $pageFooter.outerHeight(),
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      scroll: hasSidebar ? $('.js-page-main').children() : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      affix && affix.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+    window.pageAsideAffix = affix;
+  });
+})();
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/posts/intro-xv6.html b/_site/posts/intro-xv6.html
new file mode 100644
index 0000000..c586f07
--- /dev/null
+++ b/_site/posts/intro-xv6.html
@@ -0,0 +1,1024 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Xv6 introduction - Stop Talking, Start Doing</title>
+
+<meta name="description" content="In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching...">
+<link rel="canonical" href="http://localhost:4000/posts/intro-xv6"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport has-aside cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"><aside class="page__aside js-page-aside"><div class="toc-aside js-toc-root"></div>
+</aside></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1>Xv6 introduction</h1></header><span class="split-space">&nbsp;</span>
+          <a class="edit-on-github"
+            title="Edit on Github"
+            href="https://github.com/CoderSherlock/CoderSherlock.github.io/tree/master/_posts/2017-07-08-intro-xv6.md">
+            <i class="far fa-edit"></i></a></div><meta itemprop="headline" content="Xv6 introduction"><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=xv6">xv6</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Jul 28, 2017</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2017-07-28T14:56:55-04:00">
+    <meta itemprop="keywords" content="xv6"><div class="js-article-content"><div class="layout--article"><!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
+<div class="article__content" itemprop="articleBody"><p>In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
+Understand system call and know how to implement a simple one will be coved as the first half.
+In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.</p>
+
+<h2 id="xv6-systemcall">Xv6 Systemcall</h2>
+
+<p>To invoke a system call, we have to first define a user mode function to be the interface of the kernel instruction  in file <em>user.h</em>.</p>
+
+<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">function</span> <span class="p">(</span><span class="kt">void</span><span class="p">);</span>
+</code></pre></div></div>
+
+<p>This interface-like function will then pass the function name, in this case function, to <em>usys.S</em>. When using user mode function in programs, <em>usys.S</em> will generate a reference to SYS_function and push system call number of this function into %eax. After that, system can know from <em>syscall.c</em> and determining whether this system call is available. We must define same name system function and add it into <em>syscall.h</em> and <em>syscall.c</em>.</p>
+
+<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define SYS_function ##  // ## is the system call number
+</span><span class="p">[</span><span class="n">SYS_function</span><span class="p">]</span>  <span class="n">sys_function</span> <span class="c1">// real system function name</span>
+<span class="k">extern</span> <span class="kt">int</span> <span class="nf">sys_function</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span> <span class="c1">// real system function declaration</span>
+</code></pre></div></div>
+
+<p>After adding these sentences to syscall files, we can implement real function in specific place where you want to make the function works well.</p>
+
+<p>Sometimes, we need to pass variables among system calls. In this case, variables’ values are not necessary and even can’t be pass directly into system_function. When invoke a system call function, all variables of this system call will be pushed into current process’ stack. In file <em>syscall.c</em>, multiple functions are provided to get these variables from the process. I won’t waste time on explaining how to use these functions especially when elegant and detailed comments were written in source codes. However, I will explain concepts and how process organized and works in xv6 in future articles.</p>
+
+<h2 id="debug-xv6-with-gdb">Debug xv6 with gdb</h2>
+
+<p>Please make sure that you have used gdb before.
+If you never used gdb, you may write a simple 50-100 lines c code and practice how to use gdb first.</p>
+
+<ul>
+  <li><a href="https://sourceware.org/gdb/current/onlinedocs/gdb/">GDB Manual</a></li>
+  <li><a href="https://darkdust.net/files/GDB%20Cheat%20Sheet.pdf">GDB cheatsheet (pdf)</a></li>
+</ul>
+
+<p>To make sure xv6 gdb enabled, please check if <em>.gdbinit.tmpl</em> file exist.
+This file is used for generate <em>.gdbinit</em> file which you can late consider it as a configuration for gdb.</p>
+
+<p>Before running the xv6 instance in QEMU, one more thing you need to know is that using gdb to debug xv6 must be attached remotely.
+This is because xv6 was running within QEMU, and emulator is virtually gapped from the host device.
+Later when you start debugging, QEMU will open a gdb server to let gdb client connect to.</p>
+
+<p>Once you want to start, using following command to compile and run xv6</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>make qemu-nox-gdb
+<span class="k">***</span> Now run <span class="s1">'gdb'</span><span class="nb">.</span>
+qemu-system-i386 <span class="nt">-nographic</span> <span class="nt">-drive</span> <span class="nv">file</span><span class="o">=</span>fs.img,index<span class="o">=</span>1,media<span class="o">=</span>disk,format<span class="o">=</span>raw <span class="nt">-drive</span> <span class="nv">file</span><span class="o">=</span>xv6.img,index<span class="o">=</span>0,media<span class="o">=</span>disk,format<span class="o">=</span>raw <span class="nt">-smp</span> 2 7
+</code></pre></div></div>
+
+<p>At this moment, it feels xv6 was stuck, this is because QEMU is ready to be connected by the gdb client.
+You may use the <em>.gdbinit</em> to automatically finish this remote connection by simple typein following command in another terminal.</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>gdb <span class="nt">-x</span> .gdbinit
+GNU gdb <span class="o">(</span>Debian 8.2.1-2+b3<span class="o">)</span> 8.2.1
+
+...
+
+The target architecture is assumed to be i8086
+<span class="o">[</span>f000:fff0]    0xffff0: ljmp   <span class="nv">$0x3630</span>,<span class="nv">$0xf000e05b</span>
+0x0000fff0 <span class="k">in</span> ?? <span class="o">()</span>
++ symbol-file kernel
+warning: A handler <span class="k">for </span>the OS ABI <span class="s2">"GNU/Linux"</span> is not built into this configuration
+of GDB.  Attempting to <span class="k">continue </span>with the default i8086 settings.
+
+<span class="o">(</span>gdb<span class="o">)</span> 
+</code></pre></div></div>
+
+<p>Now within this gdb client shell, type ‘c’ to continue the xv6, and you will see xv6 start execution in the first terminal.</p>
+
+<p>At this moment, you may add breakpoints to your code to see if your code is correctly implemented or not.</p>
+
+<p><strong>One more thing</strong>, if you open <em>.gdbinit</em> file, you’ll find that it by default connect to a localhost target.
+If you are working on some other environment that target and client were not placed in the same device, change the localhost to ip address correspondingly.
+Using ssh may connect to different physical devices under same domain name, this is because load balancer were used. To check ip address, search command <em>ip</em>.</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>target remote localhost:28467
+<span class="c"># target remote [ip-addr]:28467</span>
+</code></pre></div></div>
+</div><section class="article__sharing d-print-none"></section><div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2017-07-28T14:56:55-04:00"><!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
+<div class="article__subscribe"><div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="/feed.xml">Subscribe</a></div>
+</div><div class="article__license"></div></footer>
+<div class="article__section-navigator clearfix"><div class="previous"><span>PREVIOUS</span><a href="/posts/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></div><div class="next"><span>NEXT</span><a href="/posts/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></div></div></div>
+
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
+</script>
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script><script>
+  /* toc must before affix, since affix need to konw toc' height. */(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window);
+    var $articleContent = $('.js-article-content');
+    var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
+    var toc;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+    var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
+
+    function disabled() {
+      return $col2.css('display') === 'none' || !hasToc;
+    }
+
+    tocDisabled = disabled();
+
+    toc = $tocRoot.toc({
+      selectors: TOC_SELECTOR,
+      container: $articleContent,
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      tocDisabled = disabled();
+      toc && toc.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window), $pageFooter = $('.js-page-footer');
+    var $pageAside = $('.js-page-aside');
+    var affix;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+
+    affix = $pageAside.affix({
+      offsetBottom: $pageFooter.outerHeight(),
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      scroll: hasSidebar ? $('.js-page-main').children() : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      affix && affix.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+    window.pageAsideAffix = affix;
+  });
+})();
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/posts/some-of-my-previews-exper-work.html b/_site/posts/some-of-my-previews-exper-work.html
new file mode 100644
index 0000000..949867f
--- /dev/null
+++ b/_site/posts/some-of-my-previews-exper-work.html
@@ -0,0 +1,1059 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Some of my previews experiment works: 2016 - Stop Talking, Start Doing</title>
+
+<meta name="description" content="This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.2016-10Time Experiment of r...">
+<link rel="canonical" href="http://localhost:4000/posts/some-of-my-previews-exper-work"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport has-aside cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"><aside class="page__aside js-page-aside"><div class="toc-aside js-toc-root"></div>
+</aside></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1>Some of my previews experiment works: 2016</h1></header><span class="split-space">&nbsp;</span>
+          <a class="edit-on-github"
+            title="Edit on Github"
+            href="https://github.com/CoderSherlock/CoderSherlock.github.io/tree/master/_posts/2016-10-28-some-of-my-previews-exper-work.md">
+            <i class="far fa-edit"></i></a></div><meta itemprop="headline" content="Some of my previews experiment works: 2016"><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=Research">Research</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 28, 2016</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2016-10-28T12:27:33-04:00">
+    <meta itemprop="keywords" content="Research"><div class="js-article-content"><div class="layout--article"><!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
+<div class="article__content" itemprop="articleBody"><p>This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.</p>
+
+<h1 id="2016-10">2016-10</h1>
+
+<h2 id="time-experiment-of-rsync">Time Experiment of rsync</h2>
+
+<p>Patch is based on rsync with version 3.1.2. [<a href="https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz">Rsync</a>|<a href="/static/2016-10/rsync/rsync-3.1.2-time.patch">Patch</a>]</p>
+
+<h3 id="how-to-collect-data">How to collect data</h3>
+
+<p>Basically, everything of transmission time and computation time will be output with overall time will be printed on the console.
+But we also need some bash script to collect data through different size of random size and with different modification through them.</p>
+
+<ul>
+  <li>Start from 8K to 64M, modify at beginning, [<a href="/static/2016-10/rsync/small2Big_change_at_begin.sh">Bash script</a>]</li>
+  <li>Start from 8K to 64M, modify at last, [<a href="/static/2016-10/rsync/small2Big_change_at_last.sh">Bash script</a>]</li>
+  <li>Start from 8K to 64M, modify at random place with a (slow) python script, [<a href="/static/2016-10/rsync/small2Big_change_at_anyplace.sh">Bash script</a>|<a href="/static/2016-10/rsync/addbyte.py">Python program</a>]</li>
+</ul>
+
+<h2 id="time-experiment-of-seafile">Time Experiment of seafile</h2>
+
+<p>Patch is based on seafile 5.1.4. You can find the release from <a href="https://github.com/haiwen/seafile/releases">seafile official repo</a>. You may follow official compile instructions from <a href="https://manual.seafile.com/build_seafile/linux.html">here</a>. [<a href="">Patch <strong>no longer avaiable, new version at following sections</strong></a>]</p>
+
+<h3 id="how-to-collect-data-1">How to collect data</h3>
+
+<p>We also need everything be done using scripting. But this time I only design added some distance between two increasing files’ sizes.</p>
+
+<ul>
+  <li>Start from 8K to 16M, 4 times increasing, modify at beginning/ at 1024 different places with python script. [<a href="/static/2016-11/seafile/trans.sh">Bash Script</a>|<a href="/static/2016-11/seafile/addbyte.py">Python program</a>]</li>
+  <li>After using this auto testing script, everything of output will be marked in log files of seafile, which located in <strong>~/.ccnet/log/seafile.log</strong></li>
+  <li>We need to use this simple awk code and vim operation to extract data.</li>
+</ul>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># CDC: content defined chucks</span>
+<span class="c"># HUT: Http upload traffic</span>
+<span class="c"># ALL: overall time of one commit &amp; upload</span>
+<span class="nb">awk</span> <span class="s1">'/CDC|HUT|ALL/ {print $4,$5}'</span> ~/.ccnet/log/seafile.log <span class="o">&gt;</span> results.stat
+</code></pre></div></div>
+
+<h3 id="install-seafile-on-odroid-xu">Install Seafile on odroid xu</h3>
+
+<p>Due to failure of my cross-compile to seafile on android. I used develop board as a replacement experiment platform for ARM-seafile testing. I used a <a href="http://www.hardkernel.com/main/products/prdt_info.php?g_code=G137510300620">odroid xu</a> as hardware standard. Because all I need is an ARM platform, only an ARM-Ubuntu is enough for me. But develop prototype on a board is much fun than coding, I won’t address much this time. But I’ll start a blog telling some really cool stuff I made for a strange aim.</p>
+
+<p>To install a ubuntu with GUI is my all preparation work. I found to way to do this.</p>
+
+<ul>
+  <li>
+    <p><a href="http://www.armhf.com/boards/odroid-xu/">armhf</a> is a website for arm-based ubuntu. It has a detailed instruction to follow at <a href="http://www.armhf.com/boards/odroid-xu/odroid-sd-install/">here</a>. They also provide ubuntu 12.04/ 14.04 and debian 7.5 to choose. But unfortunately odroid xu’s hdmi output doesn’t supported by ubuntu native firmware. So install ubuntu-desktop might can’t be boot up for video output.</p>
+  </li>
+  <li>
+    <p>Burn images is much easy to install a pre-complied ubuntu system. I found this on odroid xu’s forum, which contains xubuntu image [<a href="http://odroid.in/ubuntu_14.04lts/ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz">download</a>] for odroid xu. With this image, you just need to use dd command to write whole system mirror into sdcard.</p>
+  </li>
+</ul>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># If .img end with xz, use this command to uncompress first</span>
+unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz    
+<span class="c"># Burn image into SD-card</span>
+<span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img <span class="nv">of</span><span class="o">=</span>/dev/sdb <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">conv</span><span class="o">=</span>fsync
+<span class="nb">sync</span>
+</code></pre></div></div>
+
+<h1 id="2016-11">2016-11</h1>
+
+<h2 id="android-kernel">Android Kernel</h2>
+
+<h3 id="how-to-build-an-android-kernel">How to build an Android Kernel?</h3>
+
+<p>Generally, I won’t tell anything in this parts, just mark some related links, and point out some mistakes or error solutions.</p>
+
+<ul>
+  <li>
+    <p><a href="http://source.android.com/source/building-kernels.html#figuring-out-which-kernel-to-build">Google Official Guide</a>
+– If you don’t have AOSP sources, you have to download prebuilt toolchains which recommended in this guide might not be correct. Use following links to choose your fitting tools.
+— <a href="https://android.googlesource.com/?format=HTML">ASOP git root</a>, under sub class “/platform/prebuilts/gcc”</p>
+  </li>
+  <li>
+    <p><a href="https://softwarebakery.com/building-the-android-kernel-on-linux">Packing and Flashing a Boot.img</a> <strong>[highly recommend]</strong></p>
+  </li>
+</ul>
+
+<h1 id="2016-12">2016-12</h1>
+
+<h2 id="android-kernel-1">Android Kernel</h2>
+
+<h3 id="how-to-compile-with-ftrace">How to compile with ftrace?</h3>
+
+<p>If we want to debug under android, ftrace is a great tool for working. But, ftrace is not available in android if we used default configure file. Android kernel configuration is in <strong>arch/arm64/kernel/configs</strong>. We need to add few lines under that.</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">CONFIG_STRICT_MEMORY_RWX</span><span class="o">=</span>y
+<span class="nv">CONFIG_FUNCTION_TRACER</span><span class="o">=</span>y
+<span class="nv">CONFIG_FUNCTION_GRAPH_TRACER</span><span class="o">=</span>y
+<span class="nv">CONFIG_DYNAMIC_FTRACE</span><span class="o">=</span>y
+<span class="nv">CONFIG_PERSISTENT_TRACER</span><span class="o">=</span>y
+<span class="nv">CONFIG_IRQSOFF_TRACER</span><span class="o">=</span>y
+<span class="nv">CONFIG_PREEMPT_TRACER</span><span class="o">=</span>y
+<span class="nv">CONFIG_SCHED_TRACER</span><span class="o">=</span>y
+<span class="nv">CONFIG_STACK_TRACER</span><span class="o">=</span>y
+</code></pre></div></div>
+
+<h3 id="how-to-extract-android-images-dump-an-image">How to extract android images: Dump an image</h3>
+
+<p>If we want to hold a rooted status after flashing boot, we need to extract an image from android devices. We can first use following command to find which blocks belongs to. According to some references, <a href="http://forum.xda-developers.com/showthread.php?t=2450045">this article</a> provide three ways to dump an image, I picked one for easy using.</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb shell
+<span class="nb">ls</span> <span class="nt">-al</span> /dev/block/platform/<span class="nv">$SOME</span><span class="se">\_</span>DEVICE../../by-name <span class="c"># {Partitions} -&gt; {Device Block}</span>
+
+<span class="c"># dump file</span>
+su
+<span class="nb">dd </span><span class="k">if</span><span class="o">=</span>/dev/block/mmcblk0p37 <span class="nv">of</span><span class="o">=</span>/sdcard/boot.img
+</code></pre></div></div>
+</div><section class="article__sharing d-print-none"></section><div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2016-10-28T12:27:33-04:00"><!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
+<div class="article__subscribe"><div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="/feed.xml">Subscribe</a></div>
+</div><div class="article__license"></div></footer>
+<div class="article__section-navigator clearfix"><div class="previous"><span>PREVIOUS</span><a href="/posts/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></div><div class="next"><span>NEXT</span><a href="/posts/intro-xv6">Xv6 introduction</a></div></div></div>
+
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
+</script>
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script><script>
+  /* toc must before affix, since affix need to konw toc' height. */(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window);
+    var $articleContent = $('.js-article-content');
+    var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
+    var toc;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+    var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
+
+    function disabled() {
+      return $col2.css('display') === 'none' || !hasToc;
+    }
+
+    tocDisabled = disabled();
+
+    toc = $tocRoot.toc({
+      selectors: TOC_SELECTOR,
+      container: $articleContent,
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      tocDisabled = disabled();
+      toc && toc.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window), $pageFooter = $('.js-page-footer');
+    var $pageAside = $('.js-page-aside');
+    var affix;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+
+    affix = $pageAside.affix({
+      offsetBottom: $pageFooter.outerHeight(),
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      scroll: hasSidebar ? $('.js-page-main').children() : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      affix && affix.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+    window.pageAsideAffix = affix;
+  });
+})();
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/posts/welcome-to-my-blog.html b/_site/posts/welcome-to-my-blog.html
new file mode 100644
index 0000000..a6cf00e
--- /dev/null
+++ b/_site/posts/welcome-to-my-blog.html
@@ -0,0 +1,950 @@
+<!DOCTYPE html><html lang="en">
+  <head><meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Stop Talking is the worst title of one blog - Stop Talking, Start Doing</title>
+
+<meta name="description" content="">
+<link rel="canonical" href="http://localhost:4000/posts/welcome-to-my-blog"><link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="/feed.xml"><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico">
+
+<meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml">
+
+<meta name="theme-color" content="#ffffff">
+<!-- end favicons snippet --><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css" ><!-- start custom head snippets -->
+
+<!-- end custom head snippets -->
+<script>(function() {
+  window.isArray = function(val) {
+    return Object.prototype.toString.call(val) === '[object Array]';
+  };
+  window.isString = function(val) {
+    return typeof val === 'string';
+  };
+
+  window.hasEvent = function(event) {
+    return 'on'.concat(event) in window.document;
+  };
+
+  window.isOverallScroller = function(node) {
+    return node === document.documentElement || node === document.body || node === window;
+  };
+
+  window.isFormElement = function(node) {
+    var tagName = node.tagName;
+    return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
+  };
+
+  window.pageLoad = (function () {
+    var loaded = false, cbs = [];
+    window.addEventListener('load', function () {
+      var i;
+      loaded = true;
+      if (cbs.length > 0) {
+        for (i = 0; i < cbs.length; i++) {
+          cbs[i]();
+        }
+      }
+    });
+    return {
+      then: function(cb) {
+        cb && (loaded ? cb() : (cbs.push(cb)));
+      }
+    };
+  })();
+})();
+(function() {
+  window.throttle = function(func, wait) {
+    var args, result, thisArg, timeoutId, lastCalled = 0;
+
+    function trailingCall() {
+      lastCalled = new Date;
+      timeoutId = null;
+      result = func.apply(thisArg, args);
+    }
+    return function() {
+      var now = new Date,
+        remaining = wait - (now - lastCalled);
+
+      args = arguments;
+      thisArg = this;
+
+      if (remaining <= 0) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+        lastCalled = now;
+        result = func.apply(thisArg, args);
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(trailingCall, remaining);
+      }
+      return result;
+    };
+  };
+})();
+(function() {
+  var Set = (function() {
+    var add = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (data[i] === item) {
+          return;
+        }
+      }
+      this.size ++;
+      data.push(item);
+      return data;
+    };
+
+    var Set = function(data) {
+      this.size = 0;
+      this._data = [];
+      var i;
+      if (data.length > 0) {
+        for (i = 0; i < data.length; i++) {
+          add.call(this, data[i]);
+        }
+      }
+    };
+    Set.prototype.add = add;
+    Set.prototype.get = function(index) { return this._data[index]; };
+    Set.prototype.has = function(item) {
+      var i, data = this._data;
+      for (i = 0; i < data.length; i++) {
+        if (this.get(i) === item) {
+          return true;
+        }
+      }
+      return false;
+    };
+    Set.prototype.is = function(map) {
+      if (map._data.length !== this._data.length) { return false; }
+      var i, j, flag, tData = this._data, mData = map._data;
+      for (i = 0; i < tData.length; i++) {
+        for (flag = false, j = 0; j < mData.length; j++) {
+          if (tData[i] === mData[j]) {
+            flag = true;
+            break;
+          }
+        }
+        if (!flag) { return false; }
+      }
+      return true;
+    };
+    Set.prototype.values = function() {
+      return this._data;
+    };
+    return Set;
+  })();
+
+  window.Lazyload = (function(doc) {
+    var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+    var createNode = function(name, attrs) {
+      var node = doc.createElement(name), attr;
+      for (attr in attrs) {
+        if (attrs.hasOwnProperty(attr)) {
+          node.setAttribute(attr, attrs[attr]);
+        }
+      }
+      return node;
+    };
+    var end = function(type, url) {
+      var s, q, qi, cbs, i, j, cur, val, flag;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        s[url] = true;
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (cur.urls.has(url)) {
+            qi = cur, val = qi.urls.values();
+            qi && (cbs = qi.callbacks);
+            for (flag = true, j = 0; j < val.length; j++) {
+              cur = val[j];
+              if (!s[cur]) {
+                flag = false;
+              }
+            }
+            if (flag && cbs && cbs.length > 0) {
+              for (j = 0; j < cbs.length; j++) {
+                cbs[j].call(context);
+              }
+              qi.load = true;
+            }
+          }
+        }
+      }
+    };
+    var load = function(type, urls, callback) {
+      var s, q, qi, node, i, cur,
+        _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+      if (type === 'js' || type ==='css') {
+        s = sources[type], q = queue[type];
+        for (i = 0; i < q.length; i++) {
+          cur = q[i];
+          if (_urls.is(cur.urls)) {
+            qi = cur;
+            break;
+          }
+        }
+        val = _urls.values();
+        if (qi) {
+          callback && (qi.load || qi.callbacks.push(callback));
+          callback && (qi.load && callback());
+        } else {
+          q.push({
+            urls: _urls,
+            callbacks: callback ? [callback] : [],
+            load: false
+          });
+          for (i = 0; i < val.length; i++) {
+            node = null, url = val[i];
+            if (s[url] === undefined) {
+              (type === 'js' ) && (node = createNode('script', { src: url }));
+              (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+              if (node) {
+                node.onload = (function(type, url) {
+                  return function() {
+                    end(type, url);
+                  };
+                })(type, url);
+                (doc.head || doc.body).appendChild(node);
+                s[url] = false;
+              }
+            }
+          }
+        }
+      }
+    };
+    return {
+      js: function(url, callback) {
+        load('js', url, callback);
+      },
+      css: function(url, callback) {
+        load('css', url, callback);
+      }
+    };
+  })(this.document);
+})();
+</script><script>
+  (function() {
+    var TEXT_VARIABLES = {
+      version: '2.2.6',
+      sources: {
+        font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css',
+        jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js',
+        leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
+        chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
+        gitalk: {
+          js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
+          css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+        },
+        valine: 'https://unpkg.com/valine/dist/Valine.min.js',
+        mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML',
+        mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+      },
+      site: {
+        toc: {
+          selectors: 'h1,h2,h3'
+        }
+      },
+      paths: {
+        search_js: '/assets/search.js'
+      }
+    };
+    window.TEXT_VARIABLES = TEXT_VARIABLES;
+  })();
+</script>
+</head>
+  <body>
+    <div class="root" data-is-touch="false">
+      <div class="layout--page js-page-root"><div class="page__main js-page-main page__viewport has-aside cell cell--auto">
+
+      <div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
+      <div class="header__title">
+        <div class="header__brand"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
+<a title="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+" href="/">Stop Talking, Start Doing</a></div><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></div><nav class="navigation">
+        <ul><li class="navigation__item"><a href="/archive.html">Archive</a></li><li class="navigation__item"><a href="/about.html">About</a></li><li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li></ul>
+      </nav></div>
+  </header>
+</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
+
+              <div class="col-aside d-print-none js-col-aside"><aside class="page__aside js-page-aside"><div class="toc-aside js-toc-root"></div>
+</aside></div>
+
+              <div class="col-main cell cell--auto"><!-- start custom main top snippet -->
+
+<!-- end custom main top snippet -->
+<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1>Stop Talking is the worst title of one blog</h1></header><span class="split-space">&nbsp;</span>
+          <a class="edit-on-github"
+            title="Edit on Github"
+            href="https://github.com/CoderSherlock/CoderSherlock.github.io/tree/master/_posts/2016-10-26-welcome-to-my-blog.markdown">
+            <i class="far fa-edit"></i></a></div><meta itemprop="headline" content="Stop Talking is the worst title of one blog"><div class="article__info clearfix"><ul class="left-col menu"><li>
+              <a class="button button--secondary button--pill button--sm"
+                href="/archive.html?tag=Nonsense">Nonsense</a>
+            </li></ul><ul class="right-col menu"><li><i class="far fa-calendar-alt"></i> <span>Oct 26, 2016</span>
+            </li></ul></div><meta itemprop="author" content="Pengzhan Hao"/><meta itemprop="datePublished" content="2016-10-26T22:50:33-04:00">
+    <meta itemprop="keywords" content="Nonsense"><div class="js-article-content"><div class="layout--article"><!-- start custom article top snippet -->
+
+<!-- end custom article top snippet -->
+<div class="article__content" itemprop="articleBody">
+</div><section class="article__sharing d-print-none"></section><div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2016-10-26T22:50:33-04:00"><!-- start custom article footer snippet -->
+
+<!-- end custom article footer snippet -->
+<div class="article__subscribe"><div class="subscribe"><i class="fas fa-rss"></i> <a type="application/rss+xml" href="/feed.xml">Subscribe</a></div>
+</div><div class="article__license"></div></footer>
+<div class="article__section-navigator clearfix"><div class="next"><span>NEXT</span><a href="/posts/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></div></div></div>
+
+</div>
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    $(function() {
+      var $this ,$scroll;
+      var $articleContent = $('.js-article-content');
+      var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+      var scroll = hasSidebar ? '.js-page-main' : 'html, body';
+      $scroll = $(scroll);
+
+      $articleContent.find('.highlight').each(function() {
+        $this = $(this);
+        $this.attr('data-lang', $this.find('code').attr('data-lang'));
+      });
+      $articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
+        $this = $(this);
+        $this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
+      });
+      $articleContent.on('click', '.anchor', function() {
+        $scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
+      });
+    });
+  });
+})();
+</script>
+</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
+
+<!-- end custom main bottom snippet -->
+</div>
+            </div></div></div><div class="page__footer d-print-none">
+<footer class="footer py-4 js-page-footer">
+  <div class="main"><div itemscope itemtype="http://schema.org/Person">
+      <meta itemprop="name" content="Pengzhan Hao"><meta itemprop="url" content="/"><div class="footer__author-links"><div class="author-links">
+  <ul class="menu menu--nowrap menu--inline"><li title="Send me an Email.">
+      <a class="button button--circle mail-button" itemprop="email" href="mailto:haopengzhan@gmail.com" target="_blank">
+        <i class="fas fa-envelope"></i>
+      </a><li title="Follow me on Github.">
+        <a class="button button--circle github-button" itemprop="sameAs" href="https://github.com/codersherlock" target="_blank">
+          <div class="icon"><svg fill="#000000" width="24px" height="24px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <path class="svgpath" data-index="path_0" fill="#272636" d="M0 525.2c0 223.6 143.3 413.7 343 483.5 26.9 6.8 22.8-12.4 22.8-25.4l0-88.7c-155.3 18.2-161.5-84.6-172-101.7-21.1-36-70.8-45.2-56-62.3 35.4-18.2 71.4 4.6 113.1 66.3 30.2 44.7 89.1 37.2 119 29.7 6.5-26.9 20.5-50.9 39.7-69.6C248.8 728.2 181.7 630 181.7 513.2c0-56.6 18.7-108.7 55.3-150.7-23.3-69.3 2.2-128.5 5.6-137.3 66.5-6 135.5 47.6 140.9 51.8 37.8-10.2 80.9-15.6 129.1-15.6 48.5 0 91.8 5.6 129.8 15.9 12.9-9.8 77-55.8 138.8-50.2 3.3 8.8 28.2 66.7 6.3 135 37.1 42.1 56 94.6 56 151.4 0 117-67.5 215.3-228.8 243.7 26.9 26.6 43.6 63.4 43.6 104.2l0 128.8c0.9 10.3 0 20.5 17.2 20.5C878.1 942.4 1024 750.9 1024 525.3c0-282.9-229.3-512-512-512C229.1 13.2 0 242.3 0 525.2L0 525.2z" />
+</svg>
+</div>
+        </a>
+      </li></ul>
+</div>
+</div>
+    </div><div class="site-info mt-2">
+      <div>© Stop Talking, Start Doing 2021,
+        Powered by <a title="Jekyll is a simple, blog-aware, static site generator." href="http://jekyllrb.com/">Jekyll</a> & <a
+        title="TeXt is a super customizable Jekyll theme." href="https://github.com/kitian616/jekyll-TeXt-theme">TeXt Theme</a>.
+      </div>
+    </div>
+  </div>
+</footer>
+</div></div>
+    </div><script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $body = $('body'), $window = $(window);
+    var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
+    var activeCount = 0;
+    function modal(options) {
+      var $root = this, visible, onChange, hideWhenWindowScroll = false;
+      var scrollTop;
+      function setOptions(options) {
+        var _options = options || {};
+        visible = _options.initialVisible === undefined ? false : show;
+        onChange = _options.onChange;
+        hideWhenWindowScroll = _options.hideWhenWindowScroll;
+      }
+      function init() {
+        setState(visible);
+      }
+      function setState(isShow) {
+        if (isShow === visible) {
+          return;
+        }
+        visible = isShow;
+        if (visible) {
+          activeCount++;
+          scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
+          $root.addClass('modal--show');
+          $pageMain.scrollTop(scrollTop);
+          activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
+          $window.on('keyup', handleKeyup);
+        } else {
+          activeCount > 0 && activeCount--;
+          $root.removeClass('modal--show');
+          $window.scrollTop(scrollTop);
+          activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
+          hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
+          $window.off('keyup', handleKeyup);
+        }
+        onChange && onChange(visible);
+      }
+      function show() {
+        setState(true);
+      }
+      function hide() {
+        setState(false);
+      }
+      function handleKeyup(e) {
+        // Char Code: 27  ESC
+        if (e.which ===  27) {
+          hide();
+        }
+      }
+      setOptions(options);
+      init();
+      return {
+        show: show,
+        hide: hide,
+        $el: $root
+      };
+    }
+    $.fn.modal = modal;
+  });
+})();
+</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
+(function () {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    // search panel
+    var search = (window.search || (window.search = {}));
+    var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
+      true : window.useDefaultSearchBox ;
+
+    var $searchModal = $('.js-page-search-modal');
+    var $searchToggle = $('.js-search-toggle');
+    var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
+    var modalVisible = false;
+    search.searchModal = searchModal;
+
+    var $searchBox = null;
+    var $searchInput = null;
+    var $searchClear = null;
+
+    function getModalVisible() {
+      return modalVisible;
+    }
+    search.getModalVisible = getModalVisible;
+
+    function handleModalChange(visible) {
+      modalVisible = visible;
+      if (visible) {
+        search.onShow && search.onShow();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
+      } else {
+        search.onShow && search.onHide();
+        useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
+        setTimeout(function() {
+          useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
+          search.clear && search.clear();
+          window.pageAsideAffix && window.pageAsideAffix.refresh();
+        }, 400);
+      }
+    }
+
+    $searchToggle.on('click', function() {
+      modalVisible ? searchModal.hide() : searchModal.show();
+    });
+    // Char Code: 83  S, 191 /
+    $(window).on('keyup', function(e) {
+      if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
+        modalVisible || searchModal.show();
+      }
+    });
+
+    if (useDefaultSearchBox) {
+      $searchBox = $('.js-search-box');
+      $searchInput = $searchBox.children('input');
+      $searchClear = $searchBox.children('.js-icon-clear');
+      search.getSearchInput = function() {
+        return $searchInput.get(0);
+      };
+      search.getVal = function() {
+        return $searchInput.val();
+      };
+      search.setVal = function(val) {
+        $searchInput.val(val);
+      };
+
+      $searchInput.on('focus', function() {
+        $(this).addClass('focus');
+      });
+      $searchInput.on('blur', function() {
+        $(this).removeClass('focus');
+      });
+      $searchInput.on('input', window.throttle(function() {
+        var val = $(this).val();
+        if (val === '' || typeof val !== 'string') {
+          search.clear && search.clear();
+        } else {
+          $searchBox.addClass('not-empty');
+          search.onInputNotEmpty && search.onInputNotEmpty(val);
+        }
+      }, 400));
+      $searchClear.on('click', function() {
+        $searchInput.val(''); $searchBox.removeClass('not-empty');
+        search.clear && search.clear();
+      });
+    }
+  });
+})();
+</script><div class="search search--dark">
+  <div class="main">
+    <div class="search__header">Search</div>
+    <div class="search-bar">
+      <div class="search-box js-search-box">
+        <div class="search-box__icon-search"><i class="fas fa-search"></i></div>
+        <input type="text" />
+        <div class="search-box__icon-clear js-icon-clear">
+          <a><i class="fas fa-times"></i></a>
+        </div>
+      </div>
+      <button class="button button--theme-dark button--pill search__cancel js-search-toggle">
+        Cancel</button>
+    </div>
+    <div class="search-result js-search-result"></div>
+  </div>
+</div>
+<script>var SOURCES = window.TEXT_VARIABLES.sources;
+var PAHTS = window.TEXT_VARIABLES.paths;
+window.Lazyload.js([SOURCES.jquery, PAHTS.search_js], function() {
+  var search = (window.search || (window.search = {}));
+  var searchData = window.TEXT_SEARCH_DATA || {};
+
+  function memorize(f) {
+    var cache = {};
+    return function () {
+      var key = Array.prototype.join.call(arguments, ',');
+      if (key in cache) return cache[key];
+      else return cache[key] = f.apply(this, arguments);
+    };
+  }
+
+  /// search
+  function searchByQuery(query) {
+    var i, j, key, keys, cur, _title, result = {};
+    keys = Object.keys(searchData);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      for (j = 0; j < searchData[key].length; j++) {
+        cur = searchData[key][j], _title = cur.title;
+        if ((result[key] === undefined || result[key] && result[key].length < 4 )
+          && _title.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
+          if (result[key] === undefined) {
+            result[key] = [];
+          }
+          result[key].push(cur);
+        }
+      }
+    }
+    return result;
+  }
+
+  var renderHeader = memorize(function(header) {
+    return $('<p class="search-result__header">' + header + '</p>');
+  });
+
+  var renderItem = function(index, title, url) {
+    return $('<li class="search-result__item" data-index="' + index + '"><a class="button" href="' + url + '">' + title + '</a></li>');
+  };
+
+  function render(data) {
+    if (!data) { return null; }
+    var $root = $('<ul></ul>'), i, j, key, keys, cur, itemIndex = 0;
+    keys = Object.keys(data);
+    for (i = 0; i < keys.length; i++) {
+      key = keys[i];
+      $root.append(renderHeader(key));
+      for (j = 0; j < data[key].length; j++) {
+        cur = data[key][j];
+        $root.append(renderItem(itemIndex++, cur.title, cur.url));
+      }
+    }
+    return $root;
+  }
+
+  // search box
+  var $result = $('.js-search-result'), $resultItems;
+  var lastActiveIndex, activeIndex;
+
+  function clear() {
+    $result.html(null);
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+  }
+  function onInputNotEmpty(val) {
+    $result.html(render(searchByQuery(val)));
+    $resultItems = $('.search-result__item'); activeIndex = 0;
+    $resultItems.eq(0).addClass('active');
+  }
+
+  search.clear = clear;
+  search.onInputNotEmpty = onInputNotEmpty;
+
+  function updateResultItems() {
+    lastActiveIndex >= 0 && $resultItems.eq(lastActiveIndex).removeClass('active');
+    activeIndex >= 0 && $resultItems.eq(activeIndex).addClass('active');
+  }
+
+  function moveActiveIndex(direction) {
+    var itemsCount = $resultItems ? $resultItems.length : 0;
+    if (itemsCount > 1) {
+      lastActiveIndex = activeIndex;
+      if (direction === 'up') {
+        activeIndex = (activeIndex - 1 + itemsCount) % itemsCount;
+      } else if (direction === 'down') {
+        activeIndex = (activeIndex + 1 + itemsCount) % itemsCount;
+      }
+      updateResultItems();
+    }
+  }
+
+  // Char Code: 13  Enter, 37  ⬅, 38  ⬆, 39  ➡, 40  ⬇
+  $(window).on('keyup', function(e) {
+    var modalVisible = search.getModalVisible && search.getModalVisible();
+    if (modalVisible) {
+      if (e.which === 38) {
+        modalVisible && moveActiveIndex('up');
+      } else if (e.which === 40) {
+        modalVisible && moveActiveIndex('down');
+      } else if (e.which === 13) {
+        modalVisible && $resultItems && activeIndex >= 0 && $resultItems.eq(activeIndex).children('a')[0].click();
+      }
+    }
+  });
+
+  $result.on('mouseover', '.search-result__item > a', function() {
+    var itemIndex = $(this).parent().data('index');
+    itemIndex >= 0 && (lastActiveIndex = activeIndex, activeIndex = itemIndex, updateResultItems());
+  });
+});
+</script>
+</div></div>
+
+
+<script>(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function scrollToAnchor(anchor, duration, callback) {
+      var $root = this;
+      $root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
+        window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
+        callback && callback();
+      });
+    }
+    $.fn.scrollToAnchor = scrollToAnchor;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function affix(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroll,
+        offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
+        rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
+        hasInit = false, curState;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.offsetBottom && (offsetBottom = _options.offsetBottom);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroll && (scroll = _options.scroll);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $scrollTarget = $(scrollTarget);
+        isOverallScroller = window.isOverallScroller($scrollTarget[0]);
+        $scroll = $(scroll);
+      }
+      function preCalc() {
+        top();
+        rootHeight = $root.outerHeight();
+        rootTop = $root.offset().top + (isOverallScroller ? 0 :  $scrollTarget.scrollTop());
+        rootLeft = $root.offset().left;
+      }
+      function calc(needPreCalc) {
+        needPreCalc && preCalc();
+        scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
+        rootBottomTop = scrollBottom - rootTop;
+      }
+      function top() {
+        if (curState !== 'top') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: 0
+          });
+          curState = 'top';
+        }
+      }
+      function fixed() {
+        if (curState !== 'fixed') {
+          $root.addClass('fixed').css({
+            left: rootLeft + 'px',
+            top: 0
+          });
+          curState = 'fixed';
+        }
+      }
+      function bottom() {
+        if (curState !== 'bottom') {
+          $root.removeClass('fixed').css({
+            left: 0,
+            top: rootBottomTop + 'px'
+          });
+          curState = 'bottom';
+        }
+      }
+      function setState() {
+        var scrollTop = $scrollTarget.scrollTop();
+        if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
+          fixed();
+        } else if (scrollTop < rootTop) {
+          top();
+        } else {
+          bottom();
+        }
+      }
+      function init() {
+        if(!hasInit) {
+          var interval, timeout;
+          calc(true); setState();
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState();
+          });
+          $window.on('resize', function() {
+            disabled || (calc(true), setState());
+          });
+          hasInit = true;
+        }
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions,
+        refresh: function() {
+          calc(true, { animation: false }); setState();
+        }
+      };
+    }
+    $.fn.affix = affix;
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    function toc(options) {
+      var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
+        selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
+        headingsPos, scrolling = false, hasRendered = false, hasInit = false;
+
+      function setOptions(options) {
+        var _options = options || {};
+        _options.selectors && (selectors = _options.selectors);
+        _options.container && (container = _options.container);
+        _options.scrollTarget && (scrollTarget = _options.scrollTarget);
+        _options.scroller && (scroller = _options.scroller);
+        _options.disabled !== undefined && (disabled = _options.disabled);
+        $headings = $(container).find(selectors).filter('[id]');
+        $scrollTarget = $(scrollTarget);
+        $scroller = $(scroller);
+      }
+      function calc() {
+        headingsPos = [];
+        $headings.each(function() {
+          headingsPos.push(Math.floor($(this).position().top));
+        });
+      }
+      function setState(element, disabled) {
+        var scrollTop = $scrollTarget.scrollTop(), i;
+        if (disabled || !headingsPos || headingsPos.length < 1) { return; }
+        if (element) {
+          $activeCur = element;
+        } else {
+          for (i = 0; i < headingsPos.length; i++) {
+            if (scrollTop >= headingsPos[i]) {
+              $activeCur = $tocLi.eq(i);
+            } else {
+              $activeCur || ($activeCur = $tocLi.eq(i));
+              break;
+            }
+          }
+        }
+        $activeLast && $activeLast.removeClass('active');
+        ($activeLast = $activeCur).addClass('active');
+      }
+      function render() {
+        if(!hasRendered) {
+          $root.append($tocUl);
+          $headings.each(function() {
+            var $this = $(this);
+            $tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
+              .append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
+          });
+          $tocLi = $tocUl.children('li');
+          $tocUl.on('click', 'a', function(e) {
+            e.preventDefault();
+            var $this = $(this);
+            scrolling = true;
+            setState($this.parent());
+            $scroller.scrollToAnchor($this.attr('href'), 400, function() {
+              scrolling = false;
+            });
+          });
+        }
+        hasRendered = true;
+      }
+      function init() {
+        var interval, timeout;
+        if(!hasInit) {
+          render(); calc(); setState(null, scrolling);
+          // run calc every 100 millisecond
+          interval = setInterval(function() {
+            calc();
+          }, 100);
+          timeout = setTimeout(function() {
+            clearInterval(interval);
+          }, 45000);
+          window.pageLoad.then(function() {
+            setTimeout(function() {
+              clearInterval(interval);
+              clearTimeout(timeout);
+            }, 3000);
+          });
+          $scrollTarget.on('scroll', function() {
+            disabled || setState(null, scrolling);
+          });
+          $window.on('resize', window.throttle(function() {
+            if (!disabled) {
+              render(); calc(); setState(null, scrolling);
+            }
+          }, 100));
+        }
+        hasInit = true;
+      }
+
+      setOptions(options);
+      if (!disabled) {
+        init();
+      }
+      $window.on('resize', window.throttle(function() {
+        init();
+      }, 200));
+      return {
+        setOptions: setOptions
+      };
+    }
+    $.fn.toc = toc;
+  });
+})();
+/*(function () {
+
+})();*/
+</script><script>
+  /* toc must before affix, since affix need to konw toc' height. */(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window);
+    var $articleContent = $('.js-article-content');
+    var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
+    var toc;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+    var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
+
+    function disabled() {
+      return $col2.css('display') === 'none' || !hasToc;
+    }
+
+    tocDisabled = disabled();
+
+    toc = $tocRoot.toc({
+      selectors: TOC_SELECTOR,
+      container: $articleContent,
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      tocDisabled = disabled();
+      toc && toc.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+  });
+})();
+(function() {
+  var SOURCES = window.TEXT_VARIABLES.sources;
+  window.Lazyload.js(SOURCES.jquery, function() {
+    var $window = $(window), $pageFooter = $('.js-page-footer');
+    var $pageAside = $('.js-page-aside');
+    var affix;
+    var tocDisabled = false;
+    var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
+
+    affix = $pageAside.affix({
+      offsetBottom: $pageFooter.outerHeight(),
+      scrollTarget: hasSidebar ? '.js-page-main' : null,
+      scroller: hasSidebar ? '.js-page-main' : null,
+      scroll: hasSidebar ? $('.js-page-main').children() : null,
+      disabled: tocDisabled
+    });
+
+    $window.on('resize', window.throttle(function() {
+      affix && affix.setOptions({
+        disabled: tocDisabled
+      });
+    }, 100));
+
+    window.pageAsideAffix = affix;
+  });
+})();
+</script>
+    </div>
+    <script>(function () {
+  var $root = document.getElementsByClassName('root')[0];
+  if (window.hasEvent('touchstart')) {
+    $root.dataset.isTouch = true;
+    document.addEventListener('touchstart', function(){}, false);
+  }
+})();
+</script>
+  </body>
+</html>
+
diff --git a/_site/robots.txt b/_site/robots.txt
index afa65a2..d297064 100644
--- a/_site/robots.txt
+++ b/_site/robots.txt
@@ -1 +1 @@
-Sitemap: https://codersherlock.github.com//sitemap.xml
+Sitemap: http://localhost:4000/sitemap.xml
diff --git a/_site/sitemap.xml b/_site/sitemap.xml
index e2b65b3..f954a14 100644
--- a/_site/sitemap.xml
+++ b/_site/sitemap.xml
@@ -1,62 +1,56 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
 <url>
-<loc>https://codersherlock.github.com//archivers/hello</loc>
+<loc>http://localhost:4000/posts/welcome-to-my-blog</loc>
 <lastmod>2016-10-26T22:50:33-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//archivers/charles-is-not-a-good-tool</loc>
+<loc>http://localhost:4000/posts/charles-is-not-a-good-tool</loc>
 <lastmod>2016-10-27T22:50:33-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//archivers/some-of-my-previews-exper-work</loc>
+<loc>http://localhost:4000/posts/some-of-my-previews-exper-work</loc>
 <lastmod>2016-10-28T12:27:33-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//archivers/intro-xv6</loc>
+<loc>http://localhost:4000/posts/intro-xv6</loc>
 <lastmod>2017-07-28T14:56:55-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//archivers/generate-word-cloud-with-chinese-fenci</loc>
+<loc>http://localhost:4000/posts/generate-word-cloud-with-chinese-fenci</loc>
 <lastmod>2020-09-15T22:00:14-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//archivers/eddl-how-do-we-train-on-limited-edge-devices</loc>
+<loc>http://localhost:4000/posts/eddl-how-do-we-train-on-limited-edge-devices</loc>
 <lastmod>2021-10-13T16:53:20-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//about/</loc>
+<loc>http://localhost:4000/about.html</loc>
 </url>
 <url>
-<loc>https://codersherlock.github.com//category/</loc>
+<loc>http://localhost:4000/archive</loc>
 </url>
 <url>
-<loc>https://codersherlock.github.com//</loc>
+<loc>http://localhost:4000/</loc>
 </url>
 <url>
-<loc>https://codersherlock.github.com//timeline/</loc>
-</url>
-<url>
-<loc>https://codersherlock.github.com//page2/</loc>
-</url>
-<url>
-<loc>https://codersherlock.github.com//static/2017-07/eps_poster.pdf</loc>
+<loc>http://localhost:4000/static/2017-07/eps_poster.pdf</loc>
 <lastmod>2018-08-29T16:16:03-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//static/2017-07/p163-hao.pdf</loc>
+<loc>http://localhost:4000/static/2017-07/p163-hao.pdf</loc>
 <lastmod>2018-08-29T16:16:03-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//static/2017-07/p169-zhang.pdf</loc>
+<loc>http://localhost:4000/static/2017-07/p169-zhang.pdf</loc>
 <lastmod>2018-08-29T16:16:03-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//static/2018-02/a7-hao.pdf</loc>
+<loc>http://localhost:4000/static/2018-02/a7-hao.pdf</loc>
 <lastmod>2018-08-29T16:16:03-04:00</lastmod>
 </url>
 <url>
-<loc>https://codersherlock.github.com//static/2021-10/eta-infocom18.pdf</loc>
+<loc>http://localhost:4000/static/2021-10/eta-infocom18.pdf</loc>
 <lastmod>2021-10-12T16:53:06-04:00</lastmod>
 </url>
 </urlset>
diff --git a/_site/timeline/index.html b/_site/timeline/index.html
deleted file mode 100644
index 1380cc0..0000000
--- a/_site/timeline/index.html
+++ /dev/null
@@ -1,247 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-  <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>About - Timeline « Stop Talking, Start Doing</title>
-  <meta name="description" content="My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
-">
-
-  <link rel="stylesheet" href="/css/main.css">
-  <link rel="stylesheet" href="/css/timeline.css">
-  <link rel="canonical" href="https://codersherlock.github.com//timeline/">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine">
-  <link rel="alternate" type="application/rss+xml" title="Stop Talking, Start Doing" href="https://codersherlock.github.com//feed.xml" />
-  <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-82637164-1', 'auto');
-    ga('send', 'pageview');
-
-  </script>
-  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-  <script>
-    (adsbygoogle = window.adsbygoogle || []).push({
-      google_ad_client: "ca-pub-6651321038908478",
-      enable_page_level_ads: true
-    });
-  </script>
-</head>
-
-
-  <body>
-
-    <header class="header">
-  <div class="wrapper">
-    <a class="site-title" href="/">Stop Talking, Start Doing</a>
-    <nav class="site-nav">
-      
-        
-      
-        
-        <a class="page-link" href="/about/">About</a>
-        
-      
-        
-        <a class="page-link" href="/category/">Category</a>
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-        
-      
-    </nav>
-  </div>
-</header>
-
-    <div class="page-content">
-      <div class="wrapper">
-        <div class="col-main">
-          <div class="post">
-
-  <header class="post-header">
-    <h1 class="post-title">About - Timeline</h1>
-  </header>
-
-  <article class="post-content">
-    <div class="timeline">
-
-<div class="timeline__group">
-	<span class="timeline__year">Now</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">21</span>
-			<span clas="timeline__month">Aug</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<p>Look up at the Starry Sky</p>
-			<audio controls=""><source src="/static/2018-09/beihang.mp3" type="audio/mpeg" /></audio>
-			<img src="http://www.fsaona.com/images/imagesbigimg.jpg" height="auto" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2011</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">10</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Transfered to another high school</p> -->
-			<img src="http://school.zhongkao.com/style/school/pictures/school/734/73421/logo.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2010</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened high school</p> -->
-			<img src="http://www.fuzhong.sd.cn/uploadfile/2015/0704/20150704044140866.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2008</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened middle school</p> -->
-			<img src="https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike72%2C5%2C5%2C72%2C24/sign=5bc3fe5949540923be646b2cf331ba6c/3812b31bb051f819506a0330dab44aed2e73e779.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2005</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened primary school</p> -->
-			<img src="http://www.sdsdfx.com:85/fxjylm/u/cms/www/201510/27194804xvgc.jpg" height="250" />
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">1999</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">26</span>
-			<span class="timeline__month">Aug</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<p> Borned in <a href="https://en.wikipedia.org/wiki/Jinan">Jinan</a>, <a href="https://en.wikipedia.org/wiki/Shandong">Shandong Province</a>, China </p>
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">1993</span>
-</div>
-
-</div>
-
-  </article>
-
-  
-
-
-</div>
-
-        </div>
-        <div class="col-second">
-          <div class="col-box col-box-author">
-  <img class="avatar" src="/static/avatar.jpg" alt="Pengzhan Hao">
-  <div class="col-box-title name">Pengzhan Hao</div>
-  <p></p>
-  <p class="contact">
-    
-    <a href="https://github.com/codersherlock">GitHub</a>
-    
-    
-    
-    <a href="mailto:haopengzhan@gmail.com">Email</a>
-    
-  </p>
-</div>
-
-<div class="col-box">
-  <div class="col-box-title">Newest Posts</div>
-  <ul class="post-list">
-    
-      <li><a class="post-link" href="/archivers/eddl-how-do-we-train-on-limited-edge-devices">EDDL: How do we train neural networks on limited edge devices - PART 1</a></li>
-    
-      <li><a class="post-link" href="/archivers/generate-word-cloud-with-chinese-fenci">Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries</a></li>
-    
-      <li><a class="post-link" href="/archivers/intro-xv6">Xv6 introduction</a></li>
-    
-      <li><a class="post-link" href="/archivers/some-of-my-previews-exper-work">Some of my previews experiment works: 2016</a></li>
-    
-      <li><a class="post-link" href="/archivers/charles-is-not-a-good-tool">Using charles proxy to monitor mobile SSL traffics</a></li>
-    
-  </ul>
-</div>
-
-<div class="col-box post-toc hide">
-  <div class="col-box-title">Indexes</div>
-</div>
-        </div>
-      </div>
-    </div>
-
-    <footer class="footer">
-<div class="wrapper">
-&copy; 2016 Pengzhan Hao
-</div>
-</footer>
-
-<script src="/js/easybook.js"></script>
-
-  </body>
-
-</html>
diff --git a/about.md b/about.md
index 4c7366a..64d4faa 100644
--- a/about.md
+++ b/about.md
@@ -1,9 +1,10 @@
 ---
-layout: page
+layout: article
 title: About
-permalink: /about/
-public: true
-nocomments: true
+permalink: /about.html
+comment: false
+toc: true
+
 ---
 
 # Pengzhan Hao
diff --git a/archive.html b/archive.html
new file mode 100644
index 0000000..89dc810
--- /dev/null
+++ b/archive.html
@@ -0,0 +1,3 @@
+---
+layout: archive
+---
diff --git a/assets/android-chrome-192x192.png b/assets/android-chrome-192x192.png
new file mode 100644
index 0000000..91cdd01
Binary files /dev/null and b/assets/android-chrome-192x192.png differ
diff --git a/assets/android-chrome-512x512.png b/assets/android-chrome-512x512.png
new file mode 100644
index 0000000..5c072f9
Binary files /dev/null and b/assets/android-chrome-512x512.png differ
diff --git a/assets/apple-touch-icon.png b/assets/apple-touch-icon.png
new file mode 100644
index 0000000..fe848f4
Binary files /dev/null and b/assets/apple-touch-icon.png differ
diff --git a/assets/browserconfig.xml b/assets/browserconfig.xml
new file mode 100644
index 0000000..86a2869
--- /dev/null
+++ b/assets/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+    <msapplication>
+        <tile>
+            <square150x150logo src="assets/mstile-150x150.png"/>
+            <TileColor>#b91d47</TileColor>
+        </tile>
+    </msapplication>
+</browserconfig>
diff --git a/assets/css/main.scss b/assets/css/main.scss
new file mode 100644
index 0000000..8b4a9c1
--- /dev/null
+++ b/assets/css/main.scss
@@ -0,0 +1,74 @@
+---
+# Only the main Sass file needs front matter (the dashes are enough)
+---
+
+@import
+
+    "skins/{{ site.text_skin | default: site.data.variables.default.text_skin }}",
+    // "skins/chocolate",
+    // "skins/dark",
+    // "skins/default",
+    // "skins/forest",
+    // "skins/ocean",
+    // "skins/orange",
+
+    "skins/highlight/{{ site.highlight_theme | default: site.data.variables.default.highlight_theme }}",
+    // "skins/highlight/tomorrow",
+    // "skins/highlight/tomorrow-night",
+    // "skins/highlight/tomorrow-night-eighties",
+    // "skins/highlight/tomorrow-night-blue",
+    // "skins/highlight/tomorrow-night-bright",
+
+
+    "common/variables",
+    "common/function",
+    "common/classes",
+    "common/reset",
+    "common/print",
+    "common/components/button",
+    "common/components/image",
+    "common/components/card",
+    "common/components/gallery",
+    "common/components/hero",
+    "common/components/menu",
+    "common/components/modal",
+    "common/components/toc",
+    "common/components/item",
+    "common/components/swiper",
+
+    "animate/fade-in",
+    "animate/fade-in-down",
+    "animate/fade-in-up",
+
+    "components/main",
+    "components/header",
+    "components/footer",
+    "components/article-list",
+    "components/article-info",
+    "components/article-header",
+    "components/article-content",
+    "components/article-footer",
+    "components/author-links",
+    "components/author-profile",
+    "components/tags",
+    "components/search",
+    "components/lightbox",
+    "components/extensions",
+
+
+    "additional/alert",
+    "additional/tag",
+    "additional/photo-frame",
+
+    "layout/base",
+    "layout/page",
+
+    "layout/article",
+    "layout/articles",
+    "layout/archive",
+    "layout/home",
+    "layout/landing",
+    "layout/404",
+
+    "custom"
+;
diff --git a/assets/favicon-16x16.png b/assets/favicon-16x16.png
new file mode 100644
index 0000000..7477a30
Binary files /dev/null and b/assets/favicon-16x16.png differ
diff --git a/assets/favicon-32x32.png b/assets/favicon-32x32.png
new file mode 100644
index 0000000..7a61023
Binary files /dev/null and b/assets/favicon-32x32.png differ
diff --git a/assets/favicon.ico b/assets/favicon.ico
new file mode 100644
index 0000000..6f48a2d
Binary files /dev/null and b/assets/favicon.ico differ
diff --git a/assets/images/logo/logo.svg b/assets/images/logo/logo.svg
new file mode 100644
index 0000000..5ad04a6
--- /dev/null
+++ b/assets/images/logo/logo.svg
@@ -0,0 +1,8 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="24px" viewBox="0 0 24 24">
+<style type="text/css">
+	.st0{fill:#515151;}
+</style>
+<path class="st0" d="M1.7,22.3c5.7-5.7,11.3-5.7,17,0c3.3-3.3,3.5-5.3,0.8-6c2.7,0.7,3.5-1.1,2.3-5.6s-3.3-5.2-6.3-2.1
+	c3-3,2.3-5.2-2.1-6.3S7,1.8,7.7,4.6C7,1.8,5,2.1,1.7,5.3C7.3,11,7.3,16.7,1.7,22.3"/>
+</svg>
\ No newline at end of file
diff --git a/assets/mstile-144x144.png b/assets/mstile-144x144.png
new file mode 100644
index 0000000..1eddae6
Binary files /dev/null and b/assets/mstile-144x144.png differ
diff --git a/assets/mstile-150x150.png b/assets/mstile-150x150.png
new file mode 100644
index 0000000..1e3579a
Binary files /dev/null and b/assets/mstile-150x150.png differ
diff --git a/assets/mstile-310x150.png b/assets/mstile-310x150.png
new file mode 100644
index 0000000..e364ead
Binary files /dev/null and b/assets/mstile-310x150.png differ
diff --git a/assets/mstile-310x310.png b/assets/mstile-310x310.png
new file mode 100644
index 0000000..1e4181b
Binary files /dev/null and b/assets/mstile-310x310.png differ
diff --git a/assets/mstile-70x70.png b/assets/mstile-70x70.png
new file mode 100644
index 0000000..2ed5c66
Binary files /dev/null and b/assets/mstile-70x70.png differ
diff --git a/assets/safari-pinned-tab.svg b/assets/safari-pinned-tab.svg
new file mode 100644
index 0000000..f300623
--- /dev/null
+++ b/assets/safari-pinned-tab.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+</metadata>
+<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M2735 6469 c-98 -14 -126 -21 -178 -38 -188 -66 -289 -166 -332 -327
+-15 -58 -22 -232 -11 -284 3 -14 8 -41 11 -60 5 -32 4 -31 -10 10 -31 86 -104
+227 -143 277 -51 64 -127 119 -199 144 -69 25 -189 31 -255 13 -27 -7 -48 -11
+-48 -9 0 2 -33 -8 -72 -22 -193 -67 -452 -232 -702 -446 -27 -23 -60 -51 -73
+-62 -14 -11 -70 -63 -126 -116 l-101 -96 66 -69 c90 -94 114 -121 178 -194 30
+-35 60 -68 66 -74 5 -6 53 -65 105 -131 374 -471 603 -905 724 -1370 33 -127
+37 -148 56 -270 24 -157 33 -457 17 -620 -54 -579 -307 -1149 -767 -1729 -98
+-125 -114 -144 -196 -235 -54 -59 -60 -66 -120 -132 l-40 -44 50 46 c76 71
+104 96 175 158 36 31 70 61 76 66 14 13 72 60 154 125 36 28 73 57 83 65 9 8
+21 15 26 15 5 0 11 3 13 8 14 34 381 264 578 362 167 84 435 191 518 206 13 3
+42 11 65 18 23 8 56 17 72 20 17 4 41 9 55 12 81 16 185 33 245 39 39 4 81 8
+95 11 32 5 334 5 380 -1 19 -2 58 -7 86 -10 29 -3 62 -8 75 -10 13 -3 44 -8
+69 -11 25 -3 53 -8 62 -10 10 -3 29 -7 42 -10 113 -20 342 -93 501 -159 112
+-46 346 -164 406 -205 24 -16 48 -30 52 -30 20 0 346 -230 487 -343 173 -139
+259 -215 403 -355 l99 -96 102 104 c55 58 128 136 161 174 33 37 65 73 70 80
+32 36 129 163 181 236 301 423 344 745 130 953 -63 61 -216 145 -326 180 -8 2
+-1 2 15 0 284 -42 449 -5 574 129 105 111 163 330 155 588 -3 110 -13 245 -19
+275 -5 23 -14 82 -21 140 -3 22 -14 81 -24 130 -11 50 -21 101 -24 115 -6 36
+-75 311 -85 340 -5 14 -19 59 -31 100 -24 82 -74 227 -95 275 -7 17 -26 62
+-43 100 -147 339 -345 550 -573 610 -263 70 -586 -69 -944 -404 -57 -54 -54
+-41 5 19 35 35 140 171 186 240 109 162 183 332 199 455 7 51 8 158 2 185 -2
+8 -7 33 -12 55 -28 141 -168 324 -330 430 -47 31 -213 125 -221 125 -2 0 -32
+13 -66 29 -134 61 -322 122 -543 178 -33 8 -67 16 -75 18 -25 7 -303 65 -330
+70 -14 2 -45 7 -70 10 -25 3 -70 10 -100 15 -30 5 -80 12 -110 16 -79 9 -396
+12 -455 3z"/>
+</g>
+</svg>
diff --git a/assets/search.js b/assets/search.js
new file mode 100644
index 0000000..8a03d39
--- /dev/null
+++ b/assets/search.js
@@ -0,0 +1,3 @@
+---
+---
+{%- include search-providers/default/search-data.js -%}
diff --git a/assets/site.webmanifest b/assets/site.webmanifest
new file mode 100644
index 0000000..2b120c4
--- /dev/null
+++ b/assets/site.webmanifest
@@ -0,0 +1,19 @@
+{
+    "name": "TeXt Theme",
+    "short_name": "TeXt Theme",
+    "icons": [
+        {
+            "src": "android-chrome-192x192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+        },
+        {
+            "src": "android-chrome-512x512.png",
+            "sizes": "512x512",
+            "type": "image/png"
+        }
+    ],
+    "theme_color": "#ffffff",
+    "background_color": "#ffffff",
+    "display": "standalone"
+}
diff --git a/category.html b/category.html
deleted file mode 100644
index da5f57d..0000000
--- a/category.html
+++ /dev/null
@@ -1,27 +0,0 @@
----
-layout: default
-title: Category
-permalink: /category/
-public: true
----
-
-<div class="home">
-  <h1 class="page-heading">Category</h1>
-
-  <ul class="post-list">
-
-{% capture categories %}{% for category in site.categories %}{{ category | first }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
-{% assign category = categories | split:',' | sort %}
-{% for item in (0..site.categories.size) %}{% unless forloop.last %}
-{% capture word %}{{ category[item] | strip_newlines }}{% endcapture %}
-<h2 class="category" id="{{ word }}">{{ word | upcase }}</h2>
-<ul>
-{% for post in site.categories[word] %}{% if post.title != null %}
-<li><span>{{ post.date | date: "%b %-d, %Y" }}</span> » <a href="{{ site.baseurl}}{{ post.url }}">{{ post.title }}</a></li>
-{% endif %}{% endfor %}
-</ul>
-{% endunless %}{% endfor %}
-
-  </ul>
-  
-</div>
diff --git a/css/main.scss b/css/main.scss
deleted file mode 100755
index 9ffdefc..0000000
--- a/css/main.scss
+++ /dev/null
@@ -1,42 +0,0 @@
----
-# Only the main Sass file needs front matter (the dashes are enough)
----
-@charset "utf-8";
-
-$base-font-family: "Arial";// "Times New Roman", "DejaVu Sans Mono", "PingFang SC", "DejaVu Sans", "Open Sans", "Helvetica Neue", Arial, "Noto Sans CJK SC", "Hiragino Sans GB", "微软雅黑",  Helvetica, sans-serif;
-$base-font-size:   15px;
-$small-font-size:  $base-font-size;
-$base-line-height: 1.35;
-
-$code-font-family:   "Courier New"; //Menlo, Monaco, Consolas, "DejaVu Sans Mono", "Liberation Mono", "文泉驿等宽微米黑", "Courier New", Courier, SimSun, monospace;
-$code-font-size:     12px;
-
-// Width of the content area
-$content-width:    800px;
-
-$on-palm:          600px;
-$on-laptop:        800px;
-
-$color-link: rgb(0, 0, 0);
-$color-link-hover: rgb(0, 35, 53);
-
-$header-bg: rgba(0, 0, 0, 1);
-$header-bg-hover: rgb(0, 0, 0);
-$header-link: rgb(255, 255, 255);
-$header-fg: rgb(255, 255, 255);
-
-@mixin media-query($device) {
-    @media screen and (max-width: $device) {
-        @content;
-    }
-}
-
-
-
-// Import partials from `sass_dir` (defaults to `_sass`)
-@import
-        "base",
-        "layout",
-        "syntax-highlighting",
-        "easybook"
-;
diff --git a/css/timeline.css b/css/timeline.css
deleted file mode 100644
index 114ff73..0000000
--- a/css/timeline.css
+++ /dev/null
@@ -1,235 +0,0 @@
-.timeline{
-  --uiTimelineMainColor: var(--timelineMainColor, #35008a);
-  --uiTimelineSecondaryColor: var(--timelineSecondaryColor, #fff);
-  --uiTimelineDateColor: var(--timelineYearColor, #1470ff);
-
-  position: relative;
-  /* padding-top: 3rem; */
-  /* padding-bottom: 3rem; */
-}
-
-.timeline:before{
-  content: "";
-  width: 4px;
-  height: 100%;
-  background-color: var(--uiTimelineMainColor);
-
-  position: absolute;
-  top: 0;
-}
-
-.timeline__group{
-  position: relative;
-}
-
-.timeline__group:not(:first-of-type){
-  margin-top: 2rem;
-}
-
-.timeline__group:last-of-type{
-  margin-bottom: 0rem;
-}
-
-.timeline__year{
-  padding: .5rem 1.5rem;
-  color: var(--uiTimelineSecondaryColor);
-  background-color: var(--uiTimelineMainColor);
-
-  position: absolute;
-  left: 0;
-  bottom: 0;
-}
-
-.timeline__box{
-  position: relative;
-  bottom: 6rem;
-}
-
-.timeline__box:not(:last-of-type){
-  margin-bottom: 30px;
-}
-
-.timeline__box:before{
-  content: "";
-  /* width: 100%; */
-  width: auto;
-  height: 2px;
-  background-color: var(--uiTimelineMainColor);
-
-  position: absolute;
-  left: 0;
-  z-index: -1;
-}
-
-.timeline__date{
-  min-width: 65px;
-  position: absolute;
-  left: 0;
-
-  box-sizing: border-box;
-  padding: .5rem 1.5rem;
-  text-align: center;
-
-  background-color: var(--uiTimelineDateColor);
-  color: var(--uiTimelineSecondaryColor);
-}
-
-.timeline__day{
-  font-size: 2rem;
-  font-weight: 700;
-  display: block;
-}
-
-.timeline__month{
-  display: block;
-  font-size: .8em;
-  text-transform: uppercase;
-}
-
-.timeline__post{
-  padding: 1.5rem 1rem 1.5rem 1rem;
-  border-radius: 2px;
-  border-left: 3px solid var(--uiTimelineMainColor);
-  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 1px 2px 0 rgba(0, 0, 0, .24);
-  background-color: var(--uiTimelineSecondaryColor);
-  display: inline-block;
-}
-
-@media screen and (min-width: 641px){
-
-  .timeline:before{
-	left: 30px;
-  }
-
-  .timeline__group{
-	padding-top: 55px;
-  }
-
-  .timeline__box{
-	padding-left: 80px;
-  }
-
-  .timeline__box:before{
-    top: 50%;
-    transform: translateY(-50%);  
-  }  
-
-  .timeline__date{
-    top: 50%;
-    margin-top: -27px;
-  }
-}
-
-@media screen and (max-width: 640px){
-
-  .timeline:before{
-    left: 0;
-  }
-
-  .timeline__group{
-    padding-top: 40px;
-  }
-
-  .timeline__box{
-    padding-left: 20px;
-    padding-top: 70px;
-  }
-
-  .timeline__box:before{
-    top: 90px;
-  }    
-
-  .timeline__date{
-    top: 0;
-  }
-}
-
-.timeline{
-  --timelineMainColor: #4557bb;
-  font-size: 16px;
-}
-
-@media screen and (min-width: 768px){
-
-  html{
-    font-size: 62.5%;
-  }
-}
-
-@media screen and (max-width: 767px){
-
-  html{
-    font-size: 55%;
-  }
-}
-
-/*
-* demo page
-*/
-
-@media screen and (min-width: 768px){
-
-  html{
-    font-size: 62.5%;
-  }
-}
-
-@media screen and (max-width: 767px){
-
-  html{
-    font-size: 50%;
-  }
-}
-
-.page{
-  min-height: 100vh;
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-}
-
-.page__demo{
-  flex-grow: 1;
-}
-
-.main-container{
-  max-width: 960px;
-  padding-left: 2rem;
-  padding-right: 2rem;
-
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.page__container{
-  padding-top: 30px;
-  padding-bottom: 30px;
-  max-width: 800px;
-}
-
-.footer{
-  padding-top: 1rem;
-  padding-bottom: 1rem;
-  text-align: center;  
-  font-size: 1.4rem;
-}
-
-.footer__link{
-  text-decoration: none;
-  color: inherit;
-}
-
-@media screen and (min-width: 361px){
-
-  .footer__container{
-    display: flex;
-    justify-content: space-between;
-  }
-}
-
-@media screen and (max-width: 360px){
-
-  .melnik909{
-    display: none;
-  } 
-}
diff --git a/feed.xml b/feed.xml
deleted file mode 100644
index a6628bd..0000000
--- a/feed.xml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-layout: null
----
-<?xml version="1.0" encoding="UTF-8"?>
-<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
-  <channel>
-    <title>{{ site.title | xml_escape }}</title>
-    <description>{{ site.description | xml_escape }}</description>
-    <link>{{ site.url }}{{ site.baseurl }}/</link>
-    <atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml"/>
-    <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
-    <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
-    <generator>Jekyll v{{ jekyll.version }}</generator>
-    {% for post in site.posts limit:10 %}
-      <item>
-        <title>{{ post.title | xml_escape }}</title>
-        <description>{{ post.content | xml_escape }}</description>
-        <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
-        <link>{{ post.url | prepend: site.baseurl | prepend: site.url }}</link>
-        <guid isPermaLink="true">{{ post.url | prepend: site.baseurl | prepend: site.url }}</guid>
-        {% for tag in post.tags %}
-        <category>{{ tag | xml_escape }}</category>
-        {% endfor %}
-        {% for cat in post.categories %}
-        <category>{{ cat | xml_escape }}</category>
-        {% endfor %}
-      </item>
-    {% endfor %}
-  </channel>
-</rss>
diff --git a/index.html b/index.html
index f5dbb4e..989857f 100644
--- a/index.html
+++ b/index.html
@@ -1,43 +1,5 @@
 ---
-layout: default
+layout: home
+# articles:
+#   excerpt_type: html
 ---
-
-<div class="home">
-  <a class="rss-link" href="{{ "/feed.xml" | prepend: site.baseurl }}">RSS Feed</a>
-  <h1 class="page-heading">Articles</h1>
-
-  <ul class="post-list">
-    {% for post in paginator.posts %}
-      <li>
-        <h2>
-          <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
-        </h2>
-        
-        <div class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</div>
-
-        <div class="post-excerpt">
-          {{ post.excerpt }}
-          <p>
-            <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">Read More &raquo;</a>
-          </p>
-        </div>
-      </li>
-    {% endfor %}
-  </ul>
-  
-  <!-- Pagination links -->
-<div class="pagination">
-  {% if paginator.previous_page %}
-    <a href="{{ paginator.previous_page_path | prepend: site.baseurl }}" class="previous">PREV</a>
-  {% else %}
-    <span class="previous">PREV</span>
-  {% endif %}
-  <span class="page_number ">{{ paginator.page }} of {{ paginator.total_pages }}</span>
-  {% if paginator.next_page %}
-    <a href="{{ paginator.next_page_path | prepend: site.baseurl }}" class="next">NEXT</a>
-  {% else %}
-    <span class="next ">NEXT</span>
-  {% endif %}
-</div>
-
-</div>
diff --git a/jekyll-text-theme.gemspec b/jekyll-text-theme.gemspec
new file mode 100644
index 0000000..cc47579
--- /dev/null
+++ b/jekyll-text-theme.gemspec
@@ -0,0 +1,27 @@
+# coding: utf-8
+
+Gem::Specification.new do |spec|
+  spec.name          = "jekyll-text-theme"
+  spec.version       = "2.2.6"
+  spec.authors       = ["Tian Qi"]
+  spec.email         = ["kitian616@outlook.com"]
+
+  spec.summary       = %q{A super customizable Jekyll theme for personal site, team site, blog, project, documentation, etc.}
+  spec.homepage      = "https://github.com/kitian616/jekyll-TeXt-theme"
+  spec.license       = "MIT"
+
+  spec.metadata["plugin_type"] = "theme"
+
+  spec.files         = `git ls-files -z`.split("\x0").select do |f|
+    f.match(%r{^((_data|_includes|_layouts|_sass|assets)/|(LICENSE|README|CHANGELOG)((\.(txt|md|markdown)|$)))}i)
+  end
+
+  spec.add_runtime_dependency "jekyll", ">= 3.6", "< 5.0"
+  spec.add_runtime_dependency "jekyll-paginate", "~> 1.1"
+  spec.add_runtime_dependency "jekyll-sitemap", "~> 1.0"
+  spec.add_runtime_dependency "jekyll-feed", "~> 0.1"
+  spec.add_runtime_dependency "jemoji", "~> 0.8"
+
+  spec.add_development_dependency "bundler"
+  spec.add_development_dependency "rake", "~> 10.0"
+end
diff --git a/js/easybook.js b/js/easybook.js
deleted file mode 100644
index 5007703..0000000
--- a/js/easybook.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/*!
- * EasyBook Jekyll Theme Javascript
- * 
- * http://laobubu.github.io/jekyll-theme-EasyBook
- * https://github.com/laobubu/jekyll-theme-EasyBook
- *
- * This is just a extension for my theme.
- */
-
-function TOCize(toc, content, matchHeightTo) {
-    if (!(toc && content && matchHeightTo)) return false
-    
-    var cnt = 0;
-    
-    var make = function(tag) {
-        return document.createElement(tag)
-    }
-    
-    var aniscroll = {
-        to: function(top) {
-            aniscroll.target = top;
-            if (aniscroll.running) return;
-            aniscroll.running = setInterval(aniscroll.tick, 20);
-        },
-        target: 0,
-        running: 0,
-        getTop: function() {
-            return window.scrollY || window.pageYOffset || document.documentElement.scrollTop;
-        },
-        setTop: function(value) {
-            (window['scrollTo'] && window.scrollTo(window.scrollX, value))
-        },
-        tick: function() {
-            var oldST = aniscroll.getTop(), newST = ~~((oldST + aniscroll.target) / 2);
-            aniscroll.setTop(newST);
-            if (aniscroll.getTop() < newST || Math.abs(newST - aniscroll.target) < 10) {
-                aniscroll.setTop(aniscroll.target);
-                clearInterval(aniscroll.running)
-                aniscroll.running = 0
-            }
-        }
-    }
-    
-    function scrollToHeader(header, hash, ev) {
-        var y = header.getBoundingClientRect().top + aniscroll.getTop();
-        if (window.history['pushState']) {
-            window.history.pushState({}, header.textContent, "#" + hash);
-            aniscroll.to(y);
-            ev.preventDefault();
-        } else {
-            var y2 = aniscroll.getTop();
-            setTimeout(function() {
-                aniscroll.setTop(y2);
-                aniscroll.to(y);
-            }, 0);
-        }
-    }
-    
-    var generateLink = function(h) {
-        var q = make('a');
-        cnt++;
-        var hash = h.getAttribute('id');
-        if (!hash) {
-            hash = ('generated-hash-' + cnt);
-            h.setAttribute('id', hash);
-        }
-        q.textContent = h.textContent;
-        q.setAttribute('href', '#' + hash );
-        q.addEventListener('click', scrollToHeader.bind(this, h, hash), false);
-        return q;
-    };
-    
-    var hs = content.querySelectorAll('h1, h2, h3, h4, h5, h6');
-    var cul = null, plevel = 1;
-    var uls = [make('ul')];
-    for (var i=0;i<hs.length;i++) {
-        var level = +hs[i].tagName.substr(1);
-        var hi = hs[i];
-        var ti = make('li');
-        ti.appendChild(generateLink(hi));
-        if (plevel < level) {
-            do {
-                uls.push(make('ul'));
-                uls[uls.length-2].appendChild(uls[uls.length-1]);
-            } while (++plevel < level);
-        } else if (plevel > level) {
-            do {
-                cul = uls.pop();
-            } while (--plevel > level);
-        }
-        cul = uls[uls.length-1];
-        cul.appendChild(ti);
-    }
-    while(true) {
-        var chs = uls[0].children;
-        if (chs.length == 1 && chs[0].tagName == 'UL')
-            uls.shift();
-        else
-            break;
-    }
-    
-    if (!cnt) return false;
-    
-    var scrolldummy=make('div');
-    toc.appendChild(scrolldummy);
-    toc.appendChild(uls[0]);
-    toc.style.display = 'block';
-    
-    var maxHeightTOC = '';
-    var ppc = document.querySelector('.col-main');
-    var s1 = function(){
-        var scrollTop=aniscroll.getTop(), dummyClientTop=scrolldummy.getBoundingClientRect().top,
-            margin = 10,c,d; // c = dummyHeight, d = TOC.maxHeight (+'px')
-        if ((c = -dummyClientTop + margin) < 0) c = 0;
-        if (c) {
-            var wh = window.innerHeight
-                || document.documentElement.clientHeight
-                || document.body.clientHeight,
-            cbox = matchHeightTo.getBoundingClientRect(),
-            vq = cbox.bottom - dummyClientTop - uls[0].offsetHeight;
-            if (c>vq) c=vq;
-            d = (wh - (margin<<1)) + 'px';
-        } else {
-            d = "";
-        }
-        if (d != maxHeightTOC) { //status lock.
-            maxHeightTOC = d;
-            if (d) {
-                uls[0].setAttribute('style', 'max-height:' + d + '; width:' + (toc.offsetWidth-20) + "px" );
-            } else {
-                uls[0].setAttribute("style","");
-            }
-        }
-        scrolldummy.style.height = (c+'px');
-    };
-    window.addEventListener('scroll', s1, false);
-    window.addEventListener('resize', s1, false);
-}
-
-function SelectAllize(selector,tips) {
-    if (!window.getSelection) return null;
-    
-    var obj = document.querySelectorAll(selector);
-    var selection=window.getSelection();
-    var z = document.createElement("div");
-    z.className = "util-notify1";
-    z.textContent = tips;
-    document.body.appendChild(z)
-    
-    function hide() {
-        z.classList.add('hidden')
-        z.style.top = '-200px'
-    }
-    
-    hide();
-    z.addEventListener('mouseover', hide, false);
-    
-    function clickHandler(e){
-        if (!selection.isCollapsed) return;
-        
-        var tt = e.pageY-z.offsetHeight - 15;
-        z.setAttribute('style', 'left:' + (e.pageX-z.offsetWidth/2) + 'px;top:' + (tt+10) + 'px');
-        z.classList.remove('hidden');
-        setTimeout(hide, 1000);
-    }
-    
-    function dblClickHandler(e){
-        selection.selectAllChildren(this);
-        hide();
-    }
-    
-    for(var i = obj.length; i--;) {
-        var oi = obj[i];
-        oi.addEventListener('click', clickHandler, false);
-        oi.addEventListener('dblclick', dblClickHandler, false);
-    }
-    
-    return true;
-}
-
-function RealLoad(){
-    TOCize(
-        document.querySelector('.post-toc'), 
-        document.querySelector('.post-content'), 
-        document.querySelector('.col-main')
-    );
-    
-    SelectAllize("pre.highlight", "Dblclick to select all");
-    
-    var imgs = document.querySelectorAll('.post-content > p > img');
-    for(var i=imgs.length; i--;){
-        if (imgs[i].parentElement.childNodes.length === 1) {
-            imgs[i].classList.add('middle-image');
-        }
-    }
-}
-
-RealLoad();
diff --git a/js/html5shiv.js b/js/html5shiv.js
deleted file mode 100644
index 77dace4..0000000
--- a/js/html5shiv.js
+++ /dev/null
@@ -1,322 +0,0 @@
-/**
-* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
-*/
-;(function(window, document) {
-/*jshint evil:true */
-  /** version */
-  var version = '3.7.2';
-
-  /** Preset options */
-  var options = window.html5 || {};
-
-  /** Used to skip problem elements */
-  var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
-
-  /** Not all elements can be cloned in IE **/
-  var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
-
-  /** Detect whether the browser supports default html5 styles */
-  var supportsHtml5Styles;
-
-  /** Name of the expando, to work with multiple documents or to re-shiv one document */
-  var expando = '_html5shiv';
-
-  /** The id for the the documents expando */
-  var expanID = 0;
-
-  /** Cached data for each document */
-  var expandoData = {};
-
-  /** Detect whether the browser supports unknown elements */
-  var supportsUnknownElements;
-
-  (function() {
-    try {
-        var a = document.createElement('a');
-        a.innerHTML = '<xyz></xyz>';
-        //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
-        supportsHtml5Styles = ('hidden' in a);
-
-        supportsUnknownElements = a.childNodes.length == 1 || (function() {
-          // assign a false positive if unable to shiv
-          (document.createElement)('a');
-          var frag = document.createDocumentFragment();
-          return (
-            typeof frag.cloneNode == 'undefined' ||
-            typeof frag.createDocumentFragment == 'undefined' ||
-            typeof frag.createElement == 'undefined'
-          );
-        }());
-    } catch(e) {
-      // assign a false positive if detection fails => unable to shiv
-      supportsHtml5Styles = true;
-      supportsUnknownElements = true;
-    }
-
-  }());
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Creates a style sheet with the given CSS text and adds it to the document.
-   * @private
-   * @param {Document} ownerDocument The document.
-   * @param {String} cssText The CSS text.
-   * @returns {StyleSheet} The style element.
-   */
-  function addStyleSheet(ownerDocument, cssText) {
-    var p = ownerDocument.createElement('p'),
-        parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
-
-    p.innerHTML = 'x<style>' + cssText + '</style>';
-    return parent.insertBefore(p.lastChild, parent.firstChild);
-  }
-
-  /**
-   * Returns the value of `html5.elements` as an array.
-   * @private
-   * @returns {Array} An array of shived element node names.
-   */
-  function getElements() {
-    var elements = html5.elements;
-    return typeof elements == 'string' ? elements.split(' ') : elements;
-  }
-
-  /**
-   * Extends the built-in list of html5 elements
-   * @memberOf html5
-   * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
-   * @param {Document} ownerDocument The context document.
-   */
-  function addElements(newElements, ownerDocument) {
-    var elements = html5.elements;
-    if(typeof elements != 'string'){
-      elements = elements.join(' ');
-    }
-    if(typeof newElements != 'string'){
-      newElements = newElements.join(' ');
-    }
-    html5.elements = elements +' '+ newElements;
-    shivDocument(ownerDocument);
-  }
-
-   /**
-   * Returns the data associated to the given document
-   * @private
-   * @param {Document} ownerDocument The document.
-   * @returns {Object} An object of data.
-   */
-  function getExpandoData(ownerDocument) {
-    var data = expandoData[ownerDocument[expando]];
-    if (!data) {
-        data = {};
-        expanID++;
-        ownerDocument[expando] = expanID;
-        expandoData[expanID] = data;
-    }
-    return data;
-  }
-
-  /**
-   * returns a shived element for the given nodeName and document
-   * @memberOf html5
-   * @param {String} nodeName name of the element
-   * @param {Document} ownerDocument The context document.
-   * @returns {Object} The shived element.
-   */
-  function createElement(nodeName, ownerDocument, data){
-    if (!ownerDocument) {
-        ownerDocument = document;
-    }
-    if(supportsUnknownElements){
-        return ownerDocument.createElement(nodeName);
-    }
-    if (!data) {
-        data = getExpandoData(ownerDocument);
-    }
-    var node;
-
-    if (data.cache[nodeName]) {
-        node = data.cache[nodeName].cloneNode();
-    } else if (saveClones.test(nodeName)) {
-        node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
-    } else {
-        node = data.createElem(nodeName);
-    }
-
-    // Avoid adding some elements to fragments in IE < 9 because
-    // * Attributes like `name` or `type` cannot be set/changed once an element
-    //   is inserted into a document/fragment
-    // * Link elements with `src` attributes that are inaccessible, as with
-    //   a 403 response, will cause the tab/window to crash
-    // * Script elements appended to fragments will execute when their `src`
-    //   or `text` property is set
-    return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
-  }
-
-  /**
-   * returns a shived DocumentFragment for the given document
-   * @memberOf html5
-   * @param {Document} ownerDocument The context document.
-   * @returns {Object} The shived DocumentFragment.
-   */
-  function createDocumentFragment(ownerDocument, data){
-    if (!ownerDocument) {
-        ownerDocument = document;
-    }
-    if(supportsUnknownElements){
-        return ownerDocument.createDocumentFragment();
-    }
-    data = data || getExpandoData(ownerDocument);
-    var clone = data.frag.cloneNode(),
-        i = 0,
-        elems = getElements(),
-        l = elems.length;
-    for(;i<l;i++){
-        clone.createElement(elems[i]);
-    }
-    return clone;
-  }
-
-  /**
-   * Shivs the `createElement` and `createDocumentFragment` methods of the document.
-   * @private
-   * @param {Document|DocumentFragment} ownerDocument The document.
-   * @param {Object} data of the document.
-   */
-  function shivMethods(ownerDocument, data) {
-    if (!data.cache) {
-        data.cache = {};
-        data.createElem = ownerDocument.createElement;
-        data.createFrag = ownerDocument.createDocumentFragment;
-        data.frag = data.createFrag();
-    }
-
-
-    ownerDocument.createElement = function(nodeName) {
-      //abort shiv
-      if (!html5.shivMethods) {
-          return data.createElem(nodeName);
-      }
-      return createElement(nodeName, ownerDocument, data);
-    };
-
-    ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
-      'var n=f.cloneNode(),c=n.createElement;' +
-      'h.shivMethods&&(' +
-        // unroll the `createElement` calls
-        getElements().join().replace(/[\w\-:]+/g, function(nodeName) {
-          data.createElem(nodeName);
-          data.frag.createElement(nodeName);
-          return 'c("' + nodeName + '")';
-        }) +
-      ');return n}'
-    )(html5, data.frag);
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Shivs the given document.
-   * @memberOf html5
-   * @param {Document} ownerDocument The document to shiv.
-   * @returns {Document} The shived document.
-   */
-  function shivDocument(ownerDocument) {
-    if (!ownerDocument) {
-        ownerDocument = document;
-    }
-    var data = getExpandoData(ownerDocument);
-
-    if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
-      data.hasCSS = !!addStyleSheet(ownerDocument,
-        // corrects block display not defined in IE6/7/8/9
-        'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
-        // adds styling not present in IE6/7/8/9
-        'mark{background:#FF0;color:#000}' +
-        // hides non-rendered elements
-        'template{display:none}'
-      );
-    }
-    if (!supportsUnknownElements) {
-      shivMethods(ownerDocument, data);
-    }
-    return ownerDocument;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * The `html5` object is exposed so that more elements can be shived and
-   * existing shiving can be detected on iframes.
-   * @type Object
-   * @example
-   *
-   * // options can be changed before the script is included
-   * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
-   */
-  var html5 = {
-
-    /**
-     * An array or space separated string of node names of the elements to shiv.
-     * @memberOf html5
-     * @type Array|String
-     */
-    'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',
-
-    /**
-     * current version of html5shiv
-     */
-    'version': version,
-
-    /**
-     * A flag to indicate that the HTML5 style sheet should be inserted.
-     * @memberOf html5
-     * @type Boolean
-     */
-    'shivCSS': (options.shivCSS !== false),
-
-    /**
-     * Is equal to true if a browser supports creating unknown/HTML5 elements
-     * @memberOf html5
-     * @type boolean
-     */
-    'supportsUnknownElements': supportsUnknownElements,
-
-    /**
-     * A flag to indicate that the document's `createElement` and `createDocumentFragment`
-     * methods should be overwritten.
-     * @memberOf html5
-     * @type Boolean
-     */
-    'shivMethods': (options.shivMethods !== false),
-
-    /**
-     * A string to describe the type of `html5` object ("default" or "default print").
-     * @memberOf html5
-     * @type String
-     */
-    'type': 'default',
-
-    // shivs the document according to the specified `html5` object options
-    'shivDocument': shivDocument,
-
-    //creates a shived element
-    createElement: createElement,
-
-    //creates a shived documentFragment
-    createDocumentFragment: createDocumentFragment,
-
-    //extends list of elements
-    addElements: addElements
-  };
-
-  /*--------------------------------------------------------------------------*/
-
-  // expose html5
-  window.html5 = html5;
-
-  // shiv the document
-  shivDocument(document);
-
-}(this, document));
diff --git a/js/respond.js b/js/respond.js
deleted file mode 100644
index 58883e4..0000000
--- a/js/respond.js
+++ /dev/null
@@ -1,353 +0,0 @@
-/* Respond.js: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs  */
-(function( w ){
-
-	"use strict";
-
-	//exposed namespace
-	var respond = {};
-	w.respond = respond;
-
-	//define update even in native-mq-supporting browsers, to avoid errors
-	respond.update = function(){};
-
-	//define ajax obj
-	var requestQueue = [],
-		xmlHttp = (function() {
-			var xmlhttpmethod = false;
-			try {
-				xmlhttpmethod = new w.XMLHttpRequest();
-			}
-			catch( e ){
-				xmlhttpmethod = new w.ActiveXObject( "Microsoft.XMLHTTP" );
-			}
-			return function(){
-				return xmlhttpmethod;
-			};
-		})(),
-
-		//tweaked Ajax functions from Quirksmode
-		ajax = function( url, callback ) {
-			var req = xmlHttp();
-			if (!req){
-				return;
-			}
-			req.open( "GET", url, true );
-			req.onreadystatechange = function () {
-				if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){
-					return;
-				}
-				callback( req.responseText );
-			};
-			if ( req.readyState === 4 ){
-				return;
-			}
-			req.send( null );
-		},
-		isUnsupportedMediaQuery = function( query ) {
-			return query.replace( respond.regex.minmaxwh, '' ).match( respond.regex.other );
-		};
-
-	//expose for testing
-	respond.ajax = ajax;
-	respond.queue = requestQueue;
-	respond.unsupportedmq = isUnsupportedMediaQuery;
-	respond.regex = {
-		media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
-		keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
-		comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,
-		urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
-		findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
-		only: /(only\s+)?([a-zA-Z]+)\s?/,
-		minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
-		maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
-		minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,
-		other: /\([^\)]*\)/g
-	};
-
-	//expose media query support flag for external use
-	respond.mediaQueriesSupported = w.matchMedia && w.matchMedia( "only all" ) !== null && w.matchMedia( "only all" ).matches;
-
-	//if media queries are supported, exit here
-	if( respond.mediaQueriesSupported ){
-		return;
-	}
-
-	//define vars
-	var doc = w.document,
-		docElem = doc.documentElement,
-		mediastyles = [],
-		rules = [],
-		appendedEls = [],
-		parsedSheets = {},
-		resizeThrottle = 30,
-		head = doc.getElementsByTagName( "head" )[0] || docElem,
-		base = doc.getElementsByTagName( "base" )[0],
-		links = head.getElementsByTagName( "link" ),
-
-		lastCall,
-		resizeDefer,
-
-		//cached container for 1em value, populated the first time it's needed
-		eminpx,
-
-		// returns the value of 1em in pixels
-		getEmValue = function() {
-			var ret,
-				div = doc.createElement('div'),
-				body = doc.body,
-				originalHTMLFontSize = docElem.style.fontSize,
-				originalBodyFontSize = body && body.style.fontSize,
-				fakeUsed = false;
-
-			div.style.cssText = "position:absolute;font-size:1em;width:1em";
-
-			if( !body ){
-				body = fakeUsed = doc.createElement( "body" );
-				body.style.background = "none";
-			}
-
-			// 1em in a media query is the value of the default font size of the browser
-			// reset docElem and body to ensure the correct value is returned
-			docElem.style.fontSize = "100%";
-			body.style.fontSize = "100%";
-
-			body.appendChild( div );
-
-			if( fakeUsed ){
-				docElem.insertBefore( body, docElem.firstChild );
-			}
-
-			ret = div.offsetWidth;
-
-			if( fakeUsed ){
-				docElem.removeChild( body );
-			}
-			else {
-				body.removeChild( div );
-			}
-
-			// restore the original values
-			docElem.style.fontSize = originalHTMLFontSize;
-			if( originalBodyFontSize ) {
-				body.style.fontSize = originalBodyFontSize;
-			}
-
-
-			//also update eminpx before returning
-			ret = eminpx = parseFloat(ret);
-
-			return ret;
-		},
-
-		//enable/disable styles
-		applyMedia = function( fromResize ){
-			var name = "clientWidth",
-				docElemProp = docElem[ name ],
-				currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
-				styleBlocks	= {},
-				lastLink = links[ links.length-1 ],
-				now = (new Date()).getTime();
-
-			//throttle resize calls
-			if( fromResize && lastCall && now - lastCall < resizeThrottle ){
-				w.clearTimeout( resizeDefer );
-				resizeDefer = w.setTimeout( applyMedia, resizeThrottle );
-				return;
-			}
-			else {
-				lastCall = now;
-			}
-
-			for( var i in mediastyles ){
-				if( mediastyles.hasOwnProperty( i ) ){
-					var thisstyle = mediastyles[ i ],
-						min = thisstyle.minw,
-						max = thisstyle.maxw,
-						minnull = min === null,
-						maxnull = max === null,
-						em = "em";
-
-					if( !!min ){
-						min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
-					}
-					if( !!max ){
-						max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
-					}
-
-					// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
-					if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
-						if( !styleBlocks[ thisstyle.media ] ){
-							styleBlocks[ thisstyle.media ] = [];
-						}
-						styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
-					}
-				}
-			}
-
-			//remove any existing respond style element(s)
-			for( var j in appendedEls ){
-				if( appendedEls.hasOwnProperty( j ) ){
-					if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){
-						head.removeChild( appendedEls[ j ] );
-					}
-				}
-			}
-			appendedEls.length = 0;
-
-			//inject active styles, grouped by media type
-			for( var k in styleBlocks ){
-				if( styleBlocks.hasOwnProperty( k ) ){
-					var ss = doc.createElement( "style" ),
-						css = styleBlocks[ k ].join( "\n" );
-
-					ss.type = "text/css";
-					ss.media = k;
-
-					//originally, ss was appended to a documentFragment and sheets were appended in bulk.
-					//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
-					head.insertBefore( ss, lastLink.nextSibling );
-
-					if ( ss.styleSheet ){
-						ss.styleSheet.cssText = css;
-					}
-					else {
-						ss.appendChild( doc.createTextNode( css ) );
-					}
-
-					//push to appendedEls to track for later removal
-					appendedEls.push( ss );
-				}
-			}
-		},
-		//find media blocks in css text, convert to style blocks
-		translate = function( styles, href, media ){
-			var qs = styles.replace( respond.regex.comments, '' )
-					.replace( respond.regex.keyframes, '' )
-					.match( respond.regex.media ),
-				ql = qs && qs.length || 0;
-
-			//try to get CSS path
-			href = href.substring( 0, href.lastIndexOf( "/" ) );
-
-			var repUrls = function( css ){
-					return css.replace( respond.regex.urls, "$1" + href + "$2$3" );
-				},
-				useMedia = !ql && media;
-
-			//if path exists, tack on trailing slash
-			if( href.length ){ href += "/"; }
-
-			//if no internal queries exist, but media attr does, use that
-			//note: this currently lacks support for situations where a media attr is specified on a link AND
-				//its associated stylesheet has internal CSS media queries.
-				//In those cases, the media attribute will currently be ignored.
-			if( useMedia ){
-				ql = 1;
-			}
-
-			for( var i = 0; i < ql; i++ ){
-				var fullq, thisq, eachq, eql;
-
-				//media attr
-				if( useMedia ){
-					fullq = media;
-					rules.push( repUrls( styles ) );
-				}
-				//parse for styles
-				else{
-					fullq = qs[ i ].match( respond.regex.findStyles ) && RegExp.$1;
-					rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
-				}
-
-				eachq = fullq.split( "," );
-				eql = eachq.length;
-
-				for( var j = 0; j < eql; j++ ){
-					thisq = eachq[ j ];
-
-					if( isUnsupportedMediaQuery( thisq ) ) {
-						continue;
-					}
-
-					mediastyles.push( {
-						media : thisq.split( "(" )[ 0 ].match( respond.regex.only ) && RegExp.$2 || "all",
-						rules : rules.length - 1,
-						hasquery : thisq.indexOf("(") > -1,
-						minw : thisq.match( respond.regex.minw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ),
-						maxw : thisq.match( respond.regex.maxw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
-					} );
-				}
-			}
-
-			applyMedia();
-		},
-
-		//recurse through request queue, get css text
-		makeRequests = function(){
-			if( requestQueue.length ){
-				var thisRequest = requestQueue.shift();
-
-				ajax( thisRequest.href, function( styles ){
-					translate( styles, thisRequest.href, thisRequest.media );
-					parsedSheets[ thisRequest.href ] = true;
-
-					// by wrapping recursive function call in setTimeout
-					// we prevent "Stack overflow" error in IE7
-					w.setTimeout(function(){ makeRequests(); },0);
-				} );
-			}
-		},
-
-		//loop stylesheets, send text content to translate
-		ripCSS = function(){
-
-			for( var i = 0; i < links.length; i++ ){
-				var sheet = links[ i ],
-				href = sheet.href,
-				media = sheet.media,
-				isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
-
-				//only links plz and prevent re-parsing
-				if( !!href && isCSS && !parsedSheets[ href ] ){
-					// selectivizr exposes css through the rawCssText expando
-					if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
-						translate( sheet.styleSheet.rawCssText, href, media );
-						parsedSheets[ href ] = true;
-					} else {
-						if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) ||
-							href.replace( RegExp.$1, "" ).split( "/" )[0] === w.location.host ){
-							// IE7 doesn't handle urls that start with '//' for ajax request
-							// manually add in the protocol
-							if ( href.substring(0,2) === "//" ) { href = w.location.protocol + href; }
-							requestQueue.push( {
-								href: href,
-								media: media
-							} );
-						}
-					}
-				}
-			}
-			makeRequests();
-		};
-
-	//translate CSS
-	ripCSS();
-
-	//expose update for re-running respond later on
-	respond.update = ripCSS;
-
-	//expose getEmValue
-	respond.getEmValue = getEmValue;
-
-	//adjust on resize
-	function callMedia(){
-		applyMedia( true );
-	}
-
-	if( w.addEventListener ){
-		w.addEventListener( "resize", callMedia, false );
-	}
-	else if( w.attachEvent ){
-		w.attachEvent( "onresize", callMedia );
-	}
-})(this);
diff --git a/timeline.md b/timeline.md
deleted file mode 100644
index 9bb3cfc..0000000
--- a/timeline.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-layout: page
-title: About - Timeline
-permalink: /timeline/
-public: false
-nocomments: true
----
-
-<div class="timeline">
-
-<div class="timeline__group">
-	<span class="timeline__year">Now</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">21</span>
-			<span clas="timeline__month">Aug</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<p>Look up at the Starry Sky</p>
-			<audio controls><source src="/static/2018-09/beihang.mp3" type="audio/mpeg"></audio>
-			<img src="http://www.fsaona.com/images/imagesbigimg.jpg" height="auto">
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2011</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">10</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Transfered to another high school</p> -->
-			<img src="http://school.zhongkao.com/style/school/pictures/school/734/73421/logo.jpg" height="250">
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2010</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened high school</p> -->
-			<img src="http://www.fuzhong.sd.cn/uploadfile/2015/0704/20150704044140866.jpg" height="250">
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2008</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened middle school</p> -->
-			<img src="https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike72%2C5%2C5%2C72%2C24/sign=5bc3fe5949540923be646b2cf331ba6c/3812b31bb051f819506a0330dab44aed2e73e779.jpg" height="250">
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">2005</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">1</span>
-			<span clas="timeline__month">Sept</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<!-- <p> Attened primary school</p> -->
-			<img src="http://www.sdsdfx.com:85/fxjylm/u/cms/www/201510/27194804xvgc.jpg" height="250">
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">1999</span>
-</div>
-
-<div class="timeline__group">
-	<div class="timeline__box">
-		<div class="timeline__date">
-			<span class="timeline__day">26</span>
-			<span class="timeline__month">Aug</span>
-		</div>
-		<div class="timeline__post">
-			<div class="timeline__content">
-			<p> Borned in <a href="https://en.wikipedia.org/wiki/Jinan">Jinan</a>, <a href="https://en.wikipedia.org/wiki/Shandong">Shandong Province</a>, China </p>
-			</div>
-		</div>
-	</div>
-	<span class="timeline__year">1993</span>
-</div>
-
-</div>
