From 8412b9857727f48f7db881fa9f4d794828b0385e Mon Sep 17 00:00:00 2001
From: CyC2018 <36260787+CyC2018@users.noreply.github.com>
Date: Wed, 28 Oct 2026 01:42:39 +0800
Subject: [PATCH] Add standalone site builder using repository images (#1473)
---
website/.gitignore | 16 +
website/README.md | 44 ++
website/builder/build.py | 228 ++++++++
website/builder/check.py | 80 +++
website/builder/serve.py | 30 ++
website/builder/site_assets.py | 174 ++++++
website/builder/test_search.cjs | 15 +
website/builder/test_site_assets.py | 31 ++
website/builder/verify_updates.py | 84 +++
website/refresh.py | 52 ++
website/requirements.txt | 1 +
website/templates/index.html | 29 +
website/templates/legacy-routes.json | 506 ++++++++++++++++++
website/templates/search.js | 118 ++++
website/templates/site.css | 54 ++
website/templates/site.js | 65 +++
website/templates/vendor/docsify-LICENSE | 21 +
.../vendor/docsify-copy-code-LICENSE | 21 +
.../templates/vendor/docsify-copy-code.min.js | 9 +
website/templates/vendor/docsify.min.js | 1 +
website/templates/vendor/packages.json | 17 +
website/templates/vendor/prism-bash.min.js | 1 +
website/templates/vendor/prism-c.min.js | 1 +
website/templates/vendor/prism-java.min.js | 1 +
website/templates/vendor/prism-json.min.js | 1 +
website/templates/vendor/prism-python.min.js | 1 +
website/templates/vendor/prism-sql.min.js | 1 +
website/templates/vendor/prismjs-LICENSE | 21 +
website/templates/vendor/vue.css | 1 +
website/templates/vendor/zoom-image.min.js | 1 +
30 files changed, 1625 insertions(+)
create mode 100644 website/.gitignore
create mode 100644 website/README.md
create mode 100644 website/builder/build.py
create mode 100644 website/builder/check.py
create mode 100644 website/builder/serve.py
create mode 100644 website/builder/site_assets.py
create mode 100644 website/builder/test_search.cjs
create mode 100644 website/builder/test_site_assets.py
create mode 100644 website/builder/verify_updates.py
create mode 100644 website/refresh.py
create mode 100644 website/requirements.txt
create mode 100644 website/templates/index.html
create mode 100644 website/templates/legacy-routes.json
create mode 100644 website/templates/search.js
create mode 100644 website/templates/site.css
create mode 100644 website/templates/site.js
create mode 100644 website/templates/vendor/docsify-LICENSE
create mode 100644 website/templates/vendor/docsify-copy-code-LICENSE
create mode 100644 website/templates/vendor/docsify-copy-code.min.js
create mode 100644 website/templates/vendor/docsify.min.js
create mode 100644 website/templates/vendor/packages.json
create mode 100644 website/templates/vendor/prism-bash.min.js
create mode 100644 website/templates/vendor/prism-c.min.js
create mode 100644 website/templates/vendor/prism-java.min.js
create mode 100644 website/templates/vendor/prism-json.min.js
create mode 100644 website/templates/vendor/prism-python.min.js
create mode 100644 website/templates/vendor/prism-sql.min.js
create mode 100644 website/templates/vendor/prismjs-LICENSE
create mode 100644 website/templates/vendor/vue.css
create mode 100644 website/templates/vendor/zoom-image.min.js
diff --git a/website/.gitignore b/website/.gitignore
new file mode 100644
index 00000000..6854c1bc
--- /dev/null
+++ b/website/.gitignore
@@ -0,0 +1,16 @@
+/.source-git/
+/upstream/
+/dist/
+/.cache/
+/.snapshot-*/
+/.site-build-*/
+/.update-check-*/
+/source-version.json
+/*-report.json
+/*-validation.json
+/validation.json
+/*.log
+/*.jpg
+/*.png
+__pycache__/
+!/requirements.txt
diff --git a/website/README.md b/website/README.md
new file mode 100644
index 00000000..7c6bca64
--- /dev/null
+++ b/website/README.md
@@ -0,0 +1,44 @@
+# CS-Notes 静态网站构建
+
+只读获取 GitHub 最新 master 的文章和图片,生成可独立部署的静态目录。文章和原图仍由仓库统一维护,构建不下载另一套图床备份,也不向 GitHub 写入数据。
+
+## 生成与预览
+
+需要 Python 3.12+。在仓库根目录运行:
+
+```bash
+python3 -m pip install -r website/requirements.txt
+python3 website/refresh.py
+python3 website/builder/serve.py
+```
+
+打开 http://127.0.0.1:8769/。预览服务只监听本机,只提供 website/dist 中的生成文件。
+
+refresh.py 使用独立浅层 Git 缓存读取最新 master,并生成源码快照。缓存的推送地址已停用。临时目录内完成生成和校验后才替换 website/dist;缺图或站内链接校验失败时保留上一版产物。
+
+源码缓存、upstream、dist、图片优化缓存、版本记录和验证报告均已忽略,不加入提交。
+
+## 图片来源与发布
+
+旧 COS 图片 URL 如果能在当前源码中唯一匹配原文件名,构建时就改用对应仓库文件;同名不唯一或没有匹配时保留原外链。当前内容的 246 个旧图床配图均能匹配,不复制另一套图片到源码中。
+
+生成时只收集页面实际引用的文件。无损 WebP 经逐像素校验,只有能节省至少 10% 才使用;原图仍保留在生成目录,仓库原文件不改动。搜索索引在构建时生成,访客首次搜索只加载一个索引文件。
+
+发布时应把整个 website/dist(或内容位于 ZIP 根目录的压缩包)上传到静态托管,网页和图片一起上传。访客从网站域名读取图片,无需另建 COS/TOS 图床或替换一套对象存储链接。
+
+原文的头像、徽章、许可证图标和 GitHub 附件等 18 个外链继续沿用,依赖原服务可用性。构建生成的是静态文件;目前不包含每日定时配置、腾讯云上传代码或部署凭据。
+
+## 验证
+
+Node.js 22+ 用于搜索与更新回归检查。生成后,在仓库根目录运行:
+
+```bash
+python3 website/builder/check.py
+python3 website/builder/test_site_assets.py
+node website/builder/test_search.cjs
+python3 website/builder/verify_updates.py
+```
+
+verify_updates.py 在临时副本中修改文章、替换配图、新增文章与图片,检查搜索索引更新,并模拟缺图、链接校验失败。测试结束自动清理副本,原始快照不改动。
+
+页面模板保留手机分类导航、折叠目录、搜索和旧文章入口兼容;固定版本的浏览器依赖及许可证保存在 templates/vendor 中。
diff --git a/website/builder/build.py b/website/builder/build.py
new file mode 100644
index 00000000..2229b778
--- /dev/null
+++ b/website/builder/build.py
@@ -0,0 +1,228 @@
+#!/usr/bin/env python3
+"""Build the standalone CS-Notes website from the published Markdown source."""
+from __future__ import annotations
+
+import argparse
+import hashlib
+import html
+import json
+import posixpath
+import re
+import shutil
+import tempfile
+import urllib.parse
+from pathlib import Path
+
+from site_assets import copy_referenced_assets, optimize_images, write_manifest, write_search_index
+from check import check
+
+BASE = Path(__file__).resolve().parents[1]
+ROOT = BASE / 'upstream'
+SITE = BASE / 'templates'
+DIST = BASE / 'dist'
+CACHE = BASE / '.cache/site-assets'
+VERSION_FILE = BASE / 'source-version.json'
+SOURCE_COMMIT = json.loads(VERSION_FILE.read_text())['commit'] if VERSION_FILE.is_file() else 'unknown'
+IMAGE_BY_NAME = {}
+SOURCE_IMAGE_HOST = 'cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com'
+IMAGE = re.compile(r'(
]*?\bsrc=["\'])([^"\']+)(["\'])', re.I)
+MD_IMAGE = re.compile(r'(!\[[^\]]*\]\()((?:[^()\s]|\([^()\n]*\))*)(\))')
+MD_LINK = re.compile(r'(?]*?\bhref=["\'])([^"\']+)(["\'])', re.I)
+
+
+def sources():
+ return [ROOT / 'README.md', ROOT / 'CONTRIBUTING.md',
+ *sorted((ROOT / 'notes').glob('*.md')),
+ *sorted((ROOT / 'assets').glob('*.md'))]
+
+
+def image_urls():
+ found = set()
+ for path in sources():
+ text = re.sub(r'```[^\n]*\n[\s\S]*?```|', '', path.read_text())
+ for pattern in (IMAGE, MD_IMAGE):
+ for match in pattern.finditer(text):
+ url = html.unescape(match[2].strip())
+ if url.startswith(('https://', 'http://')):
+ found.add(url)
+ return sorted(found)
+
+
+def repository_images():
+ result = {}
+ for directory in ('notes/pics', 'assets', 'docs/_media'):
+ for path in (ROOT / directory).rglob('*'):
+ if path.is_file():
+ result.setdefault(path.name, []).append(path)
+ return result
+
+
+def local_target(url, source, html_link=False):
+ url = html.unescape(url)
+ parsed = urllib.parse.urlsplit(url)
+ path = urllib.parse.unquote(parsed.path)
+ if parsed.netloc.lower() in ('github.com', 'www.github.com'):
+ prefix = '/CyC2018/CS-Notes/blob/master/'
+ if path.startswith(prefix):
+ path = path[len(prefix):]
+ else:
+ return url
+ elif parsed.hostname == SOURCE_IMAGE_HOST:
+ candidates = IMAGE_BY_NAME.get(Path(path).name, [])
+ if len(candidates) != 1:
+ return url
+ path = candidates[0].relative_to(ROOT).as_posix()
+ elif parsed.netloc:
+ return url
+ elif not path or url.startswith(('#', 'mailto:', 'data:', '//')):
+ return url
+ elif not path.startswith('/'):
+ path = posixpath.normpath(str(source.relative_to(ROOT).parent / path))
+ path = path.lstrip('/')
+ if not (ROOT / path).resolve().is_relative_to(ROOT.resolve()) or not (ROOT / path).is_file():
+ return url
+ if path.endswith('.md'):
+ if not html_link:
+ result = '/' + urllib.parse.quote(path, safe='/')
+ if parsed.fragment:
+ result += '#' + urllib.parse.quote(urllib.parse.unquote(parsed.fragment), safe='')
+ return result
+ if path == 'README.md':
+ route = '/'
+ else:
+ route = '/' + urllib.parse.quote(path[:-3], safe='/')
+ if parsed.fragment:
+ route += '?id=' + urllib.parse.quote(urllib.parse.unquote(parsed.fragment), safe='')
+ return '/#' + route
+ return '/' + urllib.parse.quote(path, safe='/')
+
+
+def render_markdown(path):
+ content = path.read_text()
+ def image(match):
+ url = html.unescape(match[2].strip())
+ parsed = urllib.parse.urlsplit(url)
+ if parsed.path and not parsed.scheme and not parsed.netloc:
+ candidate = (ROOT / urllib.parse.unquote(parsed.path).lstrip('/')) if parsed.path.startswith('/') else (path.parent / urllib.parse.unquote(parsed.path))
+ if not candidate.resolve().is_relative_to(ROOT.resolve()) or not candidate.is_file():
+ raise ValueError('Missing source image: ' + parsed.path)
+ url = local_target(url, path)
+ return match[1] + url + match[3]
+ def convert(part):
+ part = IMAGE.sub(image, part)
+ part = MD_IMAGE.sub(image, part)
+ part = MD_LINK.sub(lambda m: f'[{m[1]}]({local_target(m[2], path)})', part)
+ return HTML_LINK.sub(lambda m: m[1] + local_target(m[2], path, html_link=True) + m[3], part)
+ parts = re.split(r'(```[^\n]*\n[\s\S]*?```|)', content)
+ return ''.join(part if i % 2 else convert(part) for i, part in enumerate(parts))
+
+
+def build(optimize=True):
+ global IMAGE_BY_NAME
+ IMAGE_BY_NAME = repository_images()
+ external = image_urls()
+ replacements = {url: local_target(url, ROOT / 'README.md') for url in external}
+ reused = {url: path for url, path in replacements.items() if path.startswith('/')}
+ unchanged_external = [url for url, path in replacements.items() if not path.startswith('/')]
+ with tempfile.TemporaryDirectory(prefix='.site-build-', dir=DIST.parent) as temporary:
+ dist = Path(temporary) / 'dist'
+ dist.mkdir()
+ shutil.copytree(SITE / 'vendor', dist / 'vendor')
+ for name in ('index.html', 'site.css', 'site.js', 'search.js'):
+ shutil.copyfile(SITE / name, dist / name)
+ for path in sources():
+ target = dist / path.relative_to(ROOT)
+ target.parent.mkdir(parents=True, exist_ok=True)
+ target.write_text(render_markdown(path))
+ homepage = (dist / 'README.md').read_text()
+ emojis = {'pencil2': '✏️', 'computer': '💻', 'cloud': '☁️', 'floppy_disk': '💾',
+ 'coffee': '☕', 'bulb': '💡', 'art': '🎨', 'wrench': '🔧',
+ 'watermelon': '🍉', 'memo': '📝'}
+ for name, symbol in emojis.items():
+ homepage = re.sub(r'^(## ):' + name + r':\s*', r'\1', homepage, flags=re.M)
+ homepage = homepage.replace('#' + name + '-', '#')
+ homepage = homepage.replace(':' + name + ':', symbol)
+ topics = [('算法', '✏️'), ('操作系统', '💻'), ('网络', '☁️'), ('面向对象', '🎨'),
+ ('数据库', '💾'), ('Java', '☕'), ('系统设计', '💡'), ('工具', '🔧'),
+ ('编码实践', '🍉'), ('后记', '📝')]
+ cards = ''
+ homepage = re.sub(r'^\| 算法[^\n]*\n\|[^\n]*\n\|[^\n]*', cards, homepage, count=1, flags=re.M)
+ homepage = homepage.replace('width="200px"', 'class="site-logo" width="200px"', 1)
+ (dist / 'README.md').write_text('# CS-Notes\n\n' + homepage)
+ note_paths = ['/' + str(p.relative_to(ROOT).with_suffix('')) for p in sorted((ROOT / 'notes').glob('*.md'))]
+ sidebar = ['- [首页](/)', '- [面试高频问题](/notes/面试高频问题)', '']
+ for line in homepage.splitlines():
+ if line.startswith('## '):
+ label = re.sub(r':[a-z0-9_]+:', '', line[3:]).strip()
+ if label == '后记':
+ break
+ sidebar.extend(['', '- **' + label + '**'])
+ elif line.startswith('- ['):
+ sidebar.append(' ' + line)
+ (dist / '_sidebar.md').write_text('\n'.join(sidebar) + '\n')
+ (dist / '_404.md').write_text('# 页面暂未找到\n\n请从目录或搜索查找笔记。\n\n[返回首页](/)\n')
+ (dist / '.nojekyll').touch()
+ shutil.copyfile(ROOT / 'docs/_media/LogoMakr_1J56bI.png', dist / 'favicon.png')
+ copy_referenced_assets(dist, ROOT)
+ image_report = optimize_images(dist, CACHE) if optimize else {'converted': 0}
+ index_name, search_report = write_search_index(dist, sorted((dist / 'notes').glob('*.md')))
+ legacy = json.loads((SITE / 'legacy-routes.json').read_text())
+ (dist / 'search-paths.js').write_text(
+ 'window.CS_NOTES_PATHS = ' + json.dumps(note_paths, ensure_ascii=False) + ';\n'
+ 'window.CS_NOTES_LEGACY_ROUTES = ' + json.dumps(legacy, ensure_ascii=False, separators=(',', ':')) + ';\n'
+ 'window.CS_NOTES_SEARCH_INDEX = "/' + index_name + '";\n')
+ generator = hashlib.sha256()
+ for resource in sorted([*Path(__file__).parent.glob('*.py'), *SITE.rglob('*')]):
+ if resource.is_file():
+ generator.update(resource.relative_to(BASE).as_posix().encode())
+ generator.update(resource.read_bytes())
+ build_info = {'sourceCommit': SOURCE_COMMIT, 'generatorHash': generator.hexdigest(), 'notes': len(note_paths),
+ 'searchIndex': index_name, 'legacyRoutes': len(legacy)}
+ (dist / 'build-info.json').write_text(json.dumps(build_info, indent=2) + '\n')
+ entry = (dist / 'index.html').read_text()
+ for name in ('site.css', 'site.js', 'search.js', 'search-paths.js'):
+ digest = hashlib.sha256((dist / name).read_bytes()).hexdigest()[:12]
+ entry = entry.replace('/' + name + '"', '/' + name + '?v=' + digest + '"')
+ (dist / 'index.html').write_text(entry)
+ write_manifest(dist, build_info)
+ files = [p for p in dist.rglob('*') if p.is_file()]
+ report = {'notes': len(note_paths), 'files': len(files), 'bytes': sum(p.stat().st_size for p in files),
+ 'oversized': [str(p.relative_to(dist)) for p in files if p.stat().st_size > 25*1024*1024],
+ 'repositoryImagesUsedForOldUrls': len(reused), 'externalImages': len(unchanged_external), 'search': search_report, 'images': image_report, 'legacyRoutes': len(legacy)}
+ if report['oversized'] or len(files) > 20000:
+ raise ValueError('Static hosting quota exceeded')
+ validation = check(ROOT, dist)
+ if validation['errors']:
+ raise ValueError('Static site validation failed: ' + '; '.join(validation['errors']))
+ previous = Path(temporary) / 'previous'
+ if DIST.exists():
+ DIST.rename(previous)
+ try:
+ dist.rename(DIST)
+ except BaseException:
+ if previous.exists():
+ previous.rename(DIST)
+ raise
+ report.update({'sourceCommit': SOURCE_COMMIT, 'imageReplacements': reused, 'externalImageUrls': unchanged_external})
+ DIST.with_name(DIST.name + '-report.json').write_text(json.dumps(report, ensure_ascii=False, indent=2) + '\n')
+ print(json.dumps({k: v for k, v in report.items() if k not in ('imageReplacements', 'externalImageUrls')}, ensure_ascii=False, indent=2))
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='仅在本机从最新上游源码生成静态站,不下载图片、不发布。')
+ parser.add_argument('--source', type=Path, default=ROOT)
+ parser.add_argument('--output', type=Path, default=DIST)
+ parser.add_argument('--source-commit', default=SOURCE_COMMIT)
+ parser.add_argument('--no-optimize-images', action='store_true')
+ args = parser.parse_args()
+ ROOT, DIST, SOURCE_COMMIT = args.source.resolve(), args.output.resolve(), args.source_commit
+ if not ROOT.is_dir():
+ parser.error("源码目录不存在,请先运行 website/refresh.py。")
+ if ROOT == DIST or ROOT.is_relative_to(DIST) or DIST.is_relative_to(ROOT):
+ parser.error('源码和输出目录必须相互独立。')
+ if not DIST.is_relative_to(BASE):
+ parser.error('本地验证输出必须保存在当前验证目录中。')
+ build(optimize=not args.no_optimize_images)
diff --git a/website/builder/check.py b/website/builder/check.py
new file mode 100644
index 00000000..12246beb
--- /dev/null
+++ b/website/builder/check.py
@@ -0,0 +1,80 @@
+"""Check only local build output and its provenance in the GitHub snapshot."""
+import argparse
+import hashlib
+import json
+import re
+from pathlib import Path
+from urllib.parse import unquote, urlsplit
+
+BASE = Path(__file__).resolve().parents[1]
+
+
+def check(source, output):
+ manifest = json.loads((output / 'asset-manifest.json').read_text())
+ info = json.loads((output / 'build-info.json').read_text())
+ files = {p.relative_to(output).as_posix(): p for p in output.rglob('*') if p.is_file()}
+ errors = []
+ expected = {item['path']: item for item in manifest['files']}
+ if set(files) != set(expected) | {'asset-manifest.json'}:
+ errors.append('发布文件与清单不一致')
+ for name, record in expected.items():
+ path = output / name
+ if not path.is_file() or path.stat().st_size != record['bytes'] or hashlib.sha256(path.read_bytes()).hexdigest() != record['sha256']:
+ errors.append('文件清单校验失败:' + name)
+ references = 0
+ for document in output.rglob('*.md'):
+ content = re.sub(r'```[^\n]*\n[\s\S]*?```|', '', document.read_text())
+ for match in re.finditer(r'''\]\((/[^\s)]+)\)|(?:src|href)=["'](/[^"']+)''', content):
+ url = match[1] or match[2]
+ if url.startswith(('/#', '//')):
+ continue
+ name = unquote(urlsplit(url).path).lstrip('/')
+ if not name:
+ continue
+ references += 1
+ if name not in files and name + '.md' not in files:
+ errors.append('缺失引用:' + name)
+ for name in re.findall(r'(?:src|href)="(/[^"#]+)"', (output / 'index.html').read_text()):
+ if name.split('?')[0].lstrip('/') not in files:
+ errors.append('缺失页面资源:' + name)
+ forbidden = [name for name in files if set(Path(name).parts) & {
+ '.git', '.cache', 'node_modules', 'builder', 'templates', 'upstream', 'remote',
+ 'tools', 'backups', '__pycache__', 'CLAUDE.md', 'AGENTS.md', '.env',
+ }]
+ if forbidden:
+ errors.append('混入维护文件:' + ', '.join(forbidden))
+ images = 0
+ for name, path in files.items():
+ if name.startswith(('notes/pics/', 'assets/', 'docs/_media/')) and path.suffix.lower() in {'.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico'}:
+ images += 1
+ original = source / name
+ if not original.is_file() or original.read_bytes() != path.read_bytes():
+ errors.append('图片与当前源码不一致:' + name)
+ index = json.loads((output / info['searchIndex']).read_text())
+ note_names = {p.stem for p in (source / 'notes').glob('*.md')}
+ if {Path(doc['path']).name for doc in index['documents']} != note_names:
+ errors.append('搜索索引未覆盖当前全部文章')
+ legacy = json.loads((BASE / 'templates/legacy-routes.json').read_text())
+ for target in legacy.values():
+ if not (output / (target.lstrip('/') + '.md')).is_file():
+ errors.append('旧入口目标缺失:' + target)
+ variants = json.loads((output / 'image-variants.json').read_text()) if (output / 'image-variants.json').exists() else {}
+ for name, variant in variants.items():
+ for path, key in [(output / name.lstrip('/'), 'sourceSha256'), (output / variant['path'].lstrip('/'), 'sha256')]:
+ if not path.is_file() or hashlib.sha256(path.read_bytes()).hexdigest() != variant[key]:
+ errors.append('图片优化清单不一致:' + name)
+ report = {'sourceCommit': info['sourceCommit'], 'notes': len(note_names),
+ 'files': len(files), 'localReferences': references, 'repositoryImages': images,
+ 'imageVariants': len(variants), 'legacyRoutes': len(legacy), 'errors': errors}
+ return report
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--source', type=Path, default=BASE / 'upstream')
+ parser.add_argument('--output', type=Path, default=BASE / 'dist')
+ args = parser.parse_args()
+ result = check(args.source.resolve(), args.output.resolve())
+ print(json.dumps(result, ensure_ascii=False, indent=2))
+ (BASE / 'validation.json').write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n')
+ raise SystemExit(bool(result['errors']))
diff --git a/website/builder/serve.py b/website/builder/serve.py
new file mode 100644
index 00000000..99356213
--- /dev/null
+++ b/website/builder/serve.py
@@ -0,0 +1,30 @@
+"""Serve only generated files on the loopback interface."""
+import argparse
+import functools
+import json
+from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
+from pathlib import Path
+from urllib.parse import unquote, urlsplit
+
+BASE = Path(__file__).resolve().parents[1]
+LEGACY = json.loads((BASE / 'templates/legacy-routes.json').read_text())
+
+
+class Handler(SimpleHTTPRequestHandler):
+ def send_head(self):
+ if unquote(urlsplit(self.path).path) in LEGACY and not Path(self.translate_path(self.path)).exists():
+ self.path = '/index.html'
+ return super().send_head()
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--port', type=int, default=8769)
+args = parser.parse_args()
+server = ThreadingHTTPServer(('127.0.0.1', args.port), functools.partial(Handler, directory=str(BASE / 'dist')))
+print(f'本地预览:http://127.0.0.1:{args.port}/', flush=True)
+try:
+ server.serve_forever()
+except KeyboardInterrupt:
+ pass
+finally:
+ server.server_close()
diff --git a/website/builder/site_assets.py b/website/builder/site_assets.py
new file mode 100644
index 00000000..a659d50b
--- /dev/null
+++ b/website/builder/site_assets.py
@@ -0,0 +1,174 @@
+"""Deterministic search, legacy routes and lossless delivery assets for the site."""
+from __future__ import annotations
+
+import concurrent.futures
+import hashlib
+import gzip
+import html
+import io
+import json
+import re
+import shutil
+import tempfile
+import urllib.parse
+from collections import Counter
+from pathlib import Path
+
+IMAGE_SUFFIXES = {'.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.avif'}
+PUNCTUATION = re.compile(r'''[\u2000-\u206f\u2e00-\u2e7f\\'!"#$%&()*+,./:;<=>?@\[\]^`{|}~]''')
+
+
+def plain_text(text):
+ text = re.sub(r'', '', text)
+ text = re.sub(r'<(?:script|style)\b[^>]*>[\s\S]*?(?:script|style)>', '', text, flags=re.I)
+ text = re.sub(r'<[^>]+>', ' ', text)
+ text = re.sub(r'!\[[^\]]*\]\([^\n]*?\)', ' ', text)
+ text = re.sub(r'\[([^\]]+)\]\([^\n]*?\)', r'\1', text)
+ text = re.sub(r'^\s*```[^\n]*$', '', text, flags=re.M)
+ text = text.replace('`', '').replace('**', '').replace('__', '')
+ return re.sub(r'\s+', ' ', html.unescape(text)).strip()
+
+
+def heading_slug(title, counts):
+ # Match the pinned Docsify 4.13.1 slugger, including numeric and duplicate headings.
+ title = title.replace('{docsify-ignore}', '').replace('{docsify-ignore-all}', '')
+ slug = PUNCTUATION.sub('', re.sub(r'<[^>]+>', '', title.strip()).lower())
+ slug = re.sub(r'-+', '-', re.sub(r'\s', '-', slug))
+ slug = re.sub(r'^(\d)', r'_\1', slug)
+ count = counts[slug]
+ counts[slug] += 1
+ return slug + (f'-{count}' if count else '')
+
+
+def search_document(path, content):
+ counts = Counter()
+ sections = []
+ current = {'title': path.stem, 'id': '', 'text': ''}
+ lines = []
+ fence = None
+
+ def finish():
+ current['text'] = plain_text('\n'.join(lines))
+ if current['text'] or current['title']:
+ sections.append(dict(current))
+ lines.clear()
+
+ for line in re.sub(r'', '', content).splitlines():
+ marker = re.match(r'^\s*(`{3,}|~{3,})', line)
+ if marker:
+ if fence is None:
+ fence = marker[1][0]
+ elif marker[1][0] == fence:
+ fence = None
+ continue
+ heading = re.match(r'^(#{1,6})\s+(.+?)(?:\s+#+)?\s*$', line) if fence is None else None
+ if heading:
+ finish()
+ raw_title = heading[2]
+ current = {'title': plain_text(raw_title), 'id': heading_slug(raw_title, counts), 'text': ''}
+ elif not re.match(r'^\s*[-*+]\s+\[[^]]+\]\(#[^)]*\)\s*$', line):
+ lines.append(line)
+ finish()
+ return {'path': '/notes/' + path.stem, 'title': path.stem, 'sections': sections}
+
+
+def write_search_index(dist, paths):
+ documents = [search_document(path, path.read_text()) for path in paths]
+ data = json.dumps({'version': 1, 'documents': documents}, ensure_ascii=False, separators=(',', ':')).encode()
+ name = 'search-index-' + hashlib.sha256(data).hexdigest()[:16] + '.json'
+ (dist / name).write_bytes(data)
+ return name, {'documents': len(documents), 'sections': sum(len(d['sections']) for d in documents),
+ 'bytes': len(data), 'gzipBytes': len(gzip.compress(data, mtime=0))}
+
+
+def referenced_paths(content):
+ content = re.sub(r'```[^\n]*\n[\s\S]*?```|', '', content)
+ for match in re.finditer(r'''\]\((/[^\s)]+)\)|(?:src|href)=["'](/[^"']+)''', content):
+ url = match[1] or match[2]
+ if url.startswith(('/#', '//')):
+ continue
+ path = urllib.parse.unquote(urllib.parse.urlsplit(url).path).lstrip('/')
+ if path and '..' not in Path(path).parts:
+ yield path
+
+
+def copy_referenced_assets(dist, root):
+ references = set()
+ for doc in dist.rglob('*.md'):
+ references.update(referenced_paths(doc.read_text()))
+ for relative in sorted(references):
+ destination = dist / relative
+ if destination.is_file() or Path(str(destination) + '.md').is_file() or destination.suffix == '.md':
+ continue
+ source = root / relative
+ if not source.resolve().is_relative_to(root.resolve()) or not source.is_file():
+ raise ValueError(f'Missing published resource: {relative}')
+ destination.parent.mkdir(parents=True, exist_ok=True)
+ shutil.copyfile(source, destination)
+
+
+def optimize_images(dist, cache):
+ """Add pixel-identical WebP alternatives; retain each referenced original URL."""
+ from PIL import Image
+ cache.mkdir(parents=True, exist_ok=True)
+ candidates = [p for p in dist.rglob('*') if p.suffix.lower() in {'.png', '.jpg', '.jpeg'} and p.stat().st_size >= 4096]
+
+ def convert(path):
+ original = path.read_bytes()
+ digest = hashlib.sha256(original).hexdigest()
+ cached = cache / (digest + '.webp')
+ with Image.open(io.BytesIO(original)) as image:
+ if getattr(image, 'is_animated', False):
+ return None
+ rgba = image.convert('RGBA')
+ if cached.exists():
+ data = cached.read_bytes()
+ else:
+ stream = io.BytesIO()
+ rgba.save(stream, format='WEBP', lossless=True, exact=True, method=4)
+ data = stream.getvalue()
+ if len(data) >= len(original) * .9:
+ return None
+ with Image.open(io.BytesIO(data)) as decoded:
+ if decoded.convert('RGBA').tobytes() != rgba.tobytes():
+ raise ValueError(f'Lossless image verification failed: {path}')
+ if not cached.exists():
+ with tempfile.NamedTemporaryFile(dir=cache, delete=False) as temporary:
+ temporary.write(data)
+ temporary_path = Path(temporary.name)
+ temporary_path.replace(cached)
+ relative = 'optimized/' + digest[:24] + '.webp'
+ target = dist / relative
+ target.parent.mkdir(parents=True, exist_ok=True)
+ target.write_bytes(data)
+ return '/' + path.relative_to(dist).as_posix(), {
+ 'path': '/' + relative, 'originalBytes': len(original), 'deliveryBytes': len(data),
+ 'width': rgba.width, 'height': rgba.height, 'sourceSha256': digest,
+ 'sha256': hashlib.sha256(data).hexdigest(), 'pixelIdentical': True,
+ }
+
+ mapping = {}
+ with concurrent.futures.ThreadPoolExecutor(max_workers=4) as pool:
+ for result in pool.map(convert, candidates):
+ if result:
+ mapping[result[0]] = result[1]
+ image_pattern = re.compile(r'''(
]*?\bsrc=["'])([^"']+)(["'])|(!\[[^\]]*\]\()([^\s)]+)(\))''', re.I)
+ for path in dist.rglob('*.md'):
+ def replace(match):
+ before, url, after = (match[1], match[2], match[3]) if match[1] else (match[4], match[5], match[6])
+ return before + mapping.get(url, {}).get('path', url) + after
+ parts = re.split(r'(```[^\n]*\n[\s\S]*?```|)', path.read_text())
+ path.write_text(''.join(part if i % 2 else image_pattern.sub(replace, part) for i, part in enumerate(parts)))
+ (dist / 'image-variants.json').write_text(json.dumps(mapping, ensure_ascii=False, indent=2) + '\n')
+ return {'converted': len(mapping), 'originalBytes': sum(v['originalBytes'] for v in mapping.values()),
+ 'deliveryBytes': sum(v['deliveryBytes'] for v in mapping.values()), 'pixelIdentical': True}
+
+
+def write_manifest(dist, build_info):
+ records = []
+ for path in sorted(p for p in dist.rglob('*') if p.is_file() and p.name != 'asset-manifest.json'):
+ data = path.read_bytes()
+ records.append({'path': path.relative_to(dist).as_posix(), 'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()})
+ manifest = {'version': 1, **build_info, 'files': records}
+ (dist / 'asset-manifest.json').write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + '\n')
+ return records
diff --git a/website/builder/test_search.cjs b/website/builder/test_search.cjs
new file mode 100644
index 00000000..d1bee82a
--- /dev/null
+++ b/website/builder/test_search.cjs
@@ -0,0 +1,15 @@
+const assert = require('node:assert/strict');
+const fs = require('node:fs');
+const path = require('node:path');
+const { search } = require('../templates/search.js');
+const dist = process.argv[2] || path.join(__dirname, '../dist');
+const info = JSON.parse(fs.readFileSync(path.join(dist, 'build-info.json')));
+const index = JSON.parse(fs.readFileSync(path.join(dist, info.searchIndex)));
+assert(search(index, '拥塞控制').some(r => r.path.includes('计算机网络 - 传输层') && r.id === 'tcp-拥塞控制'));
+assert(search(index, '检索增强生成').some(r => r.path === '/notes/大模型应用' && r.id === '三、检索增强生成'));
+assert(search(index, 'Token 分词').some(r => r.path === '/notes/大模型应用' && r.id === 'token-与分词'));
+assert.equal(search(index, '').length, 0);
+if (process.argv.includes('--updated')) {
+ assert(search(index, '本地同步验证示例词').some(r => r.id === '本地验证更新'));
+}
+console.log(`搜索与锚点验证通过:${index.documents.length} 篇文章。`);
diff --git a/website/builder/test_site_assets.py b/website/builder/test_site_assets.py
new file mode 100644
index 00000000..0bd598dc
--- /dev/null
+++ b/website/builder/test_site_assets.py
@@ -0,0 +1,31 @@
+"""Regression checks for generated search anchors and asset collection."""
+import sys
+import unittest
+from collections import Counter
+from pathlib import Path
+
+sys.path.insert(0, str(Path(__file__).resolve().parent))
+from site_assets import heading_slug, referenced_paths, search_document
+
+
+class SearchIndexTests(unittest.TestCase):
+ def test_docsify_numeric_duplicate_and_chinese_punctuation(self):
+ counts = Counter()
+ self.assertEqual(heading_slug('1. 慢开始与拥塞避免', counts), '_1-慢开始与拥塞避免')
+ self.assertEqual(heading_slug('三、检索增强生成', counts), '三、检索增强生成')
+ self.assertEqual(heading_slug('TCP 拥塞控制', counts), 'tcp-拥塞控制')
+ self.assertEqual(heading_slug('TCP 拥塞控制', counts), 'tcp-拥塞控制-1')
+
+ def test_headings_in_code_do_not_change_real_anchors(self):
+ doc = search_document(Path('示例.md'), '# 示例\n\n```python\n# TCP 拥塞控制\n```\n\n## TCP 拥塞控制\n慢开始\n')
+ sections = [s for s in doc['sections'] if s['id'] == 'tcp-拥塞控制']
+ self.assertEqual(len(sections), 1)
+ self.assertEqual(sections[0]['text'], '慢开始')
+
+ def test_comments_and_example_asset_urls_are_not_published(self):
+ content = '\n```html\n
\n```\n
\n[正文](/notes/示例.md)\n'
+ self.assertEqual(set(referenced_paths(content)), {'notes/pics/actual.png', 'notes/示例.md'})
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/website/builder/verify_updates.py b/website/builder/verify_updates.py
new file mode 100644
index 00000000..288137d4
--- /dev/null
+++ b/website/builder/verify_updates.py
@@ -0,0 +1,84 @@
+"""Exercise repeat builds, article/image updates, and failed-build preservation locally."""
+import hashlib
+import json
+import shutil
+import subprocess
+import sys
+import tempfile
+from pathlib import Path
+from urllib.parse import unquote
+
+from check import check
+
+BASE = Path(__file__).resolve().parents[1]
+SOURCE = BASE / 'upstream'
+OUTPUT = BASE / 'dist'
+
+
+def digest(path):
+ return hashlib.sha256(path.read_bytes()).hexdigest()
+
+
+def build(source, output, *extra):
+ return subprocess.run([sys.executable, str(BASE / 'builder/build.py'),
+ '--source', str(source), '--output', str(output), *extra], capture_output=True, text=True)
+
+
+first_manifest = digest(OUTPUT / 'asset-manifest.json')
+result = build(SOURCE, OUTPUT)
+assert result.returncode == 0, result.stderr
+assert digest(OUTPUT / 'asset-manifest.json') == first_manifest, '相同输入的两次构建不一致'
+
+report = json.loads((BASE / 'dist-report.json').read_text())
+url, image = next((url, path) for url, path in report['imageReplacements'].items()
+ if path.startswith('/notes/pics/') and path.endswith('.png'))
+image_name = unquote(image).lstrip('/')
+note = next(path for path in (SOURCE / 'notes').glob('*.md') if url in path.read_text())
+note_name = note.relative_to(SOURCE)
+original_note = digest(note)
+original_image = digest(SOURCE / image_name)
+
+with tempfile.TemporaryDirectory(prefix='.update-check-', dir=BASE) as temp:
+ root = Path(temp)
+ source, output = root / 'source', root / 'dist'
+ shutil.copytree(SOURCE, source)
+ with (source / note_name).open('a') as handle:
+ handle.write('\n\n## 本地验证更新\n\n本地同步验证示例词:这是未上传的更新测试。\n')
+ replacement = next(path for path in (SOURCE / 'notes/pics').glob('*.png') if digest(path) != original_image)
+ shutil.copyfile(replacement, source / image_name)
+ shutil.copyfile(replacement, source / 'notes/pics/local-validation-new.png')
+ (source / 'notes/本地新增验证.md').write_text('# 本地新增验证\n\n仅在测试副本中生成。\n\n\n')
+ result = build(source, output, '--no-optimize-images', '--source-commit', 'local-update-check')
+ assert result.returncode == 0, result.stderr
+ assert '本地同步验证示例词' in (output / note_name).read_text()
+ assert digest(output / image_name) == digest(replacement)
+ assert digest(output / image_name) != original_image
+ assert (output / 'notes/本地新增验证.md').is_file()
+ assert (output / 'notes/pics/local-validation-new.png').is_file()
+ validation = check(source, output)
+ assert not validation['errors'], validation['errors']
+ subprocess.run(['node', str(BASE / 'builder/test_search.cjs'), str(output), '--updated'], check=True)
+
+ successful_manifest = digest(output / 'asset-manifest.json')
+ with (source / note_name).open('a') as handle:
+ handle.write('\n\n\n')
+ failed = build(source, output, '--no-optimize-images', '--source-commit', 'local-failure-check')
+ assert failed.returncode != 0, '缺少必须图片时构建应失败'
+ assert digest(output / 'asset-manifest.json') == successful_manifest, '失败的构建覆盖了上次产物'
+
+ text = (source / note_name).read_text()
+ (source / note_name).write_text(text.replace('',
+ '[故障模拟](/notes/local-validation-missing.md)'))
+ failed = build(source, output, '--no-optimize-images', '--source-commit', 'local-link-failure-check')
+ assert failed.returncode != 0, '站内链接校验失败时构建应失败'
+ assert digest(output / 'asset-manifest.json') == successful_manifest, '校验失败覆盖了上次产物'
+
+assert digest(note) == original_note and digest(SOURCE / image_name) == original_image
+result = {'sameInputRebuildIdentical': True, 'articleUpdatePickedUp': True,
+ 'repositoryImageUpdatePickedUp': True, 'newArticleAndImageIncluded': True,
+ 'updatedSearchIndexPassed': True, 'failedBuildPreservesPreviousOutput': True,
+ 'failedValidationPreservesPreviousOutput': True,
+ 'upstreamSnapshotUnchanged': True, 'testFixtureRemoved': True,
+ 'sourceCommit': report['sourceCommit'], 'manifestSha256': first_manifest}
+(BASE / 'update-validation.json').write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n')
+print(json.dumps(result, ensure_ascii=False, indent=2))
diff --git a/website/refresh.py b/website/refresh.py
new file mode 100644
index 00000000..f0601ca8
--- /dev/null
+++ b/website/refresh.py
@@ -0,0 +1,52 @@
+"""Read the latest public master and build locally; no write operation to GitHub or cloud."""
+import json
+import subprocess
+import sys
+import tarfile
+import tempfile
+from pathlib import Path
+
+BASE = Path(__file__).resolve().parent
+CACHE = BASE / '.source-git'
+REPOSITORY = 'https://github.com/CyC2018/CS-Notes.git'
+
+
+def git(*args):
+ return subprocess.check_output(['git', '--git-dir=' + str(CACHE), *args], text=True).strip()
+
+
+if not CACHE.exists():
+ subprocess.run(['git', 'init', '--bare', str(CACHE)], check=True, stdout=subprocess.DEVNULL)
+ git('remote', 'add', 'origin', REPOSITORY)
+ git('config', 'credential.helper', '')
+ git('remote', 'set-url', '--push', 'origin', 'disabled://local-validation-read-only')
+subprocess.run(['git', '--git-dir=' + str(CACHE), 'fetch', '--depth=1', 'origin',
+ '+refs/heads/master:refs/heads/master'], check=True)
+commit = git('rev-parse', 'refs/heads/master')
+with tempfile.TemporaryDirectory(prefix='.snapshot-', dir=BASE) as temp:
+ snapshot = Path(temp) / 'source'
+ snapshot.mkdir()
+ process = subprocess.Popen(['git', '--git-dir=' + str(CACHE), 'archive', commit], stdout=subprocess.PIPE)
+ try:
+ with tarfile.open(fileobj=process.stdout, mode='r|') as archive:
+ archive.extractall(snapshot, filter='data')
+ finally:
+ process.stdout.close()
+ if process.wait():
+ raise RuntimeError('无法生成源码快照')
+ previous = Path(temp) / 'previous'
+ destination = BASE / 'upstream'
+ if destination.exists():
+ destination.rename(previous)
+ try:
+ snapshot.rename(destination)
+ except BaseException:
+ if previous.exists():
+ previous.rename(destination)
+ raise
+(BASE / 'source-version.json').write_text(json.dumps({
+ 'repository': REPOSITORY, 'ref': 'master', 'commit': commit,
+}, indent=2) + '\n')
+print('已读取 GitHub 最新主分支:' + commit, flush=True)
+subprocess.run([sys.executable, str(BASE / 'builder/build.py')], check=True)
+subprocess.run([sys.executable, str(BASE / 'builder/check.py')], check=True)
diff --git a/website/requirements.txt b/website/requirements.txt
new file mode 100644
index 00000000..9673b412
--- /dev/null
+++ b/website/requirements.txt
@@ -0,0 +1 @@
+Pillow==11.3.0
diff --git a/website/templates/index.html b/website/templates/index.html
new file mode 100644
index 00000000..6300c850
--- /dev/null
+++ b/website/templates/index.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+ CS-Notes · CyC2018
+
+
+
+
+
+ 正在载入 CS-Notes…
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/website/templates/legacy-routes.json b/website/templates/legacy-routes.json
new file mode 100644
index 00000000..4831b0c2
--- /dev/null
+++ b/website/templates/legacy-routes.json
@@ -0,0 +1,506 @@
+{
+ "/Java/Java IO": "/notes/Java IO",
+ "/Java/Java IO.html": "/notes/Java IO",
+ "/Java/Java IO.md": "/notes/Java IO",
+ "/Java/Java 基础": "/notes/Java 基础",
+ "/Java/Java 基础.html": "/notes/Java 基础",
+ "/Java/Java 基础.md": "/notes/Java 基础",
+ "/Java/Java 容器": "/notes/Java 容器",
+ "/Java/Java 容器.html": "/notes/Java 容器",
+ "/Java/Java 容器.md": "/notes/Java 容器",
+ "/Java/Java 并发": "/notes/Java 并发",
+ "/Java/Java 并发.html": "/notes/Java 并发",
+ "/Java/Java 并发.md": "/notes/Java 并发",
+ "/Java/Java 虚拟机": "/notes/Java 虚拟机",
+ "/Java/Java 虚拟机.html": "/notes/Java 虚拟机",
+ "/Java/Java 虚拟机.md": "/notes/Java 虚拟机",
+ "/其它/系统设计/分布式": "/notes/分布式",
+ "/其它/系统设计/分布式.html": "/notes/分布式",
+ "/其它/系统设计/分布式.md": "/notes/分布式",
+ "/其它/系统设计/攻击技术": "/notes/攻击技术",
+ "/其它/系统设计/攻击技术.html": "/notes/攻击技术",
+ "/其它/系统设计/攻击技术.md": "/notes/攻击技术",
+ "/其它/系统设计/消息队列": "/notes/消息队列",
+ "/其它/系统设计/消息队列.html": "/notes/消息队列",
+ "/其它/系统设计/消息队列.md": "/notes/消息队列",
+ "/其它/系统设计/系统设计基础": "/notes/系统设计基础",
+ "/其它/系统设计/系统设计基础.html": "/notes/系统设计基础",
+ "/其它/系统设计/系统设计基础.md": "/notes/系统设计基础",
+ "/其它/系统设计/缓存": "/notes/缓存",
+ "/其它/系统设计/缓存.html": "/notes/缓存",
+ "/其它/系统设计/缓存.md": "/notes/缓存",
+ "/其它/系统设计/集群": "/notes/集群",
+ "/其它/系统设计/集群.html": "/notes/集群",
+ "/其它/系统设计/集群.md": "/notes/集群",
+ "/其它/编码实践/Docker": "/notes/Docker",
+ "/其它/编码实践/Docker.html": "/notes/Docker",
+ "/其它/编码实践/Docker.md": "/notes/Docker",
+ "/其它/编码实践/Git": "/notes/Git",
+ "/其它/编码实践/Git.html": "/notes/Git",
+ "/其它/编码实践/Git.md": "/notes/Git",
+ "/其它/编码实践/代码可读性": "/notes/代码可读性",
+ "/其它/编码实践/代码可读性.html": "/notes/代码可读性",
+ "/其它/编码实践/代码可读性.md": "/notes/代码可读性",
+ "/其它/编码实践/代码风格规范": "/notes/代码风格规范",
+ "/其它/编码实践/代码风格规范.html": "/notes/代码风格规范",
+ "/其它/编码实践/代码风格规范.md": "/notes/代码风格规范",
+ "/其它/编码实践/构建工具": "/notes/构建工具",
+ "/其它/编码实践/构建工具.html": "/notes/构建工具",
+ "/其它/编码实践/构建工具.md": "/notes/构建工具",
+ "/其它/编码实践/正则表达式": "/notes/正则表达式",
+ "/其它/编码实践/正则表达式.html": "/notes/正则表达式",
+ "/其它/编码实践/正则表达式.md": "/notes/正则表达式",
+ "/其它/编码实践/面向对象思想": "/notes/面向对象思想",
+ "/其它/编码实践/面向对象思想.html": "/notes/面向对象思想",
+ "/其它/编码实践/面向对象思想.md": "/notes/面向对象思想",
+ "/其它/设计模式/设计模式 - 单例": "/notes/设计模式 - 单例",
+ "/其它/设计模式/设计模式 - 单例.html": "/notes/设计模式 - 单例",
+ "/其它/设计模式/设计模式 - 单例.md": "/notes/设计模式 - 单例",
+ "/其它/设计模式/设计模式 - 中介者": "/notes/设计模式 - 中介者",
+ "/其它/设计模式/设计模式 - 中介者.html": "/notes/设计模式 - 中介者",
+ "/其它/设计模式/设计模式 - 中介者.md": "/notes/设计模式 - 中介者",
+ "/其它/设计模式/设计模式 - 享元": "/notes/设计模式 - 享元",
+ "/其它/设计模式/设计模式 - 享元.html": "/notes/设计模式 - 享元",
+ "/其它/设计模式/设计模式 - 享元.md": "/notes/设计模式 - 享元",
+ "/其它/设计模式/设计模式 - 代理": "/notes/设计模式 - 代理",
+ "/其它/设计模式/设计模式 - 代理.html": "/notes/设计模式 - 代理",
+ "/其它/设计模式/设计模式 - 代理.md": "/notes/设计模式 - 代理",
+ "/其它/设计模式/设计模式 - 原型模式": "/notes/设计模式 - 原型模式",
+ "/其它/设计模式/设计模式 - 原型模式.html": "/notes/设计模式 - 原型模式",
+ "/其它/设计模式/设计模式 - 原型模式.md": "/notes/设计模式 - 原型模式",
+ "/其它/设计模式/设计模式 - 命令": "/notes/设计模式 - 命令",
+ "/其它/设计模式/设计模式 - 命令.html": "/notes/设计模式 - 命令",
+ "/其它/设计模式/设计模式 - 命令.md": "/notes/设计模式 - 命令",
+ "/其它/设计模式/设计模式 - 备忘录": "/notes/设计模式 - 备忘录",
+ "/其它/设计模式/设计模式 - 备忘录.html": "/notes/设计模式 - 备忘录",
+ "/其它/设计模式/设计模式 - 备忘录.md": "/notes/设计模式 - 备忘录",
+ "/其它/设计模式/设计模式 - 外观": "/notes/设计模式 - 外观",
+ "/其它/设计模式/设计模式 - 外观.html": "/notes/设计模式 - 外观",
+ "/其它/设计模式/设计模式 - 外观.md": "/notes/设计模式 - 外观",
+ "/其它/设计模式/设计模式 - 工厂方法": "/notes/设计模式 - 工厂方法",
+ "/其它/设计模式/设计模式 - 工厂方法.html": "/notes/设计模式 - 工厂方法",
+ "/其它/设计模式/设计模式 - 工厂方法.md": "/notes/设计模式 - 工厂方法",
+ "/其它/设计模式/设计模式 - 抽象工厂": "/notes/设计模式 - 抽象工厂",
+ "/其它/设计模式/设计模式 - 抽象工厂.html": "/notes/设计模式 - 抽象工厂",
+ "/其它/设计模式/设计模式 - 抽象工厂.md": "/notes/设计模式 - 抽象工厂",
+ "/其它/设计模式/设计模式 - 桥接": "/notes/设计模式 - 桥接",
+ "/其它/设计模式/设计模式 - 桥接.html": "/notes/设计模式 - 桥接",
+ "/其它/设计模式/设计模式 - 桥接.md": "/notes/设计模式 - 桥接",
+ "/其它/设计模式/设计模式 - 模板方法": "/notes/设计模式 - 模板方法",
+ "/其它/设计模式/设计模式 - 模板方法.html": "/notes/设计模式 - 模板方法",
+ "/其它/设计模式/设计模式 - 模板方法.md": "/notes/设计模式 - 模板方法",
+ "/其它/设计模式/设计模式 - 状态": "/notes/设计模式 - 状态",
+ "/其它/设计模式/设计模式 - 状态.html": "/notes/设计模式 - 状态",
+ "/其它/设计模式/设计模式 - 状态.md": "/notes/设计模式 - 状态",
+ "/其它/设计模式/设计模式 - 生成器": "/notes/设计模式 - 生成器",
+ "/其它/设计模式/设计模式 - 生成器.html": "/notes/设计模式 - 生成器",
+ "/其它/设计模式/设计模式 - 生成器.md": "/notes/设计模式 - 生成器",
+ "/其它/设计模式/设计模式 - 目录": "/notes/设计模式 - 目录",
+ "/其它/设计模式/设计模式 - 目录.html": "/notes/设计模式 - 目录",
+ "/其它/设计模式/设计模式 - 目录.md": "/notes/设计模式 - 目录",
+ "/其它/设计模式/设计模式 - 空对象": "/notes/设计模式 - 空对象",
+ "/其它/设计模式/设计模式 - 空对象.html": "/notes/设计模式 - 空对象",
+ "/其它/设计模式/设计模式 - 空对象.md": "/notes/设计模式 - 空对象",
+ "/其它/设计模式/设计模式 - 策略": "/notes/设计模式 - 策略",
+ "/其它/设计模式/设计模式 - 策略.html": "/notes/设计模式 - 策略",
+ "/其它/设计模式/设计模式 - 策略.md": "/notes/设计模式 - 策略",
+ "/其它/设计模式/设计模式 - 简单工厂": "/notes/设计模式 - 简单工厂",
+ "/其它/设计模式/设计模式 - 简单工厂.html": "/notes/设计模式 - 简单工厂",
+ "/其它/设计模式/设计模式 - 简单工厂.md": "/notes/设计模式 - 简单工厂",
+ "/其它/设计模式/设计模式 - 组合": "/notes/设计模式 - 组合",
+ "/其它/设计模式/设计模式 - 组合.html": "/notes/设计模式 - 组合",
+ "/其它/设计模式/设计模式 - 组合.md": "/notes/设计模式 - 组合",
+ "/其它/设计模式/设计模式 - 装饰": "/notes/设计模式 - 装饰",
+ "/其它/设计模式/设计模式 - 装饰.html": "/notes/设计模式 - 装饰",
+ "/其它/设计模式/设计模式 - 装饰.md": "/notes/设计模式 - 装饰",
+ "/其它/设计模式/设计模式 - 观察者": "/notes/设计模式 - 观察者",
+ "/其它/设计模式/设计模式 - 观察者.html": "/notes/设计模式 - 观察者",
+ "/其它/设计模式/设计模式 - 观察者.md": "/notes/设计模式 - 观察者",
+ "/其它/设计模式/设计模式 - 解释器": "/notes/设计模式 - 解释器",
+ "/其它/设计模式/设计模式 - 解释器.html": "/notes/设计模式 - 解释器",
+ "/其它/设计模式/设计模式 - 解释器.md": "/notes/设计模式 - 解释器",
+ "/其它/设计模式/设计模式 - 访问者": "/notes/设计模式 - 访问者",
+ "/其它/设计模式/设计模式 - 访问者.html": "/notes/设计模式 - 访问者",
+ "/其它/设计模式/设计模式 - 访问者.md": "/notes/设计模式 - 访问者",
+ "/其它/设计模式/设计模式 - 责任链": "/notes/设计模式 - 责任链",
+ "/其它/设计模式/设计模式 - 责任链.html": "/notes/设计模式 - 责任链",
+ "/其它/设计模式/设计模式 - 责任链.md": "/notes/设计模式 - 责任链",
+ "/其它/设计模式/设计模式 - 迭代器": "/notes/设计模式 - 迭代器",
+ "/其它/设计模式/设计模式 - 迭代器.html": "/notes/设计模式 - 迭代器",
+ "/其它/设计模式/设计模式 - 迭代器.md": "/notes/设计模式 - 迭代器",
+ "/其它/设计模式/设计模式 - 适配器": "/notes/设计模式 - 适配器",
+ "/其它/设计模式/设计模式 - 适配器.html": "/notes/设计模式 - 适配器",
+ "/其它/设计模式/设计模式 - 适配器.md": "/notes/设计模式 - 适配器",
+ "/数据库/MySQL": "/notes/MySQL",
+ "/数据库/MySQL.html": "/notes/MySQL",
+ "/数据库/MySQL.md": "/notes/MySQL",
+ "/数据库/Redis": "/notes/Redis",
+ "/数据库/Redis.html": "/notes/Redis",
+ "/数据库/Redis.md": "/notes/Redis",
+ "/数据库/SQL 练习": "/notes/SQL 练习",
+ "/数据库/SQL 练习.html": "/notes/SQL 练习",
+ "/数据库/SQL 练习.md": "/notes/SQL 练习",
+ "/数据库/SQL 语法": "/notes/SQL 语法",
+ "/数据库/SQL 语法.html": "/notes/SQL 语法",
+ "/数据库/SQL 语法.md": "/notes/SQL 语法",
+ "/数据库/数据库系统原理": "/notes/数据库系统原理",
+ "/数据库/数据库系统原理.html": "/notes/数据库系统原理",
+ "/数据库/数据库系统原理.md": "/notes/数据库系统原理",
+ "/算法/Leetcode 题解/Leetcode 题解 - 二分查找": "/notes/Leetcode 题解 - 二分查找",
+ "/算法/Leetcode 题解/Leetcode 题解 - 二分查找.html": "/notes/Leetcode 题解 - 二分查找",
+ "/算法/Leetcode 题解/Leetcode 题解 - 二分查找.md": "/notes/Leetcode 题解 - 二分查找",
+ "/算法/Leetcode 题解/Leetcode 题解 - 位运算": "/notes/Leetcode 题解 - 位运算",
+ "/算法/Leetcode 题解/Leetcode 题解 - 位运算.html": "/notes/Leetcode 题解 - 位运算",
+ "/算法/Leetcode 题解/Leetcode 题解 - 位运算.md": "/notes/Leetcode 题解 - 位运算",
+ "/算法/Leetcode 题解/Leetcode 题解 - 分治": "/notes/Leetcode 题解 - 分治",
+ "/算法/Leetcode 题解/Leetcode 题解 - 分治.html": "/notes/Leetcode 题解 - 分治",
+ "/算法/Leetcode 题解/Leetcode 题解 - 分治.md": "/notes/Leetcode 题解 - 分治",
+ "/算法/Leetcode 题解/Leetcode 题解 - 动态规划": "/notes/Leetcode 题解 - 动态规划",
+ "/算法/Leetcode 题解/Leetcode 题解 - 动态规划.html": "/notes/Leetcode 题解 - 动态规划",
+ "/算法/Leetcode 题解/Leetcode 题解 - 动态规划.md": "/notes/Leetcode 题解 - 动态规划",
+ "/算法/Leetcode 题解/Leetcode 题解 - 双指针": "/notes/Leetcode 题解 - 双指针",
+ "/算法/Leetcode 题解/Leetcode 题解 - 双指针.html": "/notes/Leetcode 题解 - 双指针",
+ "/算法/Leetcode 题解/Leetcode 题解 - 双指针.md": "/notes/Leetcode 题解 - 双指针",
+ "/算法/Leetcode 题解/Leetcode 题解 - 哈希表": "/notes/Leetcode 题解 - 哈希表",
+ "/算法/Leetcode 题解/Leetcode 题解 - 哈希表.html": "/notes/Leetcode 题解 - 哈希表",
+ "/算法/Leetcode 题解/Leetcode 题解 - 哈希表.md": "/notes/Leetcode 题解 - 哈希表",
+ "/算法/Leetcode 题解/Leetcode 题解 - 图": "/notes/Leetcode 题解 - 图",
+ "/算法/Leetcode 题解/Leetcode 题解 - 图.html": "/notes/Leetcode 题解 - 图",
+ "/算法/Leetcode 题解/Leetcode 题解 - 图.md": "/notes/Leetcode 题解 - 图",
+ "/算法/Leetcode 题解/Leetcode 题解 - 字符串": "/notes/Leetcode 题解 - 字符串",
+ "/算法/Leetcode 题解/Leetcode 题解 - 字符串.html": "/notes/Leetcode 题解 - 字符串",
+ "/算法/Leetcode 题解/Leetcode 题解 - 字符串.md": "/notes/Leetcode 题解 - 字符串",
+ "/算法/Leetcode 题解/Leetcode 题解 - 排序": "/notes/Leetcode 题解 - 排序",
+ "/算法/Leetcode 题解/Leetcode 题解 - 排序.html": "/notes/Leetcode 题解 - 排序",
+ "/算法/Leetcode 题解/Leetcode 题解 - 排序.md": "/notes/Leetcode 题解 - 排序",
+ "/算法/Leetcode 题解/Leetcode 题解 - 搜索": "/notes/Leetcode 题解 - 搜索",
+ "/算法/Leetcode 题解/Leetcode 题解 - 搜索.html": "/notes/Leetcode 题解 - 搜索",
+ "/算法/Leetcode 题解/Leetcode 题解 - 搜索.md": "/notes/Leetcode 题解 - 搜索",
+ "/算法/Leetcode 题解/Leetcode 题解 - 数学": "/notes/Leetcode 题解 - 数学",
+ "/算法/Leetcode 题解/Leetcode 题解 - 数学.html": "/notes/Leetcode 题解 - 数学",
+ "/算法/Leetcode 题解/Leetcode 题解 - 数学.md": "/notes/Leetcode 题解 - 数学",
+ "/算法/Leetcode 题解/Leetcode 题解 - 数组与矩阵": "/notes/Leetcode 题解 - 数组与矩阵",
+ "/算法/Leetcode 题解/Leetcode 题解 - 数组与矩阵.html": "/notes/Leetcode 题解 - 数组与矩阵",
+ "/算法/Leetcode 题解/Leetcode 题解 - 数组与矩阵.md": "/notes/Leetcode 题解 - 数组与矩阵",
+ "/算法/Leetcode 题解/Leetcode 题解 - 栈和队列": "/notes/Leetcode 题解 - 栈和队列",
+ "/算法/Leetcode 题解/Leetcode 题解 - 栈和队列.html": "/notes/Leetcode 题解 - 栈和队列",
+ "/算法/Leetcode 题解/Leetcode 题解 - 栈和队列.md": "/notes/Leetcode 题解 - 栈和队列",
+ "/算法/Leetcode 题解/Leetcode 题解 - 树": "/notes/Leetcode 题解 - 树",
+ "/算法/Leetcode 题解/Leetcode 题解 - 树.html": "/notes/Leetcode 题解 - 树",
+ "/算法/Leetcode 题解/Leetcode 题解 - 树.md": "/notes/Leetcode 题解 - 树",
+ "/算法/Leetcode 题解/Leetcode 题解 - 目录": "/notes/Leetcode 题解 - 目录",
+ "/算法/Leetcode 题解/Leetcode 题解 - 目录.html": "/notes/Leetcode 题解 - 目录",
+ "/算法/Leetcode 题解/Leetcode 题解 - 目录.md": "/notes/Leetcode 题解 - 目录",
+ "/算法/Leetcode 题解/Leetcode 题解 - 贪心思想": "/notes/Leetcode 题解 - 贪心思想",
+ "/算法/Leetcode 题解/Leetcode 题解 - 贪心思想.html": "/notes/Leetcode 题解 - 贪心思想",
+ "/算法/Leetcode 题解/Leetcode 题解 - 贪心思想.md": "/notes/Leetcode 题解 - 贪心思想",
+ "/算法/Leetcode 题解/Leetcode 题解 - 链表": "/notes/Leetcode 题解 - 链表",
+ "/算法/Leetcode 题解/Leetcode 题解 - 链表.html": "/notes/Leetcode 题解 - 链表",
+ "/算法/Leetcode 题解/Leetcode 题解 - 链表.md": "/notes/Leetcode 题解 - 链表",
+ "/算法/剑指 Offer 题解/10.1 斐波那契数列": "/notes/10.1 斐波那契数列",
+ "/算法/剑指 Offer 题解/10.1 斐波那契数列.html": "/notes/10.1 斐波那契数列",
+ "/算法/剑指 Offer 题解/10.1 斐波那契数列.md": "/notes/10.1 斐波那契数列",
+ "/算法/剑指 Offer 题解/10.2 矩形覆盖": "/notes/10.2 矩形覆盖",
+ "/算法/剑指 Offer 题解/10.2 矩形覆盖.html": "/notes/10.2 矩形覆盖",
+ "/算法/剑指 Offer 题解/10.2 矩形覆盖.md": "/notes/10.2 矩形覆盖",
+ "/算法/剑指 Offer 题解/10.3 跳台阶": "/notes/10.3 跳台阶",
+ "/算法/剑指 Offer 题解/10.3 跳台阶.html": "/notes/10.3 跳台阶",
+ "/算法/剑指 Offer 题解/10.3 跳台阶.md": "/notes/10.3 跳台阶",
+ "/算法/剑指 Offer 题解/10.4 变态跳台阶": "/notes/10.4 变态跳台阶",
+ "/算法/剑指 Offer 题解/10.4 变态跳台阶.html": "/notes/10.4 变态跳台阶",
+ "/算法/剑指 Offer 题解/10.4 变态跳台阶.md": "/notes/10.4 变态跳台阶",
+ "/算法/剑指 Offer 题解/11. 旋转数组的最小数字": "/notes/11. 旋转数组的最小数字",
+ "/算法/剑指 Offer 题解/11. 旋转数组的最小数字.html": "/notes/11. 旋转数组的最小数字",
+ "/算法/剑指 Offer 题解/11. 旋转数组的最小数字.md": "/notes/11. 旋转数组的最小数字",
+ "/算法/剑指 Offer 题解/12. 矩阵中的路径": "/notes/12. 矩阵中的路径",
+ "/算法/剑指 Offer 题解/12. 矩阵中的路径.html": "/notes/12. 矩阵中的路径",
+ "/算法/剑指 Offer 题解/12. 矩阵中的路径.md": "/notes/12. 矩阵中的路径",
+ "/算法/剑指 Offer 题解/13. 机器人的运动范围": "/notes/13. 机器人的运动范围",
+ "/算法/剑指 Offer 题解/13. 机器人的运动范围.html": "/notes/13. 机器人的运动范围",
+ "/算法/剑指 Offer 题解/13. 机器人的运动范围.md": "/notes/13. 机器人的运动范围",
+ "/算法/剑指 Offer 题解/14. 剪绳子": "/notes/14. 剪绳子",
+ "/算法/剑指 Offer 题解/14. 剪绳子.html": "/notes/14. 剪绳子",
+ "/算法/剑指 Offer 题解/14. 剪绳子.md": "/notes/14. 剪绳子",
+ "/算法/剑指 Offer 题解/15. 二进制中 1 的个数": "/notes/15. 二进制中 1 的个数",
+ "/算法/剑指 Offer 题解/15. 二进制中 1 的个数.html": "/notes/15. 二进制中 1 的个数",
+ "/算法/剑指 Offer 题解/15. 二进制中 1 的个数.md": "/notes/15. 二进制中 1 的个数",
+ "/算法/剑指 Offer 题解/16. 数值的整数次方": "/notes/16. 数值的整数次方",
+ "/算法/剑指 Offer 题解/16. 数值的整数次方.html": "/notes/16. 数值的整数次方",
+ "/算法/剑指 Offer 题解/16. 数值的整数次方.md": "/notes/16. 数值的整数次方",
+ "/算法/剑指 Offer 题解/17. 打印从 1 到最大的 n 位数": "/notes/17. 打印从 1 到最大的 n 位数",
+ "/算法/剑指 Offer 题解/17. 打印从 1 到最大的 n 位数.html": "/notes/17. 打印从 1 到最大的 n 位数",
+ "/算法/剑指 Offer 题解/17. 打印从 1 到最大的 n 位数.md": "/notes/17. 打印从 1 到最大的 n 位数",
+ "/算法/剑指 Offer 题解/18.1 在 O(1) 时间内删除链表节点": "/notes/18.1 在 O(1) 时间内删除链表节点",
+ "/算法/剑指 Offer 题解/18.1 在 O(1) 时间内删除链表节点.html": "/notes/18.1 在 O(1) 时间内删除链表节点",
+ "/算法/剑指 Offer 题解/18.1 在 O(1) 时间内删除链表节点.md": "/notes/18.1 在 O(1) 时间内删除链表节点",
+ "/算法/剑指 Offer 题解/18.2 删除链表中重复的结点": "/notes/18.2 删除链表中重复的结点",
+ "/算法/剑指 Offer 题解/18.2 删除链表中重复的结点.html": "/notes/18.2 删除链表中重复的结点",
+ "/算法/剑指 Offer 题解/18.2 删除链表中重复的结点.md": "/notes/18.2 删除链表中重复的结点",
+ "/算法/剑指 Offer 题解/19. 正则表达式匹配": "/notes/19. 正则表达式匹配",
+ "/算法/剑指 Offer 题解/19. 正则表达式匹配.html": "/notes/19. 正则表达式匹配",
+ "/算法/剑指 Offer 题解/19. 正则表达式匹配.md": "/notes/19. 正则表达式匹配",
+ "/算法/剑指 Offer 题解/20. 表示数值的字符串": "/notes/20. 表示数值的字符串",
+ "/算法/剑指 Offer 题解/20. 表示数值的字符串.html": "/notes/20. 表示数值的字符串",
+ "/算法/剑指 Offer 题解/20. 表示数值的字符串.md": "/notes/20. 表示数值的字符串",
+ "/算法/剑指 Offer 题解/21. 调整数组顺序使奇数位于偶数前面": "/notes/21. 调整数组顺序使奇数位于偶数前面",
+ "/算法/剑指 Offer 题解/21. 调整数组顺序使奇数位于偶数前面.html": "/notes/21. 调整数组顺序使奇数位于偶数前面",
+ "/算法/剑指 Offer 题解/21. 调整数组顺序使奇数位于偶数前面.md": "/notes/21. 调整数组顺序使奇数位于偶数前面",
+ "/算法/剑指 Offer 题解/22. 链表中倒数第 K 个结点": "/notes/22. 链表中倒数第 K 个结点",
+ "/算法/剑指 Offer 题解/22. 链表中倒数第 K 个结点.html": "/notes/22. 链表中倒数第 K 个结点",
+ "/算法/剑指 Offer 题解/22. 链表中倒数第 K 个结点.md": "/notes/22. 链表中倒数第 K 个结点",
+ "/算法/剑指 Offer 题解/23. 链表中环的入口结点": "/notes/23. 链表中环的入口结点",
+ "/算法/剑指 Offer 题解/23. 链表中环的入口结点.html": "/notes/23. 链表中环的入口结点",
+ "/算法/剑指 Offer 题解/23. 链表中环的入口结点.md": "/notes/23. 链表中环的入口结点",
+ "/算法/剑指 Offer 题解/24. 反转链表": "/notes/24. 反转链表",
+ "/算法/剑指 Offer 题解/24. 反转链表.html": "/notes/24. 反转链表",
+ "/算法/剑指 Offer 题解/24. 反转链表.md": "/notes/24. 反转链表",
+ "/算法/剑指 Offer 题解/25. 合并两个排序的链表": "/notes/25. 合并两个排序的链表",
+ "/算法/剑指 Offer 题解/25. 合并两个排序的链表.html": "/notes/25. 合并两个排序的链表",
+ "/算法/剑指 Offer 题解/25. 合并两个排序的链表.md": "/notes/25. 合并两个排序的链表",
+ "/算法/剑指 Offer 题解/26. 树的子结构": "/notes/26. 树的子结构",
+ "/算法/剑指 Offer 题解/26. 树的子结构.html": "/notes/26. 树的子结构",
+ "/算法/剑指 Offer 题解/26. 树的子结构.md": "/notes/26. 树的子结构",
+ "/算法/剑指 Offer 题解/27. 二叉树的镜像": "/notes/27. 二叉树的镜像",
+ "/算法/剑指 Offer 题解/27. 二叉树的镜像.html": "/notes/27. 二叉树的镜像",
+ "/算法/剑指 Offer 题解/27. 二叉树的镜像.md": "/notes/27. 二叉树的镜像",
+ "/算法/剑指 Offer 题解/28. 对称的二叉树": "/notes/28. 对称的二叉树",
+ "/算法/剑指 Offer 题解/28. 对称的二叉树.html": "/notes/28. 对称的二叉树",
+ "/算法/剑指 Offer 题解/28. 对称的二叉树.md": "/notes/28. 对称的二叉树",
+ "/算法/剑指 Offer 题解/29. 顺时针打印矩阵": "/notes/29. 顺时针打印矩阵",
+ "/算法/剑指 Offer 题解/29. 顺时针打印矩阵.html": "/notes/29. 顺时针打印矩阵",
+ "/算法/剑指 Offer 题解/29. 顺时针打印矩阵.md": "/notes/29. 顺时针打印矩阵",
+ "/算法/剑指 Offer 题解/3. 数组中重复的数字": "/notes/3. 数组中重复的数字",
+ "/算法/剑指 Offer 题解/3. 数组中重复的数字.html": "/notes/3. 数组中重复的数字",
+ "/算法/剑指 Offer 题解/3. 数组中重复的数字.md": "/notes/3. 数组中重复的数字",
+ "/算法/剑指 Offer 题解/30. 包含 min 函数的栈": "/notes/30. 包含 min 函数的栈",
+ "/算法/剑指 Offer 题解/30. 包含 min 函数的栈.html": "/notes/30. 包含 min 函数的栈",
+ "/算法/剑指 Offer 题解/30. 包含 min 函数的栈.md": "/notes/30. 包含 min 函数的栈",
+ "/算法/剑指 Offer 题解/31. 栈的压入、弹出序列": "/notes/31. 栈的压入、弹出序列",
+ "/算法/剑指 Offer 题解/31. 栈的压入、弹出序列.html": "/notes/31. 栈的压入、弹出序列",
+ "/算法/剑指 Offer 题解/31. 栈的压入、弹出序列.md": "/notes/31. 栈的压入、弹出序列",
+ "/算法/剑指 Offer 题解/32.1 从上往下打印二叉树": "/notes/32.1 从上往下打印二叉树",
+ "/算法/剑指 Offer 题解/32.1 从上往下打印二叉树.html": "/notes/32.1 从上往下打印二叉树",
+ "/算法/剑指 Offer 题解/32.1 从上往下打印二叉树.md": "/notes/32.1 从上往下打印二叉树",
+ "/算法/剑指 Offer 题解/32.2 把二叉树打印成多行": "/notes/32.2 把二叉树打印成多行",
+ "/算法/剑指 Offer 题解/32.2 把二叉树打印成多行.html": "/notes/32.2 把二叉树打印成多行",
+ "/算法/剑指 Offer 题解/32.2 把二叉树打印成多行.md": "/notes/32.2 把二叉树打印成多行",
+ "/算法/剑指 Offer 题解/32.3 按之字形顺序打印二叉树": "/notes/32.3 按之字形顺序打印二叉树",
+ "/算法/剑指 Offer 题解/32.3 按之字形顺序打印二叉树.html": "/notes/32.3 按之字形顺序打印二叉树",
+ "/算法/剑指 Offer 题解/32.3 按之字形顺序打印二叉树.md": "/notes/32.3 按之字形顺序打印二叉树",
+ "/算法/剑指 Offer 题解/33. 二叉搜索树的后序遍历序列": "/notes/33. 二叉搜索树的后序遍历序列",
+ "/算法/剑指 Offer 题解/33. 二叉搜索树的后序遍历序列.html": "/notes/33. 二叉搜索树的后序遍历序列",
+ "/算法/剑指 Offer 题解/33. 二叉搜索树的后序遍历序列.md": "/notes/33. 二叉搜索树的后序遍历序列",
+ "/算法/剑指 Offer 题解/34. 二叉树中和为某一值的路径": "/notes/34. 二叉树中和为某一值的路径",
+ "/算法/剑指 Offer 题解/34. 二叉树中和为某一值的路径.html": "/notes/34. 二叉树中和为某一值的路径",
+ "/算法/剑指 Offer 题解/34. 二叉树中和为某一值的路径.md": "/notes/34. 二叉树中和为某一值的路径",
+ "/算法/剑指 Offer 题解/35. 复杂链表的复制": "/notes/35. 复杂链表的复制",
+ "/算法/剑指 Offer 题解/35. 复杂链表的复制.html": "/notes/35. 复杂链表的复制",
+ "/算法/剑指 Offer 题解/35. 复杂链表的复制.md": "/notes/35. 复杂链表的复制",
+ "/算法/剑指 Offer 题解/36. 二叉搜索树与双向链表": "/notes/36. 二叉搜索树与双向链表",
+ "/算法/剑指 Offer 题解/36. 二叉搜索树与双向链表.html": "/notes/36. 二叉搜索树与双向链表",
+ "/算法/剑指 Offer 题解/36. 二叉搜索树与双向链表.md": "/notes/36. 二叉搜索树与双向链表",
+ "/算法/剑指 Offer 题解/37. 序列化二叉树": "/notes/37. 序列化二叉树",
+ "/算法/剑指 Offer 题解/37. 序列化二叉树.html": "/notes/37. 序列化二叉树",
+ "/算法/剑指 Offer 题解/37. 序列化二叉树.md": "/notes/37. 序列化二叉树",
+ "/算法/剑指 Offer 题解/38. 字符串的排列": "/notes/38. 字符串的排列",
+ "/算法/剑指 Offer 题解/38. 字符串的排列.html": "/notes/38. 字符串的排列",
+ "/算法/剑指 Offer 题解/38. 字符串的排列.md": "/notes/38. 字符串的排列",
+ "/算法/剑指 Offer 题解/39. 数组中出现次数超过一半的数字": "/notes/39. 数组中出现次数超过一半的数字",
+ "/算法/剑指 Offer 题解/39. 数组中出现次数超过一半的数字.html": "/notes/39. 数组中出现次数超过一半的数字",
+ "/算法/剑指 Offer 题解/39. 数组中出现次数超过一半的数字.md": "/notes/39. 数组中出现次数超过一半的数字",
+ "/算法/剑指 Offer 题解/4. 二维数组中的查找": "/notes/4. 二维数组中的查找",
+ "/算法/剑指 Offer 题解/4. 二维数组中的查找.html": "/notes/4. 二维数组中的查找",
+ "/算法/剑指 Offer 题解/4. 二维数组中的查找.md": "/notes/4. 二维数组中的查找",
+ "/算法/剑指 Offer 题解/40. 最小的 K 个数": "/notes/40. 最小的 K 个数",
+ "/算法/剑指 Offer 题解/40. 最小的 K 个数.html": "/notes/40. 最小的 K 个数",
+ "/算法/剑指 Offer 题解/40. 最小的 K 个数.md": "/notes/40. 最小的 K 个数",
+ "/算法/剑指 Offer 题解/41.1 数据流中的中位数": "/notes/41.1 数据流中的中位数",
+ "/算法/剑指 Offer 题解/41.1 数据流中的中位数.html": "/notes/41.1 数据流中的中位数",
+ "/算法/剑指 Offer 题解/41.1 数据流中的中位数.md": "/notes/41.1 数据流中的中位数",
+ "/算法/剑指 Offer 题解/41.2 字符流中第一个不重复的字符": "/notes/41.2 字符流中第一个不重复的字符",
+ "/算法/剑指 Offer 题解/41.2 字符流中第一个不重复的字符.html": "/notes/41.2 字符流中第一个不重复的字符",
+ "/算法/剑指 Offer 题解/41.2 字符流中第一个不重复的字符.md": "/notes/41.2 字符流中第一个不重复的字符",
+ "/算法/剑指 Offer 题解/42. 连续子数组的最大和": "/notes/42. 连续子数组的最大和",
+ "/算法/剑指 Offer 题解/42. 连续子数组的最大和.html": "/notes/42. 连续子数组的最大和",
+ "/算法/剑指 Offer 题解/42. 连续子数组的最大和.md": "/notes/42. 连续子数组的最大和",
+ "/算法/剑指 Offer 题解/43. 从 1 到 n 整数中 1 出现的次数": "/notes/43. 从 1 到 n 整数中 1 出现的次数",
+ "/算法/剑指 Offer 题解/43. 从 1 到 n 整数中 1 出现的次数.html": "/notes/43. 从 1 到 n 整数中 1 出现的次数",
+ "/算法/剑指 Offer 题解/43. 从 1 到 n 整数中 1 出现的次数.md": "/notes/43. 从 1 到 n 整数中 1 出现的次数",
+ "/算法/剑指 Offer 题解/44. 数字序列中的某一位数字": "/notes/44. 数字序列中的某一位数字",
+ "/算法/剑指 Offer 题解/44. 数字序列中的某一位数字.html": "/notes/44. 数字序列中的某一位数字",
+ "/算法/剑指 Offer 题解/44. 数字序列中的某一位数字.md": "/notes/44. 数字序列中的某一位数字",
+ "/算法/剑指 Offer 题解/45. 把数组排成最小的数": "/notes/45. 把数组排成最小的数",
+ "/算法/剑指 Offer 题解/45. 把数组排成最小的数.html": "/notes/45. 把数组排成最小的数",
+ "/算法/剑指 Offer 题解/45. 把数组排成最小的数.md": "/notes/45. 把数组排成最小的数",
+ "/算法/剑指 Offer 题解/46. 把数字翻译成字符串": "/notes/46. 把数字翻译成字符串",
+ "/算法/剑指 Offer 题解/46. 把数字翻译成字符串.html": "/notes/46. 把数字翻译成字符串",
+ "/算法/剑指 Offer 题解/46. 把数字翻译成字符串.md": "/notes/46. 把数字翻译成字符串",
+ "/算法/剑指 Offer 题解/47. 礼物的最大价值": "/notes/47. 礼物的最大价值",
+ "/算法/剑指 Offer 题解/47. 礼物的最大价值.html": "/notes/47. 礼物的最大价值",
+ "/算法/剑指 Offer 题解/47. 礼物的最大价值.md": "/notes/47. 礼物的最大价值",
+ "/算法/剑指 Offer 题解/48. 最长不含重复字符的子字符串": "/notes/48. 最长不含重复字符的子字符串",
+ "/算法/剑指 Offer 题解/48. 最长不含重复字符的子字符串.html": "/notes/48. 最长不含重复字符的子字符串",
+ "/算法/剑指 Offer 题解/48. 最长不含重复字符的子字符串.md": "/notes/48. 最长不含重复字符的子字符串",
+ "/算法/剑指 Offer 题解/49. 丑数": "/notes/49. 丑数",
+ "/算法/剑指 Offer 题解/49. 丑数.html": "/notes/49. 丑数",
+ "/算法/剑指 Offer 题解/49. 丑数.md": "/notes/49. 丑数",
+ "/算法/剑指 Offer 题解/5. 替换空格": "/notes/5. 替换空格",
+ "/算法/剑指 Offer 题解/5. 替换空格.html": "/notes/5. 替换空格",
+ "/算法/剑指 Offer 题解/5. 替换空格.md": "/notes/5. 替换空格",
+ "/算法/剑指 Offer 题解/50. 第一个只出现一次的字符位置": "/notes/50. 第一个只出现一次的字符位置",
+ "/算法/剑指 Offer 题解/50. 第一个只出现一次的字符位置.html": "/notes/50. 第一个只出现一次的字符位置",
+ "/算法/剑指 Offer 题解/50. 第一个只出现一次的字符位置.md": "/notes/50. 第一个只出现一次的字符位置",
+ "/算法/剑指 Offer 题解/51. 数组中的逆序对": "/notes/51. 数组中的逆序对",
+ "/算法/剑指 Offer 题解/51. 数组中的逆序对.html": "/notes/51. 数组中的逆序对",
+ "/算法/剑指 Offer 题解/51. 数组中的逆序对.md": "/notes/51. 数组中的逆序对",
+ "/算法/剑指 Offer 题解/52. 两个链表的第一个公共结点": "/notes/52. 两个链表的第一个公共结点",
+ "/算法/剑指 Offer 题解/52. 两个链表的第一个公共结点.html": "/notes/52. 两个链表的第一个公共结点",
+ "/算法/剑指 Offer 题解/52. 两个链表的第一个公共结点.md": "/notes/52. 两个链表的第一个公共结点",
+ "/算法/剑指 Offer 题解/53. 数字在排序数组中出现的次数": "/notes/53. 数字在排序数组中出现的次数",
+ "/算法/剑指 Offer 题解/53. 数字在排序数组中出现的次数.html": "/notes/53. 数字在排序数组中出现的次数",
+ "/算法/剑指 Offer 题解/53. 数字在排序数组中出现的次数.md": "/notes/53. 数字在排序数组中出现的次数",
+ "/算法/剑指 Offer 题解/54. 二叉查找树的第 K 个结点": "/notes/54. 二叉查找树的第 K 个结点",
+ "/算法/剑指 Offer 题解/54. 二叉查找树的第 K 个结点.html": "/notes/54. 二叉查找树的第 K 个结点",
+ "/算法/剑指 Offer 题解/54. 二叉查找树的第 K 个结点.md": "/notes/54. 二叉查找树的第 K 个结点",
+ "/算法/剑指 Offer 题解/55.1 二叉树的深度": "/notes/55.1 二叉树的深度",
+ "/算法/剑指 Offer 题解/55.1 二叉树的深度.html": "/notes/55.1 二叉树的深度",
+ "/算法/剑指 Offer 题解/55.1 二叉树的深度.md": "/notes/55.1 二叉树的深度",
+ "/算法/剑指 Offer 题解/55.2 平衡二叉树": "/notes/55.2 平衡二叉树",
+ "/算法/剑指 Offer 题解/55.2 平衡二叉树.html": "/notes/55.2 平衡二叉树",
+ "/算法/剑指 Offer 题解/55.2 平衡二叉树.md": "/notes/55.2 平衡二叉树",
+ "/算法/剑指 Offer 题解/56. 数组中只出现一次的数字": "/notes/56. 数组中只出现一次的数字",
+ "/算法/剑指 Offer 题解/56. 数组中只出现一次的数字.html": "/notes/56. 数组中只出现一次的数字",
+ "/算法/剑指 Offer 题解/56. 数组中只出现一次的数字.md": "/notes/56. 数组中只出现一次的数字",
+ "/算法/剑指 Offer 题解/57.1 和为 S 的两个数字": "/notes/57.1 和为 S 的两个数字",
+ "/算法/剑指 Offer 题解/57.1 和为 S 的两个数字.html": "/notes/57.1 和为 S 的两个数字",
+ "/算法/剑指 Offer 题解/57.1 和为 S 的两个数字.md": "/notes/57.1 和为 S 的两个数字",
+ "/算法/剑指 Offer 题解/57.2 和为 S 的连续正数序列": "/notes/57.2 和为 S 的连续正数序列",
+ "/算法/剑指 Offer 题解/57.2 和为 S 的连续正数序列.html": "/notes/57.2 和为 S 的连续正数序列",
+ "/算法/剑指 Offer 题解/57.2 和为 S 的连续正数序列.md": "/notes/57.2 和为 S 的连续正数序列",
+ "/算法/剑指 Offer 题解/58.1 翻转单词顺序列": "/notes/58.1 翻转单词顺序列",
+ "/算法/剑指 Offer 题解/58.1 翻转单词顺序列.html": "/notes/58.1 翻转单词顺序列",
+ "/算法/剑指 Offer 题解/58.1 翻转单词顺序列.md": "/notes/58.1 翻转单词顺序列",
+ "/算法/剑指 Offer 题解/58.2 左旋转字符串": "/notes/58.2 左旋转字符串",
+ "/算法/剑指 Offer 题解/58.2 左旋转字符串.html": "/notes/58.2 左旋转字符串",
+ "/算法/剑指 Offer 题解/58.2 左旋转字符串.md": "/notes/58.2 左旋转字符串",
+ "/算法/剑指 Offer 题解/59. 滑动窗口的最大值": "/notes/59. 滑动窗口的最大值",
+ "/算法/剑指 Offer 题解/59. 滑动窗口的最大值.html": "/notes/59. 滑动窗口的最大值",
+ "/算法/剑指 Offer 题解/59. 滑动窗口的最大值.md": "/notes/59. 滑动窗口的最大值",
+ "/算法/剑指 Offer 题解/6. 从尾到头打印链表": "/notes/6. 从尾到头打印链表",
+ "/算法/剑指 Offer 题解/6. 从尾到头打印链表.html": "/notes/6. 从尾到头打印链表",
+ "/算法/剑指 Offer 题解/6. 从尾到头打印链表.md": "/notes/6. 从尾到头打印链表",
+ "/算法/剑指 Offer 题解/60. n 个骰子的点数": "/notes/60. n 个骰子的点数",
+ "/算法/剑指 Offer 题解/60. n 个骰子的点数.html": "/notes/60. n 个骰子的点数",
+ "/算法/剑指 Offer 题解/60. n 个骰子的点数.md": "/notes/60. n 个骰子的点数",
+ "/算法/剑指 Offer 题解/61. 扑克牌顺子": "/notes/61. 扑克牌顺子",
+ "/算法/剑指 Offer 题解/61. 扑克牌顺子.html": "/notes/61. 扑克牌顺子",
+ "/算法/剑指 Offer 题解/61. 扑克牌顺子.md": "/notes/61. 扑克牌顺子",
+ "/算法/剑指 Offer 题解/62. 圆圈中最后剩下的数": "/notes/62. 圆圈中最后剩下的数",
+ "/算法/剑指 Offer 题解/62. 圆圈中最后剩下的数.html": "/notes/62. 圆圈中最后剩下的数",
+ "/算法/剑指 Offer 题解/62. 圆圈中最后剩下的数.md": "/notes/62. 圆圈中最后剩下的数",
+ "/算法/剑指 Offer 题解/63. 股票的最大利润": "/notes/63. 股票的最大利润",
+ "/算法/剑指 Offer 题解/63. 股票的最大利润.html": "/notes/63. 股票的最大利润",
+ "/算法/剑指 Offer 题解/63. 股票的最大利润.md": "/notes/63. 股票的最大利润",
+ "/算法/剑指 Offer 题解/64. 求 1+2+3+...+n": "/notes/64. 求 1+2+3+...+n",
+ "/算法/剑指 Offer 题解/64. 求 1+2+3+...+n.html": "/notes/64. 求 1+2+3+...+n",
+ "/算法/剑指 Offer 题解/64. 求 1+2+3+...+n.md": "/notes/64. 求 1+2+3+...+n",
+ "/算法/剑指 Offer 题解/65. 不用加减乘除做加法": "/notes/65. 不用加减乘除做加法",
+ "/算法/剑指 Offer 题解/65. 不用加减乘除做加法.html": "/notes/65. 不用加减乘除做加法",
+ "/算法/剑指 Offer 题解/65. 不用加减乘除做加法.md": "/notes/65. 不用加减乘除做加法",
+ "/算法/剑指 Offer 题解/66. 构建乘积数组": "/notes/66. 构建乘积数组",
+ "/算法/剑指 Offer 题解/66. 构建乘积数组.html": "/notes/66. 构建乘积数组",
+ "/算法/剑指 Offer 题解/66. 构建乘积数组.md": "/notes/66. 构建乘积数组",
+ "/算法/剑指 Offer 题解/67. 把字符串转换成整数": "/notes/67. 把字符串转换成整数",
+ "/算法/剑指 Offer 题解/67. 把字符串转换成整数.html": "/notes/67. 把字符串转换成整数",
+ "/算法/剑指 Offer 题解/67. 把字符串转换成整数.md": "/notes/67. 把字符串转换成整数",
+ "/算法/剑指 Offer 题解/68. 树中两个节点的最低公共祖先": "/notes/68. 树中两个节点的最低公共祖先",
+ "/算法/剑指 Offer 题解/68. 树中两个节点的最低公共祖先.html": "/notes/68. 树中两个节点的最低公共祖先",
+ "/算法/剑指 Offer 题解/68. 树中两个节点的最低公共祖先.md": "/notes/68. 树中两个节点的最低公共祖先",
+ "/算法/剑指 Offer 题解/7. 重建二叉树": "/notes/7. 重建二叉树",
+ "/算法/剑指 Offer 题解/7. 重建二叉树.html": "/notes/7. 重建二叉树",
+ "/算法/剑指 Offer 题解/7. 重建二叉树.md": "/notes/7. 重建二叉树",
+ "/算法/剑指 Offer 题解/8. 二叉树的下一个结点": "/notes/8. 二叉树的下一个结点",
+ "/算法/剑指 Offer 题解/8. 二叉树的下一个结点.html": "/notes/8. 二叉树的下一个结点",
+ "/算法/剑指 Offer 题解/8. 二叉树的下一个结点.md": "/notes/8. 二叉树的下一个结点",
+ "/算法/剑指 Offer 题解/9. 用两个栈实现队列": "/notes/9. 用两个栈实现队列",
+ "/算法/剑指 Offer 题解/9. 用两个栈实现队列.html": "/notes/9. 用两个栈实现队列",
+ "/算法/剑指 Offer 题解/9. 用两个栈实现队列.md": "/notes/9. 用两个栈实现队列",
+ "/算法/剑指 Offer 题解/剑指 Offer 题解 - 目录": "/notes/剑指 Offer 题解 - 目录",
+ "/算法/剑指 Offer 题解/剑指 Offer 题解 - 目录.html": "/notes/剑指 Offer 题解 - 目录",
+ "/算法/剑指 Offer 题解/剑指 Offer 题解 - 目录.md": "/notes/剑指 Offer 题解 - 目录",
+ "/算法/基础/算法 - 其它": "/notes/算法 - 其它",
+ "/算法/基础/算法 - 其它.html": "/notes/算法 - 其它",
+ "/算法/基础/算法 - 其它.md": "/notes/算法 - 其它",
+ "/算法/基础/算法 - 并查集": "/notes/算法 - 并查集",
+ "/算法/基础/算法 - 并查集.html": "/notes/算法 - 并查集",
+ "/算法/基础/算法 - 并查集.md": "/notes/算法 - 并查集",
+ "/算法/基础/算法 - 排序": "/notes/算法 - 排序",
+ "/算法/基础/算法 - 排序.html": "/notes/算法 - 排序",
+ "/算法/基础/算法 - 排序.md": "/notes/算法 - 排序",
+ "/算法/基础/算法 - 栈和队列": "/notes/算法 - 栈和队列",
+ "/算法/基础/算法 - 栈和队列.html": "/notes/算法 - 栈和队列",
+ "/算法/基础/算法 - 栈和队列.md": "/notes/算法 - 栈和队列",
+ "/算法/基础/算法 - 目录": "/notes/算法 - 目录",
+ "/算法/基础/算法 - 目录.html": "/notes/算法 - 目录",
+ "/算法/基础/算法 - 目录.md": "/notes/算法 - 目录",
+ "/算法/基础/算法 - 符号表": "/notes/算法 - 符号表",
+ "/算法/基础/算法 - 符号表.html": "/notes/算法 - 符号表",
+ "/算法/基础/算法 - 符号表.md": "/notes/算法 - 符号表",
+ "/算法/基础/算法 - 算法分析": "/notes/算法 - 算法分析",
+ "/算法/基础/算法 - 算法分析.html": "/notes/算法 - 算法分析",
+ "/算法/基础/算法 - 算法分析.md": "/notes/算法 - 算法分析",
+ "/算法/基础/算法": "/notes/算法",
+ "/算法/基础/算法.html": "/notes/算法",
+ "/算法/基础/算法.md": "/notes/算法",
+ "/计算机基础/HTTP/HTTP": "/notes/HTTP",
+ "/计算机基础/HTTP/HTTP.html": "/notes/HTTP",
+ "/计算机基础/HTTP/HTTP.md": "/notes/HTTP",
+ "/计算机基础/Linux/Linux": "/notes/Linux",
+ "/计算机基础/Linux/Linux.html": "/notes/Linux",
+ "/计算机基础/Linux/Linux.md": "/notes/Linux",
+ "/计算机基础/Socket/Socket": "/notes/Socket",
+ "/计算机基础/Socket/Socket.html": "/notes/Socket",
+ "/计算机基础/Socket/Socket.md": "/notes/Socket",
+ "/计算机基础/操作系统基础/计算机操作系统 - 内存管理": "/notes/计算机操作系统 - 内存管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 内存管理.html": "/notes/计算机操作系统 - 内存管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 内存管理.md": "/notes/计算机操作系统 - 内存管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 概述": "/notes/计算机操作系统 - 概述",
+ "/计算机基础/操作系统基础/计算机操作系统 - 概述.html": "/notes/计算机操作系统 - 概述",
+ "/计算机基础/操作系统基础/计算机操作系统 - 概述.md": "/notes/计算机操作系统 - 概述",
+ "/计算机基础/操作系统基础/计算机操作系统 - 死锁": "/notes/计算机操作系统 - 死锁",
+ "/计算机基础/操作系统基础/计算机操作系统 - 死锁.html": "/notes/计算机操作系统 - 死锁",
+ "/计算机基础/操作系统基础/计算机操作系统 - 死锁.md": "/notes/计算机操作系统 - 死锁",
+ "/计算机基础/操作系统基础/计算机操作系统 - 目录": "/notes/计算机操作系统 - 目录",
+ "/计算机基础/操作系统基础/计算机操作系统 - 目录.html": "/notes/计算机操作系统 - 目录",
+ "/计算机基础/操作系统基础/计算机操作系统 - 目录.md": "/notes/计算机操作系统 - 目录",
+ "/计算机基础/操作系统基础/计算机操作系统 - 设备管理": "/notes/计算机操作系统 - 设备管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 设备管理.html": "/notes/计算机操作系统 - 设备管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 设备管理.md": "/notes/计算机操作系统 - 设备管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 进程管理": "/notes/计算机操作系统 - 进程管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 进程管理.html": "/notes/计算机操作系统 - 进程管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 进程管理.md": "/notes/计算机操作系统 - 进程管理",
+ "/计算机基础/操作系统基础/计算机操作系统 - 链接": "/notes/计算机操作系统 - 链接",
+ "/计算机基础/操作系统基础/计算机操作系统 - 链接.html": "/notes/计算机操作系统 - 链接",
+ "/计算机基础/操作系统基础/计算机操作系统 - 链接.md": "/notes/计算机操作系统 - 链接",
+ "/计算机基础/网络基础/计算机网络 - 传输层": "/notes/计算机网络 - 传输层",
+ "/计算机基础/网络基础/计算机网络 - 传输层.html": "/notes/计算机网络 - 传输层",
+ "/计算机基础/网络基础/计算机网络 - 传输层.md": "/notes/计算机网络 - 传输层",
+ "/计算机基础/网络基础/计算机网络 - 应用层": "/notes/计算机网络 - 应用层",
+ "/计算机基础/网络基础/计算机网络 - 应用层.html": "/notes/计算机网络 - 应用层",
+ "/计算机基础/网络基础/计算机网络 - 应用层.md": "/notes/计算机网络 - 应用层",
+ "/计算机基础/网络基础/计算机网络 - 概述": "/notes/计算机网络 - 概述",
+ "/计算机基础/网络基础/计算机网络 - 概述.html": "/notes/计算机网络 - 概述",
+ "/计算机基础/网络基础/计算机网络 - 概述.md": "/notes/计算机网络 - 概述",
+ "/计算机基础/网络基础/计算机网络 - 物理层": "/notes/计算机网络 - 物理层",
+ "/计算机基础/网络基础/计算机网络 - 物理层.html": "/notes/计算机网络 - 物理层",
+ "/计算机基础/网络基础/计算机网络 - 物理层.md": "/notes/计算机网络 - 物理层",
+ "/计算机基础/网络基础/计算机网络 - 目录": "/notes/计算机网络 - 目录",
+ "/计算机基础/网络基础/计算机网络 - 目录.html": "/notes/计算机网络 - 目录",
+ "/计算机基础/网络基础/计算机网络 - 目录.md": "/notes/计算机网络 - 目录",
+ "/计算机基础/网络基础/计算机网络 - 网络层": "/notes/计算机网络 - 网络层",
+ "/计算机基础/网络基础/计算机网络 - 网络层.html": "/notes/计算机网络 - 网络层",
+ "/计算机基础/网络基础/计算机网络 - 网络层.md": "/notes/计算机网络 - 网络层",
+ "/计算机基础/网络基础/计算机网络 - 链路层": "/notes/计算机网络 - 链路层",
+ "/计算机基础/网络基础/计算机网络 - 链路层.html": "/notes/计算机网络 - 链路层",
+ "/计算机基础/网络基础/计算机网络 - 链路层.md": "/notes/计算机网络 - 链路层"
+}
diff --git a/website/templates/search.js b/website/templates/search.js
new file mode 100644
index 00000000..bed8b03d
--- /dev/null
+++ b/website/templates/search.js
@@ -0,0 +1,118 @@
+(function () {
+ 'use strict';
+
+ function normalize(value) {
+ return String(value).normalize('NFKC').toLowerCase().replace(/\s+/g, ' ').trim();
+ }
+
+ function search(index, query, limit) {
+ var terms = normalize(query).slice(0, 120).split(' ').filter(Boolean);
+ if (!terms.length) return [];
+ var results = [];
+ index.documents.forEach(function (doc) {
+ var page = normalize(doc.title);
+ doc.sections.forEach(function (section) {
+ var heading = normalize(section.title);
+ var body = normalize(section.text);
+ var text = heading + ' ' + page + ' ' + body;
+ if (!terms.every(function (term) { return text.includes(term); })) return;
+ var score = terms.reduce(function (sum, term) {
+ return sum + (heading.includes(term) ? 40 : 0) + (page.includes(term) ? 15 : 0) +
+ (body.includes(term) ? Math.min(body.split(term).length - 1, 6) : 0);
+ }, 0);
+ if (heading === normalize(query)) score += 100;
+ results.push({ page: doc.title, path: doc.path, title: section.title || doc.title,
+ id: section.id, text: section.text, score: score });
+ });
+ });
+ return results.sort(function (a, b) { return b.score - a.score; }).slice(0, limit || 20);
+ }
+
+ if (typeof module !== 'undefined' && module.exports) {
+ module.exports = { search: search, normalize: normalize };
+ return;
+ }
+
+ var indexPromise;
+ function loadIndex() {
+ if (!indexPromise) {
+ indexPromise = fetch(window.CS_NOTES_SEARCH_INDEX, { credentials: 'omit' }).then(function (response) {
+ if (!response.ok) throw new Error('Search index unavailable');
+ return response.json();
+ }).then(function (index) {
+ if (index.version !== 1 || !Array.isArray(index.documents)) throw new Error('Invalid search index');
+ return index;
+ }).catch(function (error) { indexPromise = null; throw error; });
+ }
+ return indexPromise;
+ }
+
+ function escapeHtml(value) {
+ return String(value).replace(/[&<>"']/g, function (character) {
+ return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[character];
+ });
+ }
+
+ function snippet(text, query) {
+ var first = normalize(query).split(' ')[0];
+ var position = normalize(text).indexOf(first);
+ var start = Math.max(0, position - 45);
+ return (start ? '…' : '') + text.slice(start, start + 170) + (text.length > start + 170 ? '…' : '');
+ }
+
+ function mountSearch() {
+ var sidebar = document.querySelector('.sidebar');
+ if (!sidebar || sidebar.querySelector('.site-search')) return;
+ var wrapper = document.createElement('div');
+ wrapper.className = 'search site-search';
+ wrapper.innerHTML = '' +
+ '' +
+ '';
+ sidebar.insertBefore(wrapper, sidebar.firstChild);
+ var input = wrapper.querySelector('input');
+ var status = wrapper.querySelector('.search-status');
+ var panel = wrapper.querySelector('.results-panel');
+ var timer;
+ var sequence = 0;
+
+ function update() {
+ var query = input.value.trim();
+ var request = ++sequence;
+ panel.hidden = !query;
+ panel.innerHTML = '';
+ if (!query) { status.textContent = ''; return; }
+ status.textContent = '正在搜索…';
+ loadIndex().then(function (index) {
+ if (request !== sequence) return;
+ var results = search(index, query);
+ status.textContent = results.length ? '找到 ' + results.length + ' 个相关章节' : '没有找到相关内容';
+ panel.innerHTML = results.map(function (result) {
+ var url = '/#' + result.path.split('/').map(encodeURIComponent).join('/') +
+ (result.id ? '?id=' + encodeURIComponent(result.id) : '');
+ return '' + escapeHtml(result.title) +
+ '' + escapeHtml(result.page) + '' + escapeHtml(snippet(result.text, query)) + '
';
+ }).join('');
+ }).catch(function () {
+ if (request === sequence) status.textContent = '搜索暂时不可用,请稍后重试。';
+ });
+ }
+ input.addEventListener('focus', function () { loadIndex().catch(function () {}); });
+ input.addEventListener('input', function () { clearTimeout(timer); timer = setTimeout(update, 140); });
+ input.addEventListener('keydown', function (event) {
+ if (event.key === 'Escape') { input.value = ''; update(); }
+ var first = panel.querySelector('a');
+ if (first && event.key === 'ArrowDown') { event.preventDefault(); first.focus(); }
+ if (first && event.key === 'Enter') { event.preventDefault(); first.click(); }
+ });
+ panel.addEventListener('click', function (event) {
+ if (event.target.closest('a') && window.matchMedia('(max-width: 768px)').matches) {
+ document.body.classList.remove('close');
+ }
+ });
+ }
+
+ window.$docsify.plugins.push(function (hook) {
+ hook.mounted(mountSearch);
+ hook.doneEach(mountSearch);
+ });
+})();
diff --git a/website/templates/site.css b/website/templates/site.css
new file mode 100644
index 00000000..895c3192
--- /dev/null
+++ b/website/templates/site.css
@@ -0,0 +1,54 @@
+:root { --theme-color: #369b72; }
+body, .sidebar, .sidebar-toggle { background: #f3f2ee; }
+body { color: #34495e; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; }
+.app-name { font-weight: 650 !important; letter-spacing: .02em; }
+.sidebar { padding-top: 24px; border-right: 1px solid #e2e3dc; }
+.sidebar .search { border-bottom: 1px solid #e2e3dc; margin-bottom: 20px; }
+.search input { background: #fff !important; border-radius: 6px; }
+.sidebar-nav > ul { padding-left: 18px; }
+.sidebar ul li { margin: 7px 0; }
+.sidebar ul li strong { font-size: 13px; letter-spacing: .08em; color: #718078; }
+.sidebar ul li a { font-size: 14px; }
+.markdown-section { max-width: 960px; padding: 36px 48px 100px; }
+.markdown-section h1 { margin: 1rem 0 2rem; font-size: 2rem; }
+.markdown-section h2 { margin: 2.8rem 0 1.2rem; padding-bottom: .45rem; border-bottom: 1px solid #dfe3da; }
+.markdown-section h3 { margin-top: 2rem; }
+.markdown-section p, .markdown-section ul, .markdown-section ol { line-height: 1.95; }
+.markdown-section img { max-width: 100%; height: auto; border-radius: 4px; }
+.markdown-section pre { background: #fafbf8; border-radius: 6px; border: 1px solid #e2e6dc; }
+.markdown-section pre > code { font-family: "SFMono-Regular", Consolas, monospace; line-height: 1.65; }
+.markdown-section table { display: block; overflow: auto; }
+.markdown-section tr:nth-child(2n) { background: #f8f9f5; }
+.markdown-section td, .markdown-section th { border-color: #dfe3da; }
+.docsify-copy-code-button { font-family: inherit !important; }
+.search .matching-post { border-color: #dde3d8; }
+.site-footer { border-top: 1px solid #dfe3da; margin-top: 64px; padding-top: 20px; color: #7c877d; font-size: 12px; text-align: center; }
+.site-footer a { color: inherit; font-weight: 400; }
+.topic-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 10px; margin: 18px 0; }
+.topic-grid a { display: flex; align-items: center; justify-content: center; gap: 7px; padding: 13px 8px; border: 1px solid #dfe3da; border-radius: 7px; background: #fafbf8; text-decoration: none; font-size: 14px; white-space: nowrap; }
+.topic-grid a:hover, .topic-grid a:focus-visible { background: #e8f1e9; border-color: #369b72; }
+.site-search { padding: 8px 15px; }
+.site-search input { box-sizing: border-box; width: 100%; min-height: 42px; padding: 10px; border: 1px solid #dfe3da; color: #34495e; font-size: 15px; }
+.site-search input:focus { outline: 2px solid #369b72; outline-offset: 1px; }
+.search-status { color: #718078; font-size: 12px; margin: 7px 0; }
+.search-status:empty { display: none; }
+.site-search .matching-post { display: block; padding: 12px 0; border-bottom: 1px solid #dde3d8; text-decoration: none; }
+.matching-post strong, .matching-post small { display: block; }
+.matching-post strong { color: #369b72; font-size: 14px; }
+.matching-post small { color: #718078; margin: 5px 0; font-size: 12px; }
+.matching-post p { color: #34495e; margin: 4px 0; font-size: 13px; line-height: 1.7; overflow-wrap: anywhere; }
+.article-toc { border: 1px solid #dfe3da; border-radius: 7px; padding: 12px 18px; margin: 20px 0 28px; background: #fafbf8; }
+.article-toc summary { color: #369b72; font-weight: 600; cursor: pointer; min-height: 24px; }
+.article-toc > ul { margin-bottom: 0; }
+@media (min-width: 769px) { .content { padding-top: 12px; } }
+@media (max-width: 768px) {
+ .markdown-section { padding: 24px 22px 80px; }
+ .markdown-section h1 { font-size: 1.65rem; }
+ .markdown-section pre { padding: 14px; }
+ .topic-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
+ .topic-grid a { min-height: 44px; padding: 8px; }
+ .site-logo { width: 110px; }
+ .sidebar-toggle { width: 48px; height: 48px; padding: 13px; background: rgba(243, 242, 238, .95); }
+ .sidebar ul li a { min-height: 28px; line-height: 2; }
+ .article-toc summary { min-height: 32px; line-height: 2; }
+}
diff --git a/website/templates/site.js b/website/templates/site.js
new file mode 100644
index 00000000..77fb14df
--- /dev/null
+++ b/website/templates/site.js
@@ -0,0 +1,65 @@
+(function () {
+ function decode(value) {
+ try { return decodeURIComponent(value); } catch (error) { return value; }
+ }
+ function encodedRoute(path) { return path.split('/').map(encodeURIComponent).join('/'); }
+ function preserveLegacyLinks() {
+ var hash = location.hash;
+ var legacy = (window.CS_NOTES_LEGACY_ROUTES || {})[decode(location.pathname)];
+ if (legacy) {
+ var heading = hash && !hash.startsWith('#/') ? '?id=' + encodeURIComponent(decode(hash.slice(1))) : '';
+ location.replace('/#' + encodedRoute(legacy) + heading);
+ return;
+ }
+ var route = decode(hash.split('?')[0].replace(/^#\//, '').replace(/\.md$/, ''));
+ if (route && !route.includes('/') && window.CS_NOTES_PATHS.includes('/notes/' + route)) {
+ location.replace('#/notes/' + encodeURIComponent(route) + (hash.includes('?') ? '?' + hash.split('?').slice(1).join('?') : ''));
+ }
+ }
+ preserveLegacyLinks();
+ window.addEventListener('hashchange', preserveLegacyLinks);
+ window.$docsify = {
+ name: 'CS-Notes',
+ repo: 'https://github.com/CyC2018/CS-Notes',
+ homepage: 'README.md',
+ loadSidebar: true,
+ alias: { '/.*/_sidebar.md': '/_sidebar.md' },
+ subMaxLevel: 0,
+ auto2top: true,
+ notFoundPage: true,
+ relativePath: false,
+ copyCode: { buttonText: '复制', errorText: '复制失败', successText: '已复制' },
+ plugins: [function (hook, vm) {
+ hook.afterEach(function (content) {
+ content = content.replace(/
]*>/gi, function (tag) {
+ if (!/\bloading\s*=/i.test(tag)) tag = tag.replace(/
5 &&
+ Array.from(list.querySelectorAll('a')).every(function (link) { return link.getAttribute('href').includes('?id='); })) {
+ var details = document.createElement('details');
+ details.className = 'article-toc';
+ details.innerHTML = '本文目录';
+ list.replaceWith(details);
+ details.appendChild(list);
+ }
+ return document.body.innerHTML + '';
+ });
+ hook.doneEach(function () {
+ var heading = document.querySelector('.markdown-section h1, .markdown-section h2');
+ document.title = (vm.route.path === '/' || !heading ? 'CS-Notes' : heading.textContent.trim() + ' · CS-Notes') + ' · CyC2018';
+ document.querySelectorAll('.markdown-section img').forEach(function (img) {
+ img.loading = 'lazy';
+ img.decoding = 'async';
+ });
+ document.querySelectorAll('.article-toc').forEach(function (toc) {
+ toc.open = window.matchMedia('(min-width: 769px)').matches;
+ });
+ });
+ }]
+ };
+})();
diff --git a/website/templates/vendor/docsify-LICENSE b/website/templates/vendor/docsify-LICENSE
new file mode 100644
index 00000000..a2155380
--- /dev/null
+++ b/website/templates/vendor/docsify-LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 - present Docsify Contributors (https://github.com/docsifyjs/docsify/graphs/contributors)
+
+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/website/templates/vendor/docsify-copy-code-LICENSE b/website/templates/vendor/docsify-copy-code-LICENSE
new file mode 100644
index 00000000..d855bc61
--- /dev/null
+++ b/website/templates/vendor/docsify-copy-code-LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 JP Erasmus
+
+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/website/templates/vendor/docsify-copy-code.min.js b/website/templates/vendor/docsify-copy-code.min.js
new file mode 100644
index 00000000..c91d4203
--- /dev/null
+++ b/website/templates/vendor/docsify-copy-code.min.js
@@ -0,0 +1,9 @@
+/*!
+ * docsify-copy-code
+ * v3.0.2
+ * https://github.com/jperasmus/docsify-copy-code
+ * (c) 2017-2025 JP Erasmus
+ * MIT license
+ */
+!function(){"use strict";function e(o){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(o)}!function(e,o){void 0===o&&(o={});var t=o.insertAt;if(e&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=e:c.appendChild(document.createTextNode(e))}}(".docsify-copy-code-button,.docsify-copy-code-button>span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{background:grey;background:var(--theme-color,grey);border:0;border-radius:0;color:#fff;font-size:1em;opacity:0;outline:0;overflow:visible;padding:.65em .8em;position:absolute;right:0;top:0;z-index:1}.docsify-copy-code-button>span{background:inherit;border-radius:3px;pointer-events:none}.docsify-copy-code-button>.error,.docsify-copy-code-button>.success{font-size:.825em;opacity:0;padding:.5em .65em;position:absolute;right:0;top:50%;transform:translateY(-50%);z-index:-100}.docsify-copy-code-button.error>.error,.docsify-copy-code-button.success>.success{opacity:1;right:100%;transform:translate(-25%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}.docsify-copy-code-button>[aria-live]{height:1px;left:-10000px;overflow:hidden;position:absolute;top:auto;width:1px}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(e,o){e.ready((function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")}))}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,t){var n={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};o.doneEach((function(){var o=Array.from(document.querySelectorAll("pre[data-lang]"));t.config.copyCode&&Object.keys(n).forEach((function(o){var c=t.config.copyCode[o];"string"==typeof c?n[o]=c:"object"===e(c)&&Object.keys(c).some((function(e){var t=location.href.indexOf(e)>-1;return n[o]=t?c[e]:n[o],t}))}));var c=['"].join("");o.forEach((function(e){e.insertAdjacentHTML("beforeend",c)}))})),o.mounted((function(){var e=document.querySelector(".content");e&&e.addEventListener("click",(function(e){if(e.target.classList.contains("docsify-copy-code-button")){var o="BUTTON"===e.target.tagName?e.target:e.target.parentNode,t=document.createRange(),c=o.parentNode.querySelector("code"),i=o.querySelector("[aria-live]"),r=window.getSelection();t.selectNode(c),r&&(r.removeAllRanges(),r.addRange(t));try{document.execCommand("copy")&&(o.classList.add("success"),i.innerText=n.successText,setTimeout((function(){o.classList.remove("success"),i.innerText=""}),1e3))}catch(e){console.error("docsify-copy-code: ".concat(e)),o.classList.add("error"),i.innerText=n.errorText,setTimeout((function(){o.classList.remove("error"),i.innerText=""}),1e3)}setTimeout((function(){e.target.blur()}),1500),(r=window.getSelection())&&("function"==typeof r.removeRange?r.removeRange(t):"function"==typeof r.removeAllRanges&&r.removeAllRanges())}}))}))}].concat(window.$docsify.plugins||[])}();
+//# sourceMappingURL=docsify-copy-code.min.js.map
diff --git a/website/templates/vendor/docsify.min.js b/website/templates/vendor/docsify.min.js
new file mode 100644
index 00000000..80be8c5f
--- /dev/null
+++ b/website/templates/vendor/docsify.min.js
@@ -0,0 +1 @@
+!function(){function c(i){var o=Object.create(null);return function(e){var n=f(e)?e:JSON.stringify(e);return o[n]||(o[n]=i(e))}}var a=c(function(e){return e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}),u=Object.prototype.hasOwnProperty,m=Object.assign||function(e){for(var n=arguments,i=1;i=e||n.classList.contains("hidden")?S(h,"add","sticky"):S(h,"remove","sticky"))}function ee(e,n,o,i){var t=[];null!=(n=l(n))&&(t=k(n,"a"));var a,r=decodeURI(e.toURL(e.getCurrentPath()));return t.sort(function(e,n){return n.href.length-e.href.length}).forEach(function(e){var n=decodeURI(e.getAttribute("href")),i=o?e.parentNode:e;e.title=e.title||e.innerText,0!==r.indexOf(n)||a?S(i,"remove","active"):(a=e,S(i,"add","active"))}),i&&(v.title=a?a.title||a.innerText+" - "+J:J),a}function ne(e,n){for(var i=0;ithis.end&&e>=this.next}[this.direction]}},{key:"_defaultEase",value:function(e,n,i,o){return(e/=o/2)<1?i/2*e*e+n:-i/2*(--e*(e-2)-1)+n}}]),re);function re(){var e=0c){n=n||p;break}n=p}!n||(r=fe[ve(e,n.getAttribute("data-id"))])&&r!==a&&(a&&a.classList.remove("active"),r.classList.add("active"),a=r,!pe&&h.classList.contains("sticky")&&(e=i.clientHeight,r=a.offsetTop+a.clientHeight+40,a=a.offsetTop>=t.scrollTop&&r<=t.scrollTop+e,i.scrollTop=a?t.scrollTop:+r"']/),xe=/[&<>"']/g,Se=/[<>"']|&(?!#?\w+;)/,Ae=/[<>"']|&(?!#?\w+;)/g,$e={"&":"&","<":"<",">":">",'"':""","'":"'"};var ze=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function Fe(e){return e.replace(ze,function(e,n){return"colon"===(n=n.toLowerCase())?":":"#"===n.charAt(0)?"x"===n.charAt(1)?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1)):""})}var Ee=/(^|[^\[])\^/g;var Re=/[^\w:]/g,Te=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var Ce={},je=/^[^:]+:\/*[^/]*$/,Le=/^([^:]+:)[\s\S]*$/,Oe=/^([^:]+:\/*[^/]*)[\s\S]*$/;function qe(e,n){Ce[" "+e]||(je.test(e)?Ce[" "+e]=e+"/":Ce[" "+e]=Pe(e,"/",!0));var i=-1===(e=Ce[" "+e]).indexOf(":");return"//"===n.substring(0,2)?i?n:e.replace(Le,"$1")+n:"/"===n.charAt(0)?i?n:e.replace(Oe,"$1")+n:e+n}function Pe(e,n,i){var o=e.length;if(0===o)return"";for(var t=0;tn)i.splice(n);else for(;i.length>=1,e+=e;return i+e},We=we.defaults,Xe=Be,Qe=Ze,Je=Me,Ke=Ve;function en(e,n,i){var o=n.href,t=n.title?Je(n.title):null,n=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:i,href:o,title:t,text:n}:{type:"image",raw:i,href:o,title:t,text:Je(n)}}var nn=function(){function e(e){this.options=e||We}return e.prototype.space=function(e){e=this.rules.block.newline.exec(e);if(e)return 1=i.length?e.slice(i.length):e}).join("\n")}(i,n[3]||"");return{type:"code",raw:i,lang:n[2]&&n[2].trim(),text:e}}},e.prototype.heading=function(e){var n=this.rules.block.heading.exec(e);if(n){var i=n[2].trim();return/#$/.test(i)&&(e=Xe(i,"#"),!this.options.pedantic&&e&&!/ $/.test(e)||(i=e.trim())),{type:"heading",raw:n[0],depth:n[1].length,text:i}}},e.prototype.nptable=function(e){e=this.rules.block.nptable.exec(e);if(e){var n={type:"table",header:Qe(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(n.header.length===n.align.length){for(var i=n.align.length,o=0;o ?/gm,"");return{type:"blockquote",raw:n[0],text:e}}},e.prototype.list=function(e){e=this.rules.block.list.exec(e);if(e){for(var n,i,o,t,a,r=e[0],c=e[2],u=1s[1].length:o[1].length>s[0].length||3/i.test(e[0])&&(n=!1),!i&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?i=!0:i&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(i=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:n,inRawBlock:i,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Je(e[0]):e[0]}},e.prototype.link=function(e){var n=this.rules.inline.link.exec(e);if(n){e=n[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;var i=Xe(e.slice(0,-1),"\\");if((e.length-i.length)%2==0)return}else{var o=Ke(n[2],"()");-1$/.test(e)?i.slice(1):i.slice(1,-1):i)&&i.replace(this.rules.inline._escapes,"$1"),title:o&&o.replace(this.rules.inline._escapes,"$1")},n[0])}},e.prototype.reflink=function(e,n){if((i=this.rules.inline.reflink.exec(e))||(i=this.rules.inline.nolink.exec(e))){var e=(i[2]||i[1]).replace(/\s+/g," ");if((e=n[e.toLowerCase()])&&e.href)return en(i,e,i[0]);var i=i[0].charAt(0);return{type:"text",raw:i,text:i}}},e.prototype.strong=function(e,n,i){void 0===i&&(i="");var o=this.rules.inline.strong.start.exec(e);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){n=n.slice(-1*e.length);var t,a="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(a.lastIndex=0;null!=(o=a.exec(n));)if(t=this.rules.inline.strong.middle.exec(n.slice(0,o.index+3)))return{type:"strong",raw:e.slice(0,t[0].length),text:e.slice(2,t[0].length-2)}}},e.prototype.em=function(e,n,i){void 0===i&&(i="");var o=this.rules.inline.em.start.exec(e);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){n=n.slice(-1*e.length);var t,a="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(a.lastIndex=0;null!=(o=a.exec(n));)if(t=this.rules.inline.em.middle.exec(n.slice(0,o.index+2)))return{type:"em",raw:e.slice(0,t[0].length),text:e.slice(1,t[0].length-1)}}},e.prototype.codespan=function(e){var n=this.rules.inline.code.exec(e);if(n){var i=n[2].replace(/\n/g," "),o=/[^ ]/.test(i),e=/^ /.test(i)&&/ $/.test(i);return o&&e&&(i=i.substring(1,i.length-1)),i=Je(i,!0),{type:"codespan",raw:n[0],text:i}}},e.prototype.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},e.prototype.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2]}},e.prototype.autolink=function(e,n){e=this.rules.inline.autolink.exec(e);if(e){var i,n="@"===e[2]?"mailto:"+(i=Je(this.options.mangle?n(e[1]):e[1])):i=Je(e[1]);return{type:"link",raw:e[0],text:i,href:n,tokens:[{type:"text",raw:i,text:i}]}}},e.prototype.url=function(e,n){var i,o,t,a;if(i=this.rules.inline.url.exec(e)){if("@"===i[2])t="mailto:"+(o=Je(this.options.mangle?n(i[0]):i[0]));else{for(;a=i[0],i[0]=this.rules.inline._backpedal.exec(i[0])[0],a!==i[0];);o=Je(i[0]),t="www."===i[1]?"http://"+o:o}return{type:"link",raw:i[0],text:o,href:t,tokens:[{type:"text",raw:o,text:o}]}}},e.prototype.inlineText=function(e,n,i){e=this.rules.inline.text.exec(e);if(e){i=n?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Je(e[0]):e[0]:Je(this.options.smartypants?i(e[0]):e[0]);return{type:"text",raw:e[0],text:i}}},e}(),Ze=De,Ve=Ne,De=Ue,Ne={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:Ze,table:Ze,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Ne.def=Ve(Ne.def).replace("label",Ne._label).replace("title",Ne._title).getRegex(),Ne.bullet=/(?:[*+-]|\d{1,9}[.)])/,Ne.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,Ne.item=Ve(Ne.item,"gm").replace(/bull/g,Ne.bullet).getRegex(),Ne.listItemStart=Ve(/^( *)(bull)/).replace("bull",Ne.bullet).getRegex(),Ne.list=Ve(Ne.list).replace(/bull/g,Ne.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Ne.def.source+")").getRegex(),Ne._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Ne._comment=/|$)/,Ne.html=Ve(Ne.html,"i").replace("comment",Ne._comment).replace("tag",Ne._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ne.paragraph=Ve(Ne._paragraph).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.blockquote=Ve(Ne.blockquote).replace("paragraph",Ne.paragraph).getRegex(),Ne.normal=De({},Ne),Ne.gfm=De({},Ne.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Ne.gfm.nptable=Ve(Ne.gfm.nptable).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.gfm.table=Ve(Ne.gfm.table).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.pedantic=De({},Ne.normal,{html:Ve("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Ne._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ze,paragraph:Ve(Ne.normal._paragraph).replace("hr",Ne.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Ne.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});Ze={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Ze,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Ze,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};Ze.punctuation=Ve(Ze.punctuation).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",Ze._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",Ze._comment=Ve(Ne._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Ze.em.start=Ve(Ze.em.start).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.em.middle=Ve(Ze.em.middle).replace(/punctuation/g,Ze._punctuation).replace(/overlapSkip/g,Ze._overlapSkip).getRegex(),Ze.em.endAst=Ve(Ze.em.endAst,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.em.endUnd=Ve(Ze.em.endUnd,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.start=Ve(Ze.strong.start).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.middle=Ve(Ze.strong.middle).replace(/punctuation/g,Ze._punctuation).replace(/overlapSkip/g,Ze._overlapSkip).getRegex(),Ze.strong.endAst=Ve(Ze.strong.endAst,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.endUnd=Ve(Ze.strong.endUnd,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.blockSkip=Ve(Ze._blockSkip,"g").getRegex(),Ze.overlapSkip=Ve(Ze._overlapSkip,"g").getRegex(),Ze._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Ze._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Ze._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Ze.autolink=Ve(Ze.autolink).replace("scheme",Ze._scheme).replace("email",Ze._email).getRegex(),Ze._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Ze.tag=Ve(Ze.tag).replace("comment",Ze._comment).replace("attribute",Ze._attribute).getRegex(),Ze._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Ze._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Ze._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Ze.link=Ve(Ze.link).replace("label",Ze._label).replace("href",Ze._href).replace("title",Ze._title).getRegex(),Ze.reflink=Ve(Ze.reflink).replace("label",Ze._label).getRegex(),Ze.reflinkSearch=Ve(Ze.reflinkSearch,"g").replace("reflink",Ze.reflink).replace("nolink",Ze.nolink).getRegex(),Ze.normal=De({},Ze),Ze.pedantic=De({},Ze.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Ve(/^!?\[(label)\]\((.*?)\)/).replace("label",Ze._label).getRegex(),reflink:Ve(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Ze._label).getRegex()}),Ze.gfm=De({},Ze.normal,{escape:Ve(Ze.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\'+(i?e:gn(e,!0))+"\n":""+(i?e:gn(e,!0))+"
\n"},e.prototype.blockquote=function(e){return"\n"+e+"
\n"},e.prototype.html=function(e){return e},e.prototype.heading=function(e,n,i,o){return this.options.headerIds?"\n":""+e+"\n"},e.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},e.prototype.list=function(e,n,i){var o=n?"ol":"ul";return"<"+o+(n&&1!==i?' start="'+i+'"':"")+">\n"+e+""+o+">\n"},e.prototype.listitem=function(e){return""+e+"\n"},e.prototype.checkbox=function(e){return" "},e.prototype.paragraph=function(e){return""+e+"
\n"},e.prototype.table=function(e,n){return"\n\n"+e+"\n"+(n=n&&""+n+"")+"
\n"},e.prototype.tablerow=function(e){return"\n"+e+"
\n"},e.prototype.tablecell=function(e,n){var i=n.header?"th":"td";return(n.align?"<"+i+' align="'+n.align+'">':"<"+i+">")+e+""+i+">\n"},e.prototype.strong=function(e){return""+e+""},e.prototype.em=function(e){return""+e+""},e.prototype.codespan=function(e){return""+e+""},e.prototype.br=function(){return this.options.xhtml?"
":"
"},e.prototype.del=function(e){return""+e+""},e.prototype.link=function(e,n,i){if(null===(e=dn(this.options.sanitize,this.options.baseUrl,e)))return i;e='"+i+""},e.prototype.image=function(e,n,i){if(null===(e=dn(this.options.sanitize,this.options.baseUrl,e)))return i;i='
":">"},e.prototype.text=function(e){return e},e}(),ln=function(){function e(){}return e.prototype.strong=function(e){return e},e.prototype.em=function(e){return e},e.prototype.codespan=function(e){return e},e.prototype.del=function(e){return e},e.prototype.html=function(e){return e},e.prototype.text=function(e){return e},e.prototype.link=function(e,n,i){return""+i},e.prototype.image=function(e,n,i){return""+i},e.prototype.br=function(){return""},e}(),vn=function(){function e(){this.seen={}}return e.prototype.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},e.prototype.getNextSafeSlug=function(e,n){var i=e,o=0;if(this.seen.hasOwnProperty(i))for(o=this.seen[e];i=e+"-"+ ++o,this.seen.hasOwnProperty(i););return n||(this.seen[e]=o,this.seen[i]=0),i},e.prototype.slug=function(e,n){void 0===n&&(n={});e=this.serialize(e);return this.getNextSafeSlug(e,n.dryrun)},e}(),hn=we.defaults,_n=Ie,mn=function(){function i(e){this.options=e||hn,this.options.renderer=this.options.renderer||new sn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ln,this.slugger=new vn}return i.parse=function(e,n){return new i(n).parse(e)},i.parseInline=function(e,n){return new i(n).parseInline(e)},i.prototype.parse=function(e,n){void 0===n&&(n=!0);for(var i,o,t,a,r,c,u,f,p,d,g,s,l,v,h,_="",m=e.length,b=0;bAn error occurred:"+wn(e.message+"",!0)+"
";throw e}}xn.options=xn.setOptions=function(e){return bn(xn.defaults,e),yn(xn.defaults),xn},xn.getDefaults=Me,xn.defaults=we,xn.use=function(a){var n,e=bn({},a);if(a.renderer){var i,r=xn.defaults.renderer||new sn;for(i in a.renderer)!function(o){var t=r[o];r[o]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var i=a.renderer[o].apply(r,e);return i=!1===i?t.apply(r,e):i}}(i);e.renderer=r}if(a.tokenizer){var t,c=xn.defaults.tokenizer||new nn;for(t in a.tokenizer)!function(){var o=c[t];c[t]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var i=a.tokenizer[t].apply(c,e);return i=!1===i?o.apply(c,e):i}}();e.tokenizer=c}a.walkTokens&&(n=xn.defaults.walkTokens,e.walkTokens=function(e){a.walkTokens(e),n&&n(e)}),xn.setOptions(e)},xn.walkTokens=function(e,n){for(var i=0,o=e;iAn error occurred:"+wn(e.message+"",!0)+"
";throw e}},xn.Parser=mn,xn.parser=mn.parse,xn.Renderer=sn,xn.TextRenderer=ln,xn.Lexer=fn,xn.lexer=fn.lex,xn.Tokenizer=nn,xn.Slugger=vn;var Sn=xn.parse=xn;function An(e,i){if(void 0===i&&(i=''),!e||!e.length)return"";var o="";return e.forEach(function(e){var n=e.title.replace(/(<([^>]+)>)/g,"");o+=''+e.title+"",e.children&&(o+=An(e.children,i))}),i.replace("{inner}",o)}function $n(e,n){return''+n.slice(5).trim()+"
"}function zn(e,o){var t=[],a={};return e.forEach(function(e){var n=e.level||1,i=n-1;o?@[\]^`{|}~]/g;function Rn(e){return e.toLowerCase()}function Tn(e){if("string"!=typeof e)return"";var n=e.trim().replace(/[A-Z]+/g,Rn).replace(/<[^>]+>/g,"").replace(En,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),e=Fn[n],e=u.call(Fn,n)?e+1:0;return n=(Fn[n]=e)?n+"-"+e:n}Tn.clear=function(){Fn={}};var Cn={baseURL:"https://github.githubassets.com/images/icons/emoji/",data:{100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"}};function jn(e,t){return e.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g,function(e){return e.replace(/:/g,"__colon__")}).replace(//g,function(e){return e.replace(/:/g,"__colon__")}).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi,function(e){return e.replace(/:/g,"__colon__")}).replace(/:([a-z0-9_\-+]+?):/g,function(e,n){return i=e,o=n,e=t,n=Cn.data[o],i,i=n?e&&/unicode/.test(n)?''+n.replace("unicode/","").replace(/\.png.*/,"").split("-").map(function(e){return""+e+";"}).join("").concat("︎")+"":'
':i;var i,o}).replace(/__colon__/g,":")}function Ln(e){var o={};return{str:e=(e=void 0===e?"":e)&&e.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,function(e,n,i){return-1===n.indexOf(":")?(o[n]=i&&i.replace(/"/g,"")||!0,""):e}).trim(),config:o}}function On(e){return(e=void 0===e?"":e).replace(/(<\/?a.*?>)/gi,"")}var qn,Pn=be(function(e){var u,f,p,d,n,g=function(u){var i=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},R={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof T?new T(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=r.reach);m+=_.value.length,_=_.next){var b=_.value;if(i.length>n.length)return;if(!(b instanceof T)){var k,w=1;if(l){if(!(k=C(h,m,n,s))||k.index>=n.length)break;var y=k.index,x=k.index+k[0].length,S=m;for(S+=_.value.length;S<=y;)_=_.next,S+=_.value.length;if(S-=_.value.length,m=S,_.value instanceof T)continue;for(var A=_;A!==i.tail&&(Sr.reach&&(r.reach=E);b=_.prev;z&&(b=j(i,b,z),m+=z.length),L(i,b,w);$=new T(c,g?R.tokenize($,g):$,v,$);_=j(i,b,$),F&&j(i,_,F),1r.reach&&(r.reach=E.reach))}}}}}(e,t,n,t.head,0),function(e){var n=[],i=e.head.next;for(;i!==e.tail;)n.push(i.value),i=i.next;return n}(t)},hooks:{all:{},add:function(e,n){var i=R.hooks.all;i[e]=i[e]||[],i[e].push(n)},run:function(e,n){var i=R.hooks.all[e];if(i&&i.length)for(var o,t=0;o=i[t++];)o(n)}},Token:T};function T(e,n,i,o){this.type=e,this.content=n,this.alias=i,this.length=0|(o||"").length}function C(e,n,i,o){e.lastIndex=n;i=e.exec(i);return i&&o&&i[1]&&(o=i[1].length,i.index+=o,i[0]=i[0].slice(o)),i}function a(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function j(e,n,i){var o=n.next,i={value:i,prev:n,next:o};return n.next=i,o.prev=i,e.length++,i}function L(e,n,i){for(var o=n.next,t=0;t"+t.content+""+t.tag+">"},!u.document)return u.addEventListener&&(R.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),i=n.language,e=n.code,n=n.immediateClose;u.postMessage(R.highlight(e,R.languages[i],i)),n&&u.close()},!1)),R;var o=R.util.currentScript();function t(){R.manual||R.highlightAll()}return o&&(R.filename=o.src,o.hasAttribute("data-manual")&&(R.manual=!0)),R.manual||("loading"===(e=document.readyState)||"interactive"===e&&o&&o.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)),R}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=g),void 0!==me&&(me.Prism=g),g.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},g.languages.markup.tag.inside["attr-value"].inside.entity=g.languages.markup.entity,g.languages.markup.doctype.inside["internal-subset"].inside=g.languages.markup,g.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(g.languages.markup.tag,"addInlined",{value:function(e,n){var i={};i["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:g.languages[n]},i.cdata=/^$/i;i={"included-cdata":{pattern://i,inside:i}};i["language-"+n]={pattern:/[\s\S]+/,inside:g.languages[n]};n={};n[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:i},g.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(g.languages.markup.tag,"addAttribute",{value:function(e,n){g.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:g.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),g.languages.html=g.languages.markup,g.languages.mathml=g.languages.markup,g.languages.svg=g.languages.markup,g.languages.xml=g.languages.extend("markup",{}),g.languages.ssml=g.languages.xml,g.languages.atom=g.languages.xml,g.languages.rss=g.languages.xml,function(e){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+n.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;e=e.languages.markup;e&&(e.tag.addInlined("style","css"),e.tag.addAttribute("style","css"))}(g),g.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},g.languages.javascript=g.languages.extend("clike",{"class-name":[g.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),g.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,g.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:g.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:g.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:g.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:g.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:g.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),g.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:g.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),g.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),g.languages.markup&&(g.languages.markup.tag.addInlined("script","javascript"),g.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),g.languages.js=g.languages.javascript,void 0!==g&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),u={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},d="pre[data-src]:not(["+(f="data-src-status")+'="loaded"]):not(['+f+'="'+(p="loading")+'"])',g.hooks.add("before-highlightall",function(e){e.selector+=", "+d}),g.hooks.add("before-sanity-check",function(e){var t,n,i,o,a,r,c=e.element;c.matches(d)&&(e.code="",c.setAttribute(f,p),(t=c.appendChild(document.createElement("CODE"))).textContent="Loading…",i=c.getAttribute("data-src"),"none"===(e=e.language)&&(n=(/\.(\w+)$/.exec(i)||[,"none"])[1],e=u[n]||n),g.util.setLanguage(t,e),g.util.setLanguage(c,e),(n=g.plugins.autoloader)&&n.loadLanguages(e),i=i,o=function(e){c.setAttribute(f,"loaded");var n,i,o=function(e){if(i=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||"")){var n=Number(i[1]),e=i[2],i=i[3];return e?i?[n,Number(i)]:[n,void 0]:[n,n]}}(c.getAttribute("data-range"));o&&(n=e.split(/\r\n?|\n/g),i=o[0],o=null==o[1]?n.length:o[1],i<0&&(i+=n.length),i=Math.max(0,Math.min(i-1,n.length)),o<0&&(o+=n.length),o=Math.max(0,Math.min(o,n.length)),e=n.slice(i,o).join("\n"),c.hasAttribute("data-start")||c.setAttribute("data-start",String(i+1))),t.textContent=e,g.highlightElement(t)},a=function(e){c.setAttribute(f,"failed"),t.textContent=e},(r=new XMLHttpRequest).open("GET",i,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status<400&&r.responseText?o(r.responseText):400<=r.status?a("✖ Error "+r.status+" while fetching file: "+r.statusText):a("✖ Error: File does not exist or is empty"))},r.send(null))}),n=!(g.plugins.fileHighlight={highlight:function(e){for(var n,i=(e||document).querySelectorAll(d),o=0;n=i[o++];)g.highlightElement(n)}}),g.fileHighlight=function(){n||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),n=!0),g.plugins.fileHighlight.highlight.apply(this,arguments)})});function Mn(e,n){return"___"+e.toUpperCase()+n+"___"}qn=Prism,Object.defineProperties(qn.languages["markup-templating"]={},{buildPlaceholders:{value:function(o,t,e,a){var r;o.language===t&&(r=o.tokenStack=[],o.code=o.code.replace(e,function(e){if("function"==typeof a&&!a(e))return e;for(var n,i=r.length;-1!==o.code.indexOf(n=Mn(t,i));)++i;return r[i]=e,n}),o.grammar=qn.languages.markup)}},tokenizePlaceholders:{value:function(f,p){var d,g;f.language===p&&f.tokenStack&&(f.grammar=qn.languages[p],d=0,g=Object.keys(f.tokenStack),function e(n){for(var i=0;i=g.length);i++){var o,t,a,r,c,u=n[i];"string"==typeof u||u.content&&"string"==typeof u.content?(t=g[d],a=f.tokenStack[t],o="string"==typeof u?u:u.content,c=Mn(p,t),-1<(r=o.indexOf(c))&&(++d,t=o.substring(0,r),a=new qn.Token(p,qn.tokenize(a,f.grammar),"language-"+p,a),r=o.substring(r+c.length),c=[],t&&c.push.apply(c,e([t])),c.push(a),r&&c.push.apply(c,e([r])),"string"==typeof u?n.splice.apply(n,[i,1].concat(c)):u.content=c)):u.content&&e(u.content)}return n}(f.tokens))}}});function In(t,e){var a=this;this.config=t,this.router=e,this.cacheTree={},this.toc=[],this.cacheTOC={},this.linkTarget=t.externalLinkTarget||"_blank",this.linkRel="_blank"===this.linkTarget?t.externalLinkRel||"noopener":"",this.contentBase=e.getBasePath();var n=this._initRenderer();this.heading=n.heading;var r=o(e=t.markdown||{})?e(Sn,n):(Sn.setOptions(m(e,{renderer:m(n,e.renderer)})),Sn);this._marked=r,this.compile=function(i){var o=!0,e=c(function(e){o=!1;var n="";return i&&(n=f(i)?r(i):r.parser(i),n=t.noEmoji?n:jn(n,t.nativeEmoji),Tn.clear(),n)})(i),n=a.router.parse().file;return o?a.toc=a.cacheTOC[n]:a.cacheTOC[n]=[].concat(a.toc),e}}var Nn={},Hn={markdown:function(e){return{url:e}},mermaid:function(e){return{url:e}},iframe:function(e,n){return{html:'"}},video:function(e,n){return{html:'"}},audio:function(e,n){return{html:'"}},code:function(e,n){var i=e.match(/\.(\w+)$/);return{url:e,lang:i="md"===(i=n||i&&i[1])?"markdown":i}}};In.prototype.compileEmbed=function(e,n){var i,o,t=Ln(n),a=t.str,t=t.config;if(n=a,t.include)return R(e)||(e=q(this.contentBase,C(this.router.getCurrentPath()),e)),t.type&&(o=Hn[t.type])?(i=o.call(this,e,n)).type=t.type:(o="code",/\.(md|markdown)/.test(e)?o="markdown":/\.mmd/.test(e)?o="mermaid":/\.html?/.test(e)?o="iframe":/\.(mp4|ogg)/.test(e)?o="video":/\.mp3/.test(e)&&(o="audio"),(i=Hn[o].call(this,e,n)).type=o),i.fragment=t.fragment,i},In.prototype._matchNotCompileLink=function(e){for(var n=this.config.noCompileLinks||[],i=0;i/g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore} --\x3e",""),e.title=On(o),e.ignoreSubHeading=!0),/{docsify-ignore}/g.test(o)&&(o=o.replace("{docsify-ignore}",""),e.title=On(o),e.ignoreSubHeading=!0),//g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore-all} --\x3e",""),e.title=On(o),e.ignoreAllSubs=!0),/{docsify-ignore-all}/g.test(o)&&(o=o.replace("{docsify-ignore-all}",""),e.title=On(o),e.ignoreAllSubs=!0);i=Tn(t.id||o),t=a.toURL(a.getCurrentPath(),{id:i});return e.slug=t,g.toc.push(e),"'+o+""},t.code={renderer:e}.renderer.code=function(e,n){var i=Pn.languages[n=void 0===n?"markup":n]||Pn.languages.markup;return''+Pn.highlight(e.replace(/@DOCSIFY_QM@/g,"`"),i,n)+"
"},t.link=(i=(n={renderer:e,router:a,linkTarget:n,linkRel:i,compilerClass:g}).renderer,c=n.router,u=n.linkTarget,n.linkRel,f=n.compilerClass,i.link=function(e,n,i){var o=[],t=Ln(n=void 0===n?"":n),a=t.str,t=t.config;return u=t.target||u,r="_blank"===u?f.config.externalLinkRel||"noopener":"",n=a,R(e)||f._matchNotCompileLink(e)||t.ignore?(R(e)||"./"!==e.slice(0,2)||(e=document.URL.replace(/\/(?!.*\/).*/,"/").replace("#/./","")+e),o.push(0===e.indexOf("mailto:")?"":'target="'+u+'"'),o.push(0!==e.indexOf("mailto:")&&""!==r?' rel="'+r+'"':"")):(e===f.config.homepage&&(e="README"),e=c.toURL(e,null,c.getCurrentPath())),t.disabled&&(o.push("disabled"),e="javascript:void(0)"),t.class&&o.push('class="'+t.class+'"'),t.id&&o.push('id="'+t.id+'"'),n&&o.push('title="'+n+'"'),'"+i+""}),t.paragraph={renderer:e}.renderer.paragraph=function(e){e=/^!>/.test(e)?$n("tip",e):/^\?>/.test(e)?$n("warn",e):""+e+"
";return e},t.image=(o=(i={renderer:e,contentBase:o,router:a}).renderer,p=i.contentBase,d=i.router,o.image=function(e,n,i){var o=e,t=[],a=Ln(n),r=a.str,a=a.config;return n=r,a["no-zoom"]&&t.push("data-no-zoom"),n&&t.push('title="'+n+'"'),a.size&&(n=(r=a.size.split("x"))[0],(r=r[1])?t.push('width="'+n+'" height="'+r+'"'):t.push('width="'+n+'"')),a.class&&t.push('class="'+a.class+'"'),a.id&&t.push('id="'+a.id+'"'),R(e)||(o=q(p,C(d.getCurrentPath()),e)),0":'
"}),t.list={renderer:e}.renderer.list=function(e,n,i){n=n?"ol":"ul";return"<"+n+" "+[//.test(e.split('class="task-list"')[0])?'class="task-list"':"",i&&1"+e+""+n+">"},t.listitem={renderer:e}.renderer.listitem=function(e){return/^(]*>)/.test(e)?'":""+e+""},e.origin=t,e},In.prototype.sidebar=function(e,n){var i=this.toc,o=this.router.getCurrentPath(),t="";if(e)t=this.compile(e);else{for(var a=0;a{inner}");this.cacheTree[o]=n}return t},In.prototype.subSidebar=function(e){if(e){var n=this.router.getCurrentPath(),i=this.cacheTree,o=this.toc;o[0]&&o[0].ignoreAllSubs&&o.splice(0),o[0]&&1===o[0].level&&o.shift();for(var t=0;t\n'+e+"\n"}]).links={}:(n=[{type:"html",text:e}]).links={}),a({token:t,embedToken:n}),++u>=c&&a({})}}(n);n.embed.url?X(n.embed.url).then(o):o(n.embed.html)}}({compile:i,embedTokens:c,fetch:n},function(e){var n,i=e.embedToken,e=e.token;e?(n=e.index,p.forEach(function(e){n>e.start&&(n+=e.length)}),m(f,i.links),r=r.slice(0,n).concat(i,r.slice(n+1)),p.push({start:n,length:i.length-1})):(Bn[t]=r.concat(),r.links=Bn[t].links=f,o(r))})}function Yn(e,n,i){var o,t,a,r;return n="function"==typeof i?i(n):"string"==typeof i?(a=[],r=0,(o=i).replace(V,function(n,e,i){a.push(o.substring(r,i-1)),r=i+=n.length+1,a.push(t&&t[n]||function(e){return("00"+("string"==typeof Y[n]?e[Y[n]]():Y[n](e))).slice(-n.length)})}),r!==o.length&&a.push(o.substring(r)),function(e){for(var n="",i=0,o=e||new Date;i404 - Not found","Vue"in window)for(var a=0,r=k(".markdown-section > *").filter(n);ascript").filter(function(e){return!/template/.test(e.type)})[0])||(e=e.innerText.trim())&&new Function(e)()),"Vue"in window){var u,f,p=[],d=Object.keys(i.vueComponents||{});2===t&&d.length&&d.forEach(function(e){window.Vue.options.components[e]||window.Vue.component(e,i.vueComponents[e])}),!Un&&i.vueGlobalOptions&&"function"==typeof i.vueGlobalOptions.data&&(Un=i.vueGlobalOptions.data()),p.push.apply(p,Object.keys(i.vueMounts||{}).map(function(e){return[b(o,e),i.vueMounts[e]]}).filter(function(e){var n=e[0];e[1];return n})),(i.vueGlobalOptions||d.length)&&(u=/{{2}[^{}]*}{2}/,f=/<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/,p.push.apply(p,k(".markdown-section > *").filter(function(i){return!p.some(function(e){var n=e[0];e[1];return n===i})}).filter(function(e){return e.tagName.toLowerCase()in(i.vueComponents||{})||e.querySelector(d.join(",")||null)||u.test(e.outerHTML)||f.test(e.outerHTML)}).map(function(e){var n=m({},i.vueGlobalOptions||{});return Un&&(n.data=function(){return Un}),[e,n]})));for(var g=0,s=p;g([^<]*?)$'))&&("color"===n[2]?o.style.background=n[1]+(n[3]||""):(e=n[1],S(o,"add","has-mask"),R(n[1])||(e=q(this.router.getBasePath(),n[1])),o.style.backgroundImage="url("+e+")",o.style.backgroundSize="cover",o.style.backgroundPosition="center center"),i=i.replace(n[0],"")),this._renderTo(".cover-main",i),K()):S(o,"remove","show")},n.prototype._updateRender=function(){var e,n,i,o;e=this,n=l(".app-name-link"),i=e.config.nameLink,o=e.route.path,n&&(f(e.config.nameLink)?n.setAttribute("href",i):"object"==typeof i&&(e=Object.keys(i).filter(function(e){return-1':"")),e.coverpage&&(f+=(o=", 100%, 85%",'')),e.logo&&(o=/^data:image/.test(e.logo),n=/(?:http[s]?:)?\/\//.test(e.logo),i=/^\./.test(e.logo),o||n||i||(e.logo=q(this.router.getBasePath(),e.logo))),f+=(i=(n=e).name||"",""+('')+''),this._renderTo(u,f,!0)):this.rendered=!0,e.mergeNavbar&&s?p=b(".sidebar"):(c.classList.add("app-nav"),e.repo||c.classList.add("no-badge")),e.loadNavbar&&y(p,c),e.themeColor&&(v.head.appendChild(w("div","").firstElementChild),a=e.themeColor,window.CSS&&window.CSS.supports&&window.CSS.supports("(--v:red)")||(e=k("style:not(.inserted),link"),[].forEach.call(e,function(e){"STYLE"===e.nodeName?Q(e,a):"LINK"===e.nodeName&&(e=e.getAttribute("href"),/\.css$/.test(e)&&X(e).then(function(e){e=w("style",e);_.appendChild(e),Q(e,a)}))}))),this._updateRender(),S(h,"ready")},n}(function(e){function n(){e.apply(this,arguments)}return e&&(n.__proto__=e),((n.prototype=Object.create(e&&e.prototype)).constructor=n).prototype.routes=function(){return this.config.routes||{}},n.prototype.matchVirtualRoute=function(t){var a=this.routes(),r=Object.keys(a),c=function(){return null};function u(){var e=r.shift();if(!e)return c(null);var n=A(o=(i="^",0===(o=e).indexOf(i)?o:"^"+o),"$")?o:o+"$",i=t.match(n);if(!i)return u();var o=a[e];if("string"==typeof o)return c(o);if("function"!=typeof o)return u();n=o,e=Xn(),o=e[0];return(0,e[1])(function(e){return"string"==typeof e?c(e):!1===e?c(null):u()}),n.length<=2?o(n(t,i)):n(t,i,o)}return{then:function(e){c=e,u()}}},n}(function(i){function e(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];i.apply(this,e),this.route={}}return i&&(e.__proto__=i),((e.prototype=Object.create(i&&i.prototype)).constructor=e).prototype.updateRender=function(){this.router.normalize(),this.route=this.router.parse(),h.setAttribute("data-page",this.route.file)},e.prototype.initRouter=function(){var n=this,e=this.config,e=new("history"===(e.routerMode||"hash")&&t?D:H)(e);this.router=e,this.updateRender(),U=this.route,e.onchange(function(e){n.updateRender(),n._updateRender(),U.path!==n.route.path?(n.$fetch(d,n.$resetEvents.bind(n,e.source)),U=n.route):n.$resetEvents(e.source)})},e}(function(e){function n(){e.apply(this,arguments)}return e&&(n.__proto__=e),((n.prototype=Object.create(e&&e.prototype)).constructor=n).prototype.initLifecycle=function(){var i=this;this._hooks={},this._lifecycle={},["init","mounted","beforeEach","afterEach","doneEach","ready"].forEach(function(e){var n=i._hooks[e]=[];i._lifecycle[e]=function(e){return n.push(e)}})},n.prototype.callHook=function(e,t,a){void 0===a&&(a=d);var r=this._hooks[e],c=this.config.catchPluginErrors,u=function(n){var e=r[n];if(n>=r.length)a(t);else if("function"==typeof e){var i="Docsify plugin error";if(2===e.length)try{e(t,function(e){t=e,u(n+1)})}catch(e){if(!c)throw e;console.error(i,e),u(n+1)}else try{var o=e(t);t=void 0===o?t:o,u(n+1)}catch(e){if(!c)throw e;console.error(i,e),u(n+1)}}else u(n+1)};u(0)},n}(we))))))));function Kn(e,n,i){return Qn&&Qn.abort&&Qn.abort(),Qn=X(e,!0,i)}window.Docsify={util:Me,dom:n,get:X,slugify:Tn,version:"4.13.1"},window.DocsifyCompiler=In,window.marked=Sn,window.Prism=Pn,e(function(e){return new Jn})}();
diff --git a/website/templates/vendor/packages.json b/website/templates/vendor/packages.json
new file mode 100644
index 00000000..0e7df328
--- /dev/null
+++ b/website/templates/vendor/packages.json
@@ -0,0 +1,17 @@
+[
+ {
+ "package": "docsify",
+ "version": "4.13.1",
+ "source": "https://registry.npmjs.org/docsify/-/docsify-4.13.1.tgz"
+ },
+ {
+ "package": "prismjs",
+ "version": "1.30.0",
+ "source": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz"
+ },
+ {
+ "package": "docsify-copy-code",
+ "version": "3.0.2",
+ "source": "https://registry.npmjs.org/docsify-copy-code/-/docsify-copy-code-3.0.2.tgz"
+ }
+]
diff --git a/website/templates/vendor/prism-bash.min.js b/website/templates/vendor/prism-bash.min.js
new file mode 100644
index 00000000..f1659f1e
--- /dev/null
+++ b/website/templates/vendor/prism-bash.min.js
@@ -0,0 +1 @@
+!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean;
\ No newline at end of file
diff --git a/website/templates/vendor/prism-java.min.js b/website/templates/vendor/prism-java.min.js
new file mode 100644
index 00000000..9b90cf3c
--- /dev/null
+++ b/website/templates/vendor/prism-java.min.js
@@ -0,0 +1 @@
+!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);
\ No newline at end of file
diff --git a/website/templates/vendor/prism-json.min.js b/website/templates/vendor/prism-json.min.js
new file mode 100644
index 00000000..4256f820
--- /dev/null
+++ b/website/templates/vendor/prism-json.min.js
@@ -0,0 +1 @@
+Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json;
\ No newline at end of file
diff --git a/website/templates/vendor/prism-python.min.js b/website/templates/vendor/prism-python.min.js
new file mode 100644
index 00000000..96932b01
--- /dev/null
+++ b/website/templates/vendor/prism-python.min.js
@@ -0,0 +1 @@
+Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern://,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python;
\ No newline at end of file
diff --git a/website/templates/vendor/prism-sql.min.js b/website/templates/vendor/prism-sql.min.js
new file mode 100644
index 00000000..86259a6b
--- /dev/null
+++ b/website/templates/vendor/prism-sql.min.js
@@ -0,0 +1 @@
+Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};
\ No newline at end of file
diff --git a/website/templates/vendor/prismjs-LICENSE b/website/templates/vendor/prismjs-LICENSE
new file mode 100644
index 00000000..528949f4
--- /dev/null
+++ b/website/templates/vendor/prismjs-LICENSE
@@ -0,0 +1,21 @@
+MIT LICENSE
+
+Copyright (c) 2012 Lea Verou
+
+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/website/templates/vendor/vue.css b/website/templates/vendor/vue.css
new file mode 100644
index 00000000..ce96229d
--- /dev/null
+++ b/website/templates/vendor/vue.css
@@ -0,0 +1 @@
+*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}img.emoji{height:1.2em}img.emoji,span.emoji{vertical-align:middle}span.emoji{font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1.2em}.progress{background-color:#42b983;background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search .search-keyword,.search a:hover{color:#42b983;color:var(--theme-color,#42b983)}.search .search-keyword{font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a.active,.app-nav a:hover{color:#42b983;color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative;cursor:pointer}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:#42b983;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30;cursor:pointer}.sidebar-toggle:hover .sidebar-toggle-button{opacity:.4}.sidebar-toggle span{background-color:#42b983;background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:80%;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section p.tip,.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;min-height:100vh;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave .56s ease-in-out}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{position:relative;align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;min-height:100vh;width:100%;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;bottom:0;width:100%}section.cover .cover-main{flex:1;margin:0 16px;text-align:center;position:relative}section.cover a{color:inherit}section.cover a,section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid #42b983;border-color:var(--theme-color,#42b983);box-sizing:border-box;color:#42b983;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:#42b983;background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:#42b983;color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid #42b983;border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code,.markdown-section output:after,.markdown-section pre{font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section code,.markdown-section pre{background-color:#f8f8f8}.markdown-section output,.markdown-section pre{margin:1.2em 0;position:relative}.markdown-section output,.markdown-section pre>code{border-radius:2px;display:block}.markdown-section output:after,.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.markdown-section code{border-radius:2px;color:#e96900;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code{font-size:.8rem}.markdown-section pre{padding:0 1.4rem;line-height:1.5rem;overflow:auto;word-wrap:normal}.markdown-section pre>code{color:#525252;font-size:.8rem;padding:2.2em 5px;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;white-space:inherit}.markdown-section output{padding:1.7rem 1.4rem;border:1px dotted #ccc}.markdown-section output>:first-child{margin-top:0}.markdown-section output>:last-child{margin-bottom:0}.markdown-section code:after,.markdown-section code:before,.markdown-section output:after,.markdown-section output:before{letter-spacing:.05rem}.markdown-section output:after,.markdown-section pre:after{color:#ccc;font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0;content:attr(data-lang)}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:#42b983;color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:#42b983;color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto}
\ No newline at end of file
diff --git a/website/templates/vendor/zoom-image.min.js b/website/templates/vendor/zoom-image.min.js
new file mode 100644
index 00000000..63153aef
--- /dev/null
+++ b/website/templates/vendor/zoom-image.min.js
@@ -0,0 +1 @@
+!function(){function t(e){return"IMG"===e.tagName}function d(e){function t(){for(var e=arguments,t=arguments.length,o=Array(t),n=0;nu.scrollOffset&&setTimeout(a,150))}),window.addEventListener("resize",a);var f={open:i,close:a,toggle:o,update:function(){var e=0