Parcourir la source

[doc]更新多个组件,添加SVG图标,优化样式,删除不再使用的3D资源文件,调整响应式设计,确保在宽屏下的显示效果。

dufu1991 il y a 1 an
Parent
commit
28cc9d7d17
84 fichiers modifiés avec 752 ajouts et 60813 suppressions
  1. 19 18
      docs/site/src/lib/cmdk/CmdK.svelte
  2. 14 14
      docs/site/src/lib/fund/Fund.svelte
  3. 59 50
      docs/site/src/lib/header/Header.svelte
  4. 4 3
      docs/site/src/lib/menu/Menu.svelte
  5. 5 8
      docs/site/src/lib/modeSwitch/ModeSwitch.svelte
  6. 1 0
      docs/site/src/lib/symbol/ri-add-line.svg
  7. 1 0
      docs/site/src/lib/symbol/ri-arrow-left-s-line.svg
  8. 1 0
      docs/site/src/lib/symbol/ri-arrow-right-s-line.svg
  9. 1 0
      docs/site/src/lib/symbol/ri-barcode-fill.svg
  10. 1 0
      docs/site/src/lib/symbol/ri-checkbox-blank-circle-line.svg
  11. 1 0
      docs/site/src/lib/symbol/ri-checkbox-circle-line.svg
  12. 1 0
      docs/site/src/lib/symbol/ri-close-circle-fill.svg
  13. 1 0
      docs/site/src/lib/symbol/ri-close-circle-line.svg
  14. 1 0
      docs/site/src/lib/symbol/ri-close-line.svg
  15. 1 0
      docs/site/src/lib/symbol/ri-code-box-fill.svg
  16. 1 0
      docs/site/src/lib/symbol/ri-error-warning-line.svg
  17. 1 0
      docs/site/src/lib/symbol/ri-heart-3-fill.svg
  18. 1 0
      docs/site/src/lib/symbol/ri-image-2-fill.svg
  19. 1 0
      docs/site/src/lib/symbol/ri-information-line.svg
  20. 1 0
      docs/site/src/lib/symbol/ri-more-fill.svg
  21. 1 0
      docs/site/src/lib/symbol/ri-more-line.svg
  22. 1 0
      docs/site/src/lib/symbol/ri-movie-2-fill.svg
  23. 1 0
      docs/site/src/lib/symbol/ri-qr-code-fill.svg
  24. 1 0
      docs/site/src/lib/symbol/ri-radio-button-line.svg
  25. 1 0
      docs/site/src/lib/symbol/ri-star-fill.svg
  26. 1 0
      docs/site/src/lib/symbol/ri-subtract-line.svg
  27. 1 0
      docs/site/src/lib/symbol/ri-survey-fill.svg
  28. 1 0
      docs/site/src/lib/symbol/ri-survey-line.svg
  29. 1 0
      docs/site/src/lib/symbol/ri-user-3-line.svg
  30. 1 0
      docs/site/src/lib/symbol/ri-user-add-line.svg
  31. 1 0
      docs/site/src/lib/symbol/ri-volume-down-line.svg
  32. 68 21
      docs/site/src/lib/tab/Tab.svelte
  33. 16 16
      docs/site/src/lib/themeSwitch/ThemeSwitch.svelte
  34. 49 0
      docs/site/src/routes/+error.svelte
  35. 2 0
      docs/site/src/routes/+layout.svelte
  36. 357 193
      docs/site/src/routes/+page.svelte
  37. 10 9
      docs/site/src/routes/components/+page.svelte
  38. 2 38
      docs/site/src/routes/components/Guide.svelte
  39. 5 5
      docs/site/src/routes/guide/+layout.svelte
  40. 2 2
      docs/site/src/routes/guide/+page.svelte
  41. 4 2
      docs/site/src/routes/guide/about/+page.svelte
  42. 4 2
      docs/site/src/routes/guide/changelog/+page.svelte
  43. 2 2
      docs/site/src/routes/guide/color/Color.svelte
  44. 4 2
      docs/site/src/routes/guide/compatibility/+page.svelte
  45. 4 2
      docs/site/src/routes/guide/contribution/+page.svelte
  46. 4 2
      docs/site/src/routes/guide/create/+page.svelte
  47. 4 2
      docs/site/src/routes/guide/faq/+page.svelte
  48. 4 2
      docs/site/src/routes/guide/future/+page.svelte
  49. 4 4
      docs/site/src/routes/guide/generator/+page.svelte
  50. 4 2
      docs/site/src/routes/guide/icon-plugin/+page.svelte
  51. 4 2
      docs/site/src/routes/guide/icon/+page.svelte
  52. 4 2
      docs/site/src/routes/guide/internation/+page.svelte
  53. 44 38
      docs/site/src/routes/guide/logo/+page.svelte
  54. 4 2
      docs/site/src/routes/guide/md/+page.svelte
  55. 4 2
      docs/site/src/routes/guide/milestone/+page.svelte
  56. 3 3
      docs/site/src/routes/guide/shortkey/+page.svelte
  57. 2 2
      docs/site/src/routes/guide/theme/+page.svelte
  58. 4 2
      docs/site/src/routes/guide/vscode/+page.svelte
  59. BIN
      docs/site/static/assets/3d/dark.png
  60. BIN
      docs/site/static/assets/3d/light.png
  61. 0 5254
      docs/site/static/assets/3d/process.js
  62. BIN
      docs/site/static/assets/3d/process.wasm
  63. BIN
      docs/site/static/assets/3d/scene.splinecode
  64. 0 55106
      docs/site/static/assets/3d/viewer.js
  65. BIN
      docs/site/static/assets/images/3D-design-dark.png
  66. BIN
      docs/site/static/assets/images/3D-design.png
  67. BIN
      docs/site/static/assets/images/3D-fast-dark.png
  68. BIN
      docs/site/static/assets/images/3D-fast.png
  69. BIN
      docs/site/static/assets/images/3D-simple-dark.png
  70. BIN
      docs/site/static/assets/images/3D-simple.png
  71. BIN
      docs/site/static/assets/images/3D-thin-dark.png
  72. BIN
      docs/site/static/assets/images/3D-thin.png
  73. BIN
      docs/site/static/assets/images/home/avatar_1.jpg
  74. BIN
      docs/site/static/assets/images/home/d.jpeg
  75. BIN
      docs/site/static/assets/images/home/dota_小牛.png
  76. BIN
      docs/site/static/assets/images/home/dota_火枪.png
  77. BIN
      docs/site/static/assets/images/home/f.jpeg
  78. BIN
      docs/site/static/assets/images/home/s.jpeg
  79. BIN
      docs/site/static/assets/images/home/t.jpeg
  80. BIN
      docs/site/static/assets/images/home/wall_1.jpg
  81. BIN
      docs/site/static/assets/images/home/wall_2.jpg
  82. BIN
      docs/site/static/assets/images/home/wall_3.jpg
  83. BIN
      docs/site/static/assets/images/home/wall_4.jpg
  84. 7 1
      docs/site/vite.config.ts

+ 19 - 18
docs/site/src/lib/cmdk/CmdK.svelte

@@ -1,5 +1,5 @@
 <script lang="ts">
-	import { fly, fade } from 'svelte/transition';
+	import { fade, scale } from 'svelte/transition';
 	import { menuList, type MenuList, type MenuListChild } from '../../data/menuList';
 	import { page } from '$app/stores';
 	import { goto } from '$app/navigation';
@@ -212,14 +212,15 @@
 <!-- svelte-ignore a11y_no_static_element_interactions -->
 {#if $isCmdKStore}
 	<div
-		transition:fade={{ duration: 50 }}
+		transition:fade
 		class="fixed left-0 top-0 flex h-screen w-screen flex-col bg-black/20 pt-20 text-left backdrop-blur-sm"
 		style="z-index: 10000"
 		onclick={closeCmdKFun}
 	>
 		<div
-			in:fly={{ y: 100, duration: 300, delay: 50 }}
-			class="mx-auto w-1/2 rounded-xl bg-white shadow-lg dark:bg-black"
+			in:scale={{ duration: 300, delay: 100 }}
+			out:scale={{ duration: 300 }}
+			class="mx-auto rounded-xl bg-white shadow-lg dark:bg-black"
 			onclick={(e: Event) => e.stopPropagation()}
 		>
 			<div class="flex items-center border-b border-black/10 px-4 py-3 text-sm text-gray-500 dark:border-white/10">
@@ -235,7 +236,7 @@
 					<input
 						bind:this={cmdKInput}
 						bind:value={cmdKValue}
-						class="focus:ring-b caret-primary dark:caret-dark focus:outline-hidden w-full placeholder:text-black/20 dark:bg-black dark:placeholder:text-white/10"
+						class="focus:ring-b caret-primary dark:caret-dark focus:outline-hidden w-full placeholder:text-black/20 dark:bg-black dark:placeholder:text-white/30"
 						type="text"
 						placeholder={isZh ? '请输入组件关键字' : 'Please enter the component keyword'}
 					/>
@@ -268,7 +269,7 @@
 				{#each cmdKList as item, index}
 					<div class="flex items-center">
 						<div
-							class="w-78 mr-2 transition-all {index === currentIndex
+							class="w-lg mr-2 transition-all {index === currentIndex
 								? 'text-primary dark:text-dark text-xl font-bold'
 								: 'text-lg text-black dark:text-white'}"
 						>
@@ -346,7 +347,7 @@
 			</div>
 			<div class="flex gap-4 border-t border-black/10 px-4 py-2 text-xs opacity-60 dark:border-white/10">
 				<div class="flex gap-1">
-					<div class="h-4 w-4">
+					<div class="rounded-xs flex size-4 flex-col items-center justify-center bg-black/10 p-0.5 dark:bg-white/30">
 						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-black dark:fill-white">
 							<path
 								d="M19.0003 13.9999L19.0004 5.00003L17.0004 5L17.0003 11.9999L6.82845 12L10.7782 8.05027L9.36396 6.63606L3 13L9.36396 19.364L10.7782 17.9498L6.8284 14L19.0003 13.9999Z"
@@ -356,27 +357,27 @@
 					{isZh ? '选择' : 'Select'}
 				</div>
 				<div class="flex gap-1">
-					<div class="h-4 w-4">
-						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-black dark:fill-white"
-							><path
+					<div class="rounded-xs flex size-4 flex-col items-center justify-center bg-black/10 p-0.5 dark:bg-white/30">
+						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-black dark:fill-white">
+							<path
 								d="M12.9999 16.1716L18.3638 10.8076L19.778 12.2218L11.9999 20L4.22168 12.2218L5.63589 10.8076L10.9999 16.1716V4H12.9999V16.1716Z"
-							/></svg
-						>
+							/>
+						</svg>
 					</div>
 					{isZh ? '向下' : 'Down'}
 				</div>
 				<div class="flex gap-1">
-					<div class="h-4 w-4">
-						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-black dark:fill-white"
-							><path
+					<div class="rounded-xs flex size-4 flex-col items-center justify-center bg-black/10 p-0.5 dark:bg-white/30">
+						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-black dark:fill-white">
+							<path
 								d="M12.9999 7.82843V20H10.9999V7.82843L5.63589 13.1924L4.22168 11.7782L11.9999 4L19.778 11.7782L18.3638 13.1924L12.9999 7.82843Z"
-							/></svg
-						>
+							/>
+						</svg>
 					</div>
 					{isZh ? '向上' : 'Up'}
 				</div>
 				<div class="flex gap-1">
-					<div class="h-4">ESC</div>
+					<div class="rounded-xs bg-black/10 px-1 text-xs dark:bg-white/30">Esc</div>
 					{isZh ? '关闭' : 'Close'}
 				</div>
 			</div>

+ 14 - 14
docs/site/src/lib/fund/Fund.svelte

@@ -26,7 +26,7 @@
 >
 	<div
 		in:fly={{ y: -400 }}
-		class="mx-auto w-full rounded-xl bg-white p-4 shadow-lg dark:bg-gray-950 md:w-[800px] md:p-8"
+		class="mx-auto w-full rounded-xl bg-white p-4 shadow-lg md:w-[800px] md:p-8 dark:bg-gray-950"
 		onclick={(e: Event) => e.stopPropagation()}
 	>
 		<div class="flex justify-between">
@@ -41,11 +41,11 @@
 			<div class="mt-2 text-xs text-gray-500 md:mt-8">
 				<p>
 					{isZh
-						? 'STDF 是一个免费开源、使用简单但很用心的组件库,在组件设计与开发、配套工具的提供、文档站点运营等方面投入了大量的时间、物力和精力。如果 STDF 确实给您带去了方便,希望您不吝啬您的喜爱之情支持 STDF 的工作,给一个 star 或打赏,非常感谢!'
-						: 'STDF is a free and open source, easy to use but very attentive component library, which has invested a lot of time, material and energy in component design and development, supporting tool provision, document site operation, etc. If STDF does bring you convenience, I hope you will not hesitate to support STDF work with your love, give a star or reward, thank you very much!'}
+						? 'STDF 是一个免费、开源、简单易用且精心打造的组件库。我们在组件设计开发、工具配套、文档建设等方面倾注了大量心血。如果 STDF 为您带来了便利,希望您能给个 star 或打赏以示支持,感谢您的厚爱!'
+						: 'STDF is a free, open-source, easy-to-use, and carefully crafted component library. We have devoted tremendous effort to component design, development tools, and documentation. If STDF has helped you, please consider showing your support with a star or donation. Thank you for your love!'}
 				</p>
 				<p class="text-md mt-2 font-bold">
-					{isZh ? '无论如何,STDF 都会出于热爱并继续努力!' : 'In any case, STDF will continue to work hard out of love!'}
+					{isZh ? '无论如何,STDF 都将怀着热爱继续前行!' : 'No matter what, STDF will keep moving forward with love!'}
 				</p>
 			</div>
 		{/if}
@@ -53,7 +53,7 @@
 			<!-- coffee -->
 			{#if isDeskDevice || (!showWeChatPay && !showAlipayPay)}
 				<div
-					class="group flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 dark:border-white/10 md:relative md:w-40 md:py-12"
+					class="group flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 md:relative md:w-40 md:py-12 dark:border-white/10"
 				>
 					<div class="mx-auto h-8 w-6">
 						<img class="h-full w-full object-cover" src="/assets/fund/coffee.svg" alt="coffee" />
@@ -65,7 +65,7 @@
 						</div>
 					</a>
 					<a
-						class="absolute inset-1 hidden h-[95%] w-[95%] bg-white px-1 py-12 opacity-0 transition-all duration-500 group-hover:opacity-95 dark:bg-gray-950 md:block"
+						class="absolute inset-1 hidden h-[95%] w-[95%] bg-white px-1 py-12 opacity-0 transition-all duration-500 group-hover:opacity-95 md:block dark:bg-gray-950"
 						href="https://www.buymeacoffee.com/dufu1991"
 						target="_blank"
 					>
@@ -79,7 +79,7 @@
 			<!-- paypal -->
 			{#if isDeskDevice || (!showWeChatPay && !showAlipayPay)}
 				<div
-					class="group flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 dark:border-white/10 md:relative md:w-40 md:py-12"
+					class="group flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 md:relative md:w-40 md:py-12 dark:border-white/10"
 				>
 					<div class="mx-auto h-8 w-8">
 						<img class="h-full w-full object-cover" src="/assets/fund/paypal.svg" alt="paypal" />
@@ -91,7 +91,7 @@
 						</div>
 					</a>
 					<a
-						class="absolute inset-1 hidden h-[95%] w-[95%] bg-white px-1 py-12 opacity-0 transition-all duration-500 group-hover:opacity-95 dark:bg-gray-950 md:block"
+						class="absolute inset-1 hidden h-[95%] w-[95%] bg-white px-1 py-12 opacity-0 transition-all duration-500 group-hover:opacity-95 md:block dark:bg-gray-950"
 						href="https://paypal.me/dufu1991"
 						target="_blank"
 					>
@@ -105,7 +105,7 @@
 			<!-- wechat -->
 			{#if isDeskDevice || !showAlipayPay}
 				<div
-					class="group flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 dark:border-white/10 md:relative md:w-40 md:py-12"
+					class="group flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 md:relative md:w-40 md:py-12 dark:border-white/10"
 				>
 					<div class="mx-auto h-8 w-10" class:hidden={showWeChatPay}>
 						<img class="h-full w-full object-cover" src="/assets/fund/wechat_pay.svg" alt="wechat" />
@@ -136,7 +136,7 @@
 						onclick={() => {
 							showWeChatPay = !showWeChatPay;
 						}}
-						class="absolute inset-1 hidden h-[95%] w-[95%] cursor-pointer bg-white px-1 opacity-0 transition-all duration-500 group-hover:opacity-95 dark:bg-gray-950 md:block"
+						class="absolute inset-1 hidden h-[95%] w-[95%] cursor-pointer bg-white px-1 opacity-0 transition-all duration-500 group-hover:opacity-95 md:block dark:bg-gray-950"
 						class:opacity-95={showWeChatPay}
 					>
 						{#if showWeChatPay}
@@ -160,7 +160,7 @@
 			<!-- alipay -->
 			{#if isDeskDevice || !showWeChatPay}
 				<div
-					class="group mx-auto flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 dark:border-white/10 md:relative md:w-40 md:py-12"
+					class="group mx-auto flex w-full flex-col justify-center rounded-lg border border-black/10 py-1 md:relative md:w-40 md:py-12 dark:border-white/10"
 				>
 					<div class="mx-auto h-8 w-8" class:hidden={showAlipayPay}>
 						<img class="h-full w-full object-cover" src="/assets/fund/alipay.svg" alt="alipay" />
@@ -191,7 +191,7 @@
 						onclick={() => {
 							showAlipayPay = !showAlipayPay;
 						}}
-						class="absolute inset-1 hidden h-[95%] w-[95%] cursor-pointer bg-white px-1 opacity-0 transition-all duration-500 group-hover:opacity-95 dark:bg-gray-950 md:block"
+						class="absolute inset-1 hidden h-[95%] w-[95%] cursor-pointer bg-white px-1 opacity-0 transition-all duration-500 group-hover:opacity-95 md:block dark:bg-gray-950"
 						class:opacity-95={showAlipayPay}
 					>
 						{#if showAlipayPay}
@@ -215,8 +215,8 @@
 		</div>
 		<div class="mt-4 text-xs text-gray-500 md:mt-8">
 			{isZh
-				? '如果愿意的话,捐赠留言请注明 GitHub 或其他社交账号或相关链接地址,STDF 将在仓库与站点展示并感谢您们!'
-				: 'If you are willing, please leave a message for donation with your GitHub or other social account or related link address. STDF will display and thank you in the warehouse and website!'}
+				? '欢迎在捐赠留言中附上您的 GitHub 或其他社交账号链接,STDF 将在项目仓库和官网中展示感谢!'
+				: 'Feel free to include your GitHub or other social media links in the donation message. STDF will gratefully acknowledge your support on our repository and website!'}
 		</div>
 	</div>
 </div>

+ 59 - 50
docs/site/src/lib/header/Header.svelte

@@ -24,18 +24,6 @@
 	const clickCmdKFun = () => {
 		onclickCmdK?.();
 	};
-	// 切换语言
-	const toggleLangFunc = () => {
-		// 获取当前页面地址
-		const currentUrl = window.location.href;
-		// url 是否包含参数 ?
-		const hasQuery = currentUrl.includes('?');
-		// 刷新 url,如果当前语言为中文,则跳转至英文,反之亦然,拼接 currentUrl + ?lang=${isZh?'en_US':'zh_CN'}
-		window.location.href = `${currentUrl}${hasQuery ? '&' : '?'}lang=${isZh ? 'en_US' : 'zh_CN'}`;
-		setTimeout(() => {
-			window.location.reload();
-		}, 300);
-	};
 	// 切换支持
 	const toggleFundFunc = () => {
 		isShowFundStore.set(true);
@@ -53,9 +41,37 @@
 	});
 
 	let showVersion = $state(false);
+	let versionBtnRef: HTMLButtonElement | null = $state(null);
+
+	const switchLangFunc = () => {
+		console.log(43, window.location.href);
+		const isHaveParams = window.location.href.includes('?');
+		console.log(45, isHaveParams);
+		// 如果有参数,则增加 &lang=xxx,否则增加 ?lang=xxx
+		const newUrl = isHaveParams
+			? window.location.href + '&lang=' + (isZh ? 'en_US' : 'zh_CN')
+			: window.location.href + '?lang=' + (isZh ? 'en_US' : 'zh_CN');
+		console.log(47, newUrl);
+		window.location.href = newUrl;
+	};
+	// 判断当前 url 是否包含参数
+	// console.log(33, $page.url.search);
+
+	// 如果 $page.url.href 有 ?lang=xxx 或者 &lang=xxx 则删除这些字符
+	// const newUrl = $page.url.href.replace(/\?lang=.*|&lang=.*|#.*$/, '');
+
+	// const urlLang = newUrl + (isHaveParams ? '&lang=' + (isZh ? 'en_US' : 'zh_CN') : '?lang=' + (isZh ? 'en_US' : 'zh_CN'));
 </script>
 
-<div class="sticky top-0 z-[100] flex h-14 items-center justify-between border-b border-black/5 backdrop-blur-sm dark:border-white/10">
+<svelte:document
+	on:click={(e) => {
+		if (versionBtnRef && !versionBtnRef.contains(e.target as Node)) {
+			showVersion = false;
+		}
+	}}
+/>
+
+<div class="sticky top-0 z-[100] flex h-14 items-center justify-between border-black/5 backdrop-blur-sm dark:border-white/10">
 	{#if showLeftNav}
 		<button class="cursor-pointer p-4 md:hidden" onclick={toggleNavFun}>
 			{#if !$isShowNavStore}
@@ -79,8 +95,8 @@
 	{/if}
 
 	<div class="flex items-end">
-		<a href="/" class="flex items-center justify-between py-2 pl-6" aria-label={isZh ? '首页' : 'Home'}>
-			<div class="fill-primary flex h-8 w-16 flex-col items-center justify-center" title={isZh ? '首页' : 'Home'}>
+		<a href="/" class="flex items-center justify-between py-2 md:pl-6" aria-label={isZh ? '首页' : 'Home'}>
+			<div class="fill-primary flex h-8 w-16 flex-col items-center justify-center">
 				<svg viewBox="0 0 90 80">
 					<path
 						class="fill-primary dark:fill-dark"
@@ -93,7 +109,11 @@
 		<!-- 下拉选项,选择版本 -->
 		{#if $page.url.pathname === '' || $page.url.pathname === '/'}
 			<div class="relative bottom-1">
-				<button class="flex rounded bg-black/5 py-0.5 pl-2 pr-4 text-sm dark:bg-white/20" onclick={() => (showVersion = !showVersion)}>
+				<button
+					bind:this={versionBtnRef}
+					class="flex cursor-pointer rounded bg-black/5 py-0.5 pl-2 pr-4 text-sm dark:bg-white/20"
+					onclick={() => (showVersion = !showVersion)}
+				>
 					v1
 					<span class="absolute bottom-0.5 left-5 w-4 text-gray-500">
 						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
@@ -181,9 +201,9 @@
 
 					<!-- 语言切换 -->
 					<button
-						aria-label={isZh ? '切换语言' : 'Switch Language'}
-						class="rounded-sm px-4 py-1 text-center hover:bg-gray-100 dark:hover:bg-gray-700"
-						onclick={toggleLangFunc}
+						onclick={switchLangFunc}
+						aria-label={isZh ? '跳转英文站点' : 'Jump to Chinese Site'}
+						class="cursor-pointer rounded-sm px-4 py-1 text-center hover:bg-gray-100 dark:hover:bg-gray-700"
 					>
 						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" class="inline-block">
 							<path fill="none" d="M0 0h24v24H0z" />
@@ -215,71 +235,61 @@
 		<!--PC 端-->
 		<div class="hidden items-center space-x-2 px-6 font-bold md:flex">
 			<button
-				class="flex cursor-pointer rounded-sm border border-black/10 px-2 text-sm font-normal text-black/40 transition-all hover:border-black/20 dark:border-white/10 dark:text-white/40 dark:hover:border-white/20"
-				style="padding-top: 0.3125rem;padding-bottom: 0.3125rem;"
+				class="flex cursor-pointer rounded-sm border border-black/10 p-0.5 text-xs font-normal text-black/40 transition-all hover:border-black/20 dark:border-white/10 dark:text-white/40 dark:hover:border-white/20"
 				onclick={clickCmdKFun}
 			>
-				<div class="mr-1.5 flex flex-col justify-center">
-					<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" style="fill: currentColor;">
+				<div class="mr-1 flex flex-col justify-center">
+					<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12" style="fill: currentColor;">
 						<path fill="none" d="M0 0h24v24H0z" />
 						<path
 							d="M11 2c4.968 0 9 4.032 9 9s-4.032 9-9 9-9-4.032-9-9 4.032-9 9-9zm0 16c3.867 0 7-3.133 7-7 0-3.868-3.133-7-7-7-3.868 0-7 3.132-7 7 0 3.867 3.132 7 7 7zm8.485.071l2.829 2.828-1.415 1.415-2.828-2.829 1.414-1.414z"
 						/>
 					</svg>
 				</div>
-				<div class="mr-4 flex flex-col justify-center text-xs">
-					{isZh ? '快速搜索...' : 'Quick search...'}
+				<div class="mr-2 flex flex-col justify-center">
+					{isZh ? '搜索...' : 'Search...'}
 				</div>
-				<div class="mr-1 rounded-sm bg-black/5 px-1 font-bold dark:bg-white/5">{cmdkey}</div>
-				<div class="rounded-sm bg-black/5 px-1.5 font-bold dark:bg-white/5">K</div>
+				<div class="rounded-sm bg-black/5 px-1 dark:bg-white/5">{cmdkey} K</div>
 			</button>
 			<a
-				href="/guide"
-				class="rounded-sm px-4 py-1 transition-all {currentRoute === '/guide'
-					? 'bg-primary dark:bg-dark text-white dark:text-black'
-					: 'hover:bg-black/5 dark:hover:bg-white/5'}"
+				href={currentRoute.includes('/guide') ? 'javascript:void(0)' : '/guide'}
+				class="px-2 py-1{currentRoute.includes('/guide') ? ' text-primary dark:text-dark' : ''}"
 			>
 				{isZh ? '指南' : 'Guide'}
 			</a>
 			<a
-				href="/components?nav=button&tab=0"
-				class="inline-block rounded-sm px-4 py-1 text-center transition-all {currentRoute === '/components'
-					? 'bg-primary dark:bg-dark text-white dark:text-black'
-					: 'hover:bg-black/5 dark:hover:bg-white/5'}"
+				href={currentRoute.includes('/components') ? 'javascript:void(0)' : '/components?nav=button&tab=0'}
+				class="inline-block px-2 py-1 text-center{currentRoute.includes('/components')
+					? ' text-primary dark:text-dark pointer-events-none'
+					: ''}"
 			>
 				{isZh ? '组件' : 'Components'}
 			</a>
+			<!-- svelte-ignore a11y_mouse_events_have_key_events -->
 			<button
-				class="relative rounded-sm px-4 py-1 text-center transition-all hover:bg-black/5 dark:hover:bg-white/5"
+				class="relative px-2 py-1 text-center"
 				onmouseover={() => showThemeSwitchStore.set(true)}
-				onfocus={() => showThemeSwitchStore.set(true)}
-				onblur={() => showThemeSwitchStore.set(false)}
 				onmouseout={() => showThemeSwitchStore.set(false)}
 				bind:this={ThemeSwitchDom}
 			>
 				{isZh ? '主题' : 'Theme'}
 				{#if $showThemeSwitchStore}
 					<div transition:slide={{ duration: 300, axis: 'y' }} class="absolute left-1/2 top-8 -translate-x-1/2 pt-2">
-						<div class="rounded-lg bg-white p-4 shadow-lg dark:bg-black/95 dark:shadow-white/10">
+						<div class="rounded-md bg-white px-3 pb-1 pt-2 shadow-lg dark:bg-black/95 dark:shadow-white/10">
 							<ModeSwitch useViewTransition={false} />
 							<ThemeSwitch vertical />
 						</div>
 					</div>
 				{/if}
 			</button>
-			<button
-				class="cursor-pointer rounded-sm px-4 py-1 text-center transition-all hover:bg-black/5 dark:hover:bg-white/5"
-				title={isZh ? '支持' : 'Support'}
-				onclick={toggleFundFunc}
-			>
+			<button class="cursor-pointer px-2 py-1 text-center" onclick={toggleFundFunc}>
 				{isZh ? '支持' : 'Support'}
 			</button>
 			<!-- 语言切换 -->
 			<button
-				onclick={toggleLangFunc}
-				title={isZh ? '切换语言' : 'Switch languages'}
-				aria-label={isZh ? '切换语言' : 'Switch languages'}
-				class="cursor-pointer rounded-sm px-4 py-1 text-center transition-all hover:bg-black/5 dark:hover:bg-white/5"
+				onclick={switchLangFunc}
+				class="cursor-pointer px-2 py-1 text-center"
+				aria-label={isZh ? '跳转英文站点' : 'Jump to Chinese Site'}
 			>
 				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" class="inline-block">
 					<path fill="none" d="M0 0h24v24H0z" />
@@ -292,10 +302,9 @@
 			<!-- GitHub -->
 			<a
 				href="https://github.com/any-tdf/stdf"
-				class="inline-block rounded-sm px-4 py-1 transition-all hover:bg-black/5 dark:hover:bg-white/5"
+				class="inline-block px-2 py-1"
 				target="_blank"
 				aria-label={isZh ? '跳转至 GitHub' : 'Jump to GitHub'}
-				title={isZh ? '跳转至 GitHub' : 'Jump to GitHub'}
 			>
 				<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="inline-block">
 					<path

+ 4 - 3
docs/site/src/lib/menu/Menu.svelte

@@ -19,7 +19,7 @@
 		<div class="text-xs">
 			{isZh ? menu.class : menu.class_en}{showNum ? `(${menu.childs.length})` : ''}
 		</div>
-		<div class="my-2 ml-1 flex flex-col pr-0">
+		<div class="my-2 ml-1 flex flex-col gap-3 border-l-2 border-black/10 pr-0 dark:border-white/20">
 			{#each menu.childs as child}
 				<button
 					onclick={(e: MouseEvent) => {
@@ -27,9 +27,10 @@
 						// e.self();
 						setClick(child);
 					}}
-					class="box-content cursor-pointer border-l-2 py-2 pl-2 text-left text-sm transition-all hover:font-bold {child.nav === currentNav
+					class="box-content -translate-x-0.5 cursor-pointer border-l-2 py-0.5 pl-2 text-left text-sm transition-all hover:font-bold {child.nav ===
+					currentNav
 						? 'border-primary text-primary dark:border-dark dark:text-dark font-bold'
-						: 'border-black/10 dark:border-white/20'}"
+						: 'border-transparent'}"
 				>
 					{isZh ? child.title : child.title_en}
 				</button>

+ 5 - 8
docs/site/src/lib/modeSwitch/ModeSwitch.svelte

@@ -57,18 +57,15 @@
 </script>
 
 <button
-	class="mx-auto flex w-28 cursor-pointer justify-between rounded-sm bg-black/5 p-0.5 text-center dark:bg-white/10"
-	title={isZh
-		? `${$themeStore === 'light' ? '亮模式' : $themeStore === 'dark' ? '暗模式' : '跟随系统'}`
-		: `${$themeStore === 'light' ? 'Light' : $themeStore === 'dark' ? 'Dark' : 'System'}`}
-	onclick={toggleFun}
+	class="mx-auto flex cursor-pointer justify-between rounded-sm bg-black/5 p-0.5 text-center dark:bg-white/10"
 	aria-label={isZh
 		? `${$themeStore === 'light' ? '亮模式' : $themeStore === 'dark' ? '暗模式' : '跟随系统'}`
 		: `${$themeStore === 'light' ? 'Light' : $themeStore === 'dark' ? 'Dark' : 'System'}`}
+	onclick={toggleFun}
 >
 	<div
 		class:scale-75={isClick}
-		class="min-h-full p-0.5 px-2 transition-all duration-150 rounded-sm{$themeStore === 'light' ? ' shadow-xs bg-white/80' : ''}"
+		class="min-h-full px-1 transition-all duration-150 rounded-sm{$themeStore === 'light' ? ' shadow-xs bg-white/80' : ''}"
 		style="color:{$sysThemeStore === 'dark'
 			? $themeStore === 'light'
 				? '#ff3f2e'
@@ -120,7 +117,7 @@
 	</div>
 	<div
 		class:scale-75={isClick}
-		class="min-h-full p-0.5 px-2 transition-all duration-150 rounded-sm{$themeStore === 'dark' ? ' shadow-xs bg-black/50' : ''}"
+		class="min-h-full px-1 transition-all duration-150 rounded-sm{$themeStore === 'dark' ? ' shadow-xs bg-black/50' : ''}"
 		style="color:{$sysThemeStore === 'light'
 			? $themeStore === 'auto'
 				? '#cecece'
@@ -141,7 +138,7 @@
 		</svg>
 	</div>
 	<div
-		class="min-h-full p-0.5 px-2 transition-all duration-150 rounded-sm{$themeStore === 'auto' && $sysThemeStore === 'light'
+		class="min-h-full px-1 transition-all duration-150 rounded-sm{$themeStore === 'auto' && $sysThemeStore === 'light'
 			? ' bg-white/80'
 			: ''}{$themeStore === 'auto' && $sysThemeStore === 'dark' ? ' bg-black/50' : ''}{$themeStore === 'auto' && $sysThemeStore === 'light'
 			? ' shadow-xs'

+ 1 - 0
docs/site/src/lib/symbol/ri-add-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M11 11V5H13V11H19V13H13V19H11V13H5V11H11Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-arrow-left-s-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-arrow-right-s-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.1714 12.0007L8.22168 7.05093L9.63589 5.63672L15.9999 12.0007L9.63589 18.3646L8.22168 16.9504L13.1714 12.0007Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-barcode-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 4H4V20H2V4ZM6 4H8V20H6V4ZM9 4H12V20H9V4ZM13 4H15V20H13V4ZM16 4H18V20H16V4ZM19 4H22V20H19V4Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-checkbox-blank-circle-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-checkbox-circle-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM11.0026 16L6.75999 11.7574L8.17421 10.3431L11.0026 13.1716L16.6595 7.51472L18.0737 8.92893L11.0026 16Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-close-circle-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 10.5858L9.17157 7.75736L7.75736 9.17157L10.5858 12L7.75736 14.8284L9.17157 16.2426L12 13.4142L14.8284 16.2426L16.2426 14.8284L13.4142 12L16.2426 9.17157L14.8284 7.75736L12 10.5858Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-close-circle-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM12 10.5858L14.8284 7.75736L16.2426 9.17157L13.4142 12L16.2426 14.8284L14.8284 16.2426L12 13.4142L9.17157 16.2426L7.75736 14.8284L10.5858 12L7.75736 9.17157L9.17157 7.75736L12 10.5858Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-close-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.0007 10.5865L16.9504 5.63672L18.3646 7.05093L13.4149 12.0007L18.3646 16.9504L16.9504 18.3646L12.0007 13.4149L7.05093 18.3646L5.63672 16.9504L10.5865 12.0007L5.63672 7.05093L7.05093 5.63672L12.0007 10.5865Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-code-box-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 3H21C21.5523 3 22 3.44772 22 4V20C22 20.5523 21.5523 21 21 21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3ZM16.4645 15.5355L20 12L16.4645 8.46447L15.0503 9.87868L17.1716 12L15.0503 14.1213L16.4645 15.5355ZM6.82843 12L8.94975 9.87868L7.53553 8.46447L4 12L7.53553 15.5355L8.94975 14.1213L6.82843 12ZM11.2443 17L14.884 7H12.7557L9.11597 17H11.2443Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-error-warning-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM11 15H13V17H11V15ZM11 7H13V13H11V7Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-heart-3-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.5 3C19.5376 3 22 5.5 22 9C22 16 14.5 20 12 21.5C9.5 20 2 16 2 9C2 5.5 4.5 3 7.5 3C9.35997 3 11 4 12 5C13 4 14.64 3 16.5 3Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-image-2-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 11.1005L7 9.1005L12.5 14.6005L16 11.1005L19 14.1005V5H5V11.1005ZM4 3H20C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3ZM15.5 10C14.6716 10 14 9.32843 14 8.5C14 7.67157 14.6716 7 15.5 7C16.3284 7 17 7.67157 17 8.5C17 9.32843 16.3284 10 15.5 10Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-information-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM11 7H13V9H11V7ZM11 11H13V17H11V11Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-more-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 10C3.9 10 3 10.9 3 12C3 13.1 3.9 14 5 14C6.1 14 7 13.1 7 12C7 10.9 6.1 10 5 10ZM19 10C17.9 10 17 10.9 17 12C17 13.1 17.9 14 19 14C20.1 14 21 13.1 21 12C21 10.9 20.1 10 19 10ZM12 10C10.9 10 10 10.9 10 12C10 13.1 10.9 14 12 14C13.1 14 14 13.1 14 12C14 10.9 13.1 10 12 10Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-more-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4.5 10.5C3.675 10.5 3 11.175 3 12C3 12.825 3.675 13.5 4.5 13.5C5.325 13.5 6 12.825 6 12C6 11.175 5.325 10.5 4.5 10.5ZM19.5 10.5C18.675 10.5 18 11.175 18 12C18 12.825 18.675 13.5 19.5 13.5C20.325 13.5 21 12.825 21 12C21 11.175 20.325 10.5 19.5 10.5ZM12 10.5C11.175 10.5 10.5 11.175 10.5 12C10.5 12.825 11.175 13.5 12 13.5C12.825 13.5 13.5 12.825 13.5 12C13.5 11.175 12.825 10.5 12 10.5Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-movie-2-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.001 20H20V22H12C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 15.2712 20.4293 18.1755 18.001 20ZM12 10C13.1046 10 14 9.10457 14 8C14 6.89543 13.1046 6 12 6C10.8954 6 10 6.89543 10 8C10 9.10457 10.8954 10 12 10ZM8 14C9.10457 14 10 13.1046 10 12C10 10.8954 9.10457 10 8 10C6.89543 10 6 10.8954 6 12C6 13.1046 6.89543 14 8 14ZM16 14C17.1046 14 18 13.1046 18 12C18 10.8954 17.1046 10 16 10C14.8954 10 14 10.8954 14 12C14 13.1046 14.8954 14 16 14ZM12 18C13.1046 18 14 17.1046 14 16C14 14.8954 13.1046 14 12 14C10.8954 14 10 14.8954 10 16C10 17.1046 10.8954 18 12 18Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-qr-code-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16 17V16H13V13H16V15H18V17H17V19H15V21H13V18H15V17H16ZM21 21H17V19H19V17H21V21ZM3 3H11V11H3V3ZM13 3H21V11H13V3ZM3 13H11V21H3V13ZM18 13H21V15H18V13ZM6 6V8H8V6H6ZM6 16V18H8V16H6ZM16 6V8H18V6H16Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-radio-button-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM12 17C9.23858 17 7 14.7614 7 12C7 9.23858 9.23858 7 12 7C14.7614 7 17 9.23858 17 12C17 14.7614 14.7614 17 12 17Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-star-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.0006 18.26L4.94715 22.2082L6.52248 14.2799L0.587891 8.7918L8.61493 7.84006L12.0006 0.5L15.3862 7.84006L23.4132 8.7918L17.4787 14.2799L19.054 22.2082L12.0006 18.26Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-subtract-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M5 11V13H19V11H5Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-survey-fill.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6 4V8H18V4H20.0066C20.5552 4 21 4.44495 21 4.9934V21.0066C21 21.5552 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5551 3 21.0066V4.9934C3 4.44476 3.44495 4 3.9934 4H6ZM9 17H7V19H9V17ZM9 14H7V16H9V14ZM9 11H7V13H9V11ZM16 2V6H8V2H16Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-survey-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 2V4H20.0066C20.5552 4 21 4.44495 21 4.9934V21.0066C21 21.5552 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5551 3 21.0066V4.9934C3 4.44476 3.44495 4 3.9934 4H7V2H17ZM7 6H5V20H19V6H17V8H7V6ZM9 16V18H7V16H9ZM9 13V15H7V13H9ZM9 10V12H7V10H9ZM15 4H9V6H15V4Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-user-3-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 22H18V20C18 18.3431 16.6569 17 15 17H9C7.34315 17 6 18.3431 6 20V22H4V20C4 17.2386 6.23858 15 9 15H15C17.7614 15 20 17.2386 20 20V22ZM12 13C8.68629 13 6 10.3137 6 7C6 3.68629 8.68629 1 12 1C15.3137 1 18 3.68629 18 7C18 10.3137 15.3137 13 12 13ZM12 11C14.2091 11 16 9.20914 16 7C16 4.79086 14.2091 3 12 3C9.79086 3 8 4.79086 8 7C8 9.20914 9.79086 11 12 11Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-user-add-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 14.252V16.3414C13.3744 16.1203 12.7013 16 12 16C8.68629 16 6 18.6863 6 22H4C4 17.5817 7.58172 14 12 14C12.6906 14 13.3608 14.0875 14 14.252ZM12 13C8.685 13 6 10.315 6 7C6 3.685 8.685 1 12 1C15.315 1 18 3.685 18 7C18 10.315 15.315 13 12 13ZM12 11C14.21 11 16 9.21 16 7C16 4.79 14.21 3 12 3C9.79 3 8 4.79 8 7C8 9.21 9.79 11 12 11ZM18 17V14H20V17H23V19H20V22H18V19H15V17H18Z"></path></svg>

+ 1 - 0
docs/site/src/lib/symbol/ri-volume-down-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 7.22056L9.60282 10.0001H6V14.0001H9.60282L13 16.7796V7.22056ZM8.88889 16.0001H5C4.44772 16.0001 4 15.5524 4 15.0001V9.00007C4 8.44778 4.44772 8.00007 5 8.00007H8.88889L14.1834 3.66821C14.3971 3.49335 14.7121 3.52485 14.887 3.73857C14.9601 3.8279 15 3.93977 15 4.05519V19.9449C15 20.2211 14.7761 20.4449 14.5 20.4449C14.3846 20.4449 14.2727 20.405 14.1834 20.3319L8.88889 16.0001ZM18.8631 16.5911L17.4411 15.1691C18.3892 14.4376 19 13.2902 19 12.0001C19 10.5697 18.2493 9.31476 17.1203 8.60766L18.5589 7.16906C20.0396 8.26166 21 10.0187 21 12.0001C21 13.8422 20.1698 15.4905 18.8631 16.5911Z"></path></svg>

+ 68 - 21
docs/site/src/lib/tab/Tab.svelte

@@ -1,6 +1,6 @@
 <script lang="ts">
 	import { fade } from 'svelte/transition';
-	import { currentThemeStore } from '../../store';
+	import { currentThemeStore, isWideScreenStore } from '../../store';
 	// @ts-expect-error - beautify-qrcode 缺少类型定义
 	import { encodeData, rendererLine } from 'beautify-qrcode';
 	import { page } from '$app/stores';
@@ -72,6 +72,17 @@
 		codeValue = `https://github.com/any-tdf/stdf/blob/main/packages/stdf/src/lib/components/${nav}/${navFirst}.svelte`;
 		showCode = true;
 	};
+	let showFull = $state(false);
+	// 全屏
+	const changeFullFunc = () => {
+		if ($isWideScreenStore) {
+			isWideScreenStore.set(false);
+			localStorage.setItem('isFull', 'notFull');
+		} else {
+			isWideScreenStore.set(true);
+			localStorage.setItem('isFull', 'full');
+		}
+	};
 </script>
 
 <div class="w-82 md:w-102 relative top-14">
@@ -122,26 +133,7 @@
 				{/if}
 			</button>
 		</a>
-		<!--StackBlitz-->
-		<a href={stackblitzValue} target="_blank">
-			<button
-				onmouseleave={() => (showStackblitz = false)}
-				onmouseenter={showStackblitzFunc}
-				class="absolute left-[34.5rem] top-0 hidden h-12 w-12 rounded-sm bg-gray-100 p-3 md:block dark:bg-gray-700"
-			>
-				<svg viewBox="0 0 28 28" height="24">
-					<path fill="#3275e7" d="M12.747 16.273h-7.46L18.925 1.5l-3.671 10.227h7.46L9.075 26.5l3.671-10.227z" />
-				</svg>
-				{#if showStackblitz}
-					<div
-						class="absolute left-0 top-14 z-50 h-12 w-44 rounded-sm bg-gray-700 py-3 text-center leading-[1.5rem] text-white shadow-lg"
-						transition:fade={{ duration: 200 }}
-					>
-						{isZh ? '在 StackBlitz 中打开' : 'Open in StackBlitz'}
-					</div>
-				{/if}
-			</button>
-		</a>
+
 		<!--组件源码-->
 		<a href={codeValue} target="_blank">
 			<button
@@ -166,6 +158,61 @@
 				{/if}
 			</button>
 		</a>
+		<!--StackBlitz-->
+		<a href={stackblitzValue} target="_blank">
+			<button
+				onmouseleave={() => (showStackblitz = false)}
+				onmouseenter={showStackblitzFunc}
+				class="absolute left-[34.5rem] top-0 hidden h-12 w-12 rounded-sm bg-gray-100 p-3 md:block dark:bg-gray-700"
+			>
+				<svg viewBox="0 0 28 28" height="24">
+					<path fill="#3275e7" d="M12.747 16.273h-7.46L18.925 1.5l-3.671 10.227h7.46L9.075 26.5l3.671-10.227z" />
+				</svg>
+				{#if showStackblitz}
+					<div
+						class="absolute left-0 top-14 z-50 h-12 w-44 rounded-sm bg-gray-700 py-3 text-center leading-[1.5rem] text-white shadow-lg"
+						transition:fade={{ duration: 200 }}
+					>
+						{isZh ? '在 StackBlitz 中打开' : 'Open in StackBlitz'}
+					</div>
+				{/if}
+			</button>
+		</a>
+		<!-- 宽屏 -->
+		<button
+			onclick={changeFullFunc}
+			onmouseleave={() => (showFull = false)}
+			onmouseenter={() => (showFull = true)}
+			onfocus={() => (showFull = true)}
+			onblur={() => (showFull = false)}
+			class="absolute left-[38.5rem] top-0 hidden h-12 w-12 cursor-pointer rounded-sm bg-gray-100 p-3 md:block dark:bg-gray-700"
+		>
+			{#if $isWideScreenStore}
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+					<path
+						d="M20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20ZM11 5H5V19H11V15H13V19H19V5H13V9H11V5ZM15 9L18 12L15 15V13H9V15L6 12L9 9V11H15V9Z"
+						fill="currentColor"
+					></path>
+				</svg>
+			{:else}
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+					<path
+						d="M20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20ZM11 5H5V10.999H7V9L10 12L7 15V13H5V19H11V17H13V19H19V13H17V15L14 12L17 9V10.999H19V5H13V7H11V5ZM13 13V15H11V13H13ZM13 9V11H11V9H13Z"
+						fill="currentColor"
+					></path>
+				</svg>
+			{/if}
+			{#if showFull}
+				<div
+					class="{isZh
+						? 'w-20'
+						: 'w-32'} absolute left-0 top-14 z-50 h-12 rounded-sm bg-gray-700 py-3 text-center leading-[1.5rem] text-white shadow-lg"
+					transition:fade={{ duration: 200 }}
+				>
+					{isZh ? '宽屏' : 'Full screen'}
+				</div>
+			{/if}
+		</button>
 		<div class="relative flex">
 			{#each tabList as item, index}
 				<button onclick={() => changeIndexFun(index)} class="w-16 cursor-pointer rounded-sm py-2 text-center md:w-20">

+ 16 - 16
docs/site/src/lib/themeSwitch/ThemeSwitch.svelte

@@ -34,15 +34,15 @@
 	};
 </script>
 
-<div class="flex {vertical ? 'flex-col' : 'flex-row'} my-4 flex-wrap gap-2">
+<div class="flex {vertical ? 'flex-col gap-1' : 'flex-row gap-2'} my-2 flex-wrap">
 	{#each themes as item}
 		<button
-			class="flex items-center justify-between gap-2 border p-2 {$currentColorStore === item.name
+			class="flex items-center justify-between gap-1 border p-1 {$currentColorStore === item.name
 				? 'border-primary dark:border-dark'
-				: 'border-gray-100 dark:border-gray-700'} cursor-pointer rounded-md"
+				: 'border-gray-100 dark:border-gray-700'} cursor-pointer rounded-sm"
 			on:click={(e) => selectColorFunc(e, item)}
 		>
-			<div class="h-5 w-5 {$currentColorStore === item.name ? 'fill-primary dark:fill-dark' : 'fill-gray-300 dark:fill-gray-700'}">
+			<div class="size-4 {$currentColorStore === item.name ? 'fill-primary dark:fill-dark' : 'fill-gray-300 dark:fill-gray-700'}">
 				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
 					<path
 						d="M12 2C17.5222 2 22 5.97778 22 10.8889C22 13.9556 19.5111 16.4444 16.4444 16.4444H14.4778C13.5556 16.4444 12.8111 17.1889 12.8111 18.1111C12.8111 18.5333 12.9778 18.9222 13.2333 19.2111C13.5 19.5111 13.6667 19.9 13.6667 20.3333C13.6667 21.2556 12.9 22 12 22C6.47778 22 2 17.5222 2 12C2 6.47778 6.47778 2 12 2ZM7.5 12C8.32843 12 9 11.3284 9 10.5C9 9.67157 8.32843 9 7.5 9C6.67157 9 6 9.67157 6 10.5C6 11.3284 6.67157 12 7.5 12ZM16.5 12C17.3284 12 18 11.3284 18 10.5C18 9.67157 17.3284 9 16.5 9C15.6716 9 15 9.67157 15 10.5C15 11.3284 15.6716 12 16.5 12ZM12 9C12.8284 9 13.5 8.32843 13.5 7.5C13.5 6.67157 12.8284 6 12 6C11.1716 6 10.5 6.67157 10.5 7.5C10.5 8.32843 11.1716 9 12 9Z"
@@ -50,25 +50,25 @@
 					</path>
 				</svg>
 			</div>
-			<div class="whitespace-nowrap">{isZh ? item.name_CN : item.name}</div>
-			<div class="flex justify-between gap-2">
+			<div class="flex-1 whitespace-nowrap text-left text-xs font-normal">{isZh ? item.name_CN : item.name}</div>
+			<div class="flex justify-between gap-1">
 				<!-- theme  -->
 				<div class="rounded-xs flex overflow-hidden">
-					<div class="bg-primary w-6" style="background-color: {item.theme.color.primary.default};"></div>
-					<div class="bg-dark w-6" style="background-color: {item.theme.color.dark.default};"></div>
+					<div class="bg-primary w-4" style="background-color: {item.theme.color.primary.default};"></div>
+					<div class="bg-dark w-4" style="background-color: {item.theme.color.dark.default};"></div>
 				</div>
-				<div class="flex flex-col justify-between gap-1">
+				<div class="flex flex-col justify-between gap-0.5">
 					<!-- Functional -->
 					<div class="flex gap-0.5">
-						<div class="rounded-xs h-3 w-3" style="background-color: {item.theme.color.functional.success};"></div>
-						<div class="rounded-xs h-3 w-3" style="background-color: {item.theme.color.functional.warning};"></div>
-						<div class="rounded-xs h-3 w-3" style="background-color: {item.theme.color.functional.error};"></div>
-						<div class="rounded-xs h-3 w-3" style="background-color: {item.theme.color.functional.info};"></div>
+						<div class="size-2 rounded" style="background-color: {item.theme.color.functional.success};"></div>
+						<div class="size-2 rounded" style="background-color: {item.theme.color.functional.warning};"></div>
+						<div class="size-2 rounded" style="background-color: {item.theme.color.functional.error};"></div>
+						<div class="size-2 rounded" style="background-color: {item.theme.color.functional.info};"></div>
 					</div>
 					<!-- Extended -->
 					<div class="flex justify-between gap-0.5">
 						{#each item.theme.color.extend as child}
-							<div class="rounded-xs h-3 w-3" style="background-color: {child.color};"></div>
+							<div class="size-2 rounded" style="background-color: {child.color};"></div>
 						{/each}
 					</div>
 				</div>
@@ -79,9 +79,9 @@
 		<a
 			href="/guide/generator"
 			target="_blank"
-			class="text-primary hover:border-primary dark:text-dark dark:hover:border-dark group flex items-center justify-center gap-2 rounded-sm border border-gray-100 py-2 transition-all duration-300 dark:border-gray-700"
+			class="text-primary hover:border-primary dark:text-dark dark:hover:border-dark group mt-2 flex items-center justify-center gap-1 rounded-sm border border-gray-100 py-1 text-xs transition-all duration-300 dark:border-gray-700"
 		>
-			<svg class="h-5 w-5 transition-all duration-300 group-hover:scale-95" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+			<svg class="size-4 transition-all duration-300 group-hover:scale-95" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
 				<path
 					class="fill-primary dark:fill-dark"
 					d="M15.1986 9.94435C14.7649 9.53358 14.4859 8.98601 14.4085 8.39371L14.0056 5.31126L11.275 6.79711C10.7503 7.08262 10.1433 7.17876 9.55608 7.06936L6.49998 6.50003L7.06931 9.55612C7.17871 10.1434 7.08257 10.7503 6.79707 11.275L5.31121 14.0056L8.39367 14.4085C8.98596 14.4859 9.53353 14.7649 9.94431 15.1986L12.0821 17.4555L13.4178 14.6485C13.6745 14.1091 14.109 13.6745 14.6484 13.4179L17.4555 12.0821L15.1986 9.94435ZM15.2238 15.5078L13.0111 20.1579C12.8687 20.4572 12.5107 20.5843 12.2115 20.4419C12.1448 20.4102 12.0845 20.3664 12.0337 20.3127L8.49229 16.574C8.39749 16.4739 8.27113 16.4095 8.13445 16.3917L3.02816 15.7242C2.69958 15.6812 2.46804 15.3801 2.51099 15.0515C2.52056 14.9782 2.54359 14.9074 2.5789 14.8425L5.04031 10.3191C5.1062 10.198 5.12839 10.0579 5.10314 9.92241L4.16 4.85979C4.09931 4.53402 4.3142 4.22074 4.63997 4.16005C4.7126 4.14652 4.78711 4.14652 4.85974 4.16005L9.92237 5.10319C10.0579 5.12843 10.198 5.10625 10.319 5.04036L14.8424 2.57895C15.1335 2.42056 15.4979 2.52812 15.6562 2.81919C15.6916 2.88409 15.7146 2.95495 15.7241 3.02821L16.3916 8.13449C16.4095 8.27118 16.4739 8.39754 16.5739 8.49233L20.3127 12.0337C20.5533 12.2616 20.5636 12.6414 20.3357 12.8819C20.2849 12.9356 20.2246 12.9794 20.1579 13.0111L15.5078 15.2238C15.3833 15.2831 15.283 15.3833 15.2238 15.5078ZM16.0206 17.4349L17.4348 16.0207L21.6775 20.2633L20.2633 21.6775L16.0206 17.4349Z"

+ 49 - 0
docs/site/src/routes/+error.svelte

@@ -0,0 +1,49 @@
+<script lang="ts">
+	const isZh = localStorage.getItem('lang') === 'zh_CN';
+</script>
+
+<div class="flex h-screen flex-col items-center justify-center">
+	<div class="flex flex-col items-center">
+		<div class="flex items-center gap-1">
+			<div class="text-primary dark:text-dark mb-4 text-9xl font-bold">4</div>
+			<div>
+				<svg viewBox="0 0 100 100" class="svg-spin size-20">
+					<path
+						fill-rule="evenodd"
+						clip-rule="evenodd"
+						d="M50 0V100C22.3858 100 0 77.6142 0 50C0 22.3858 22.3858 0 50 0Z"
+						class="fill-dark"
+					/>
+					<path
+						fill-rule="evenodd"
+						clip-rule="evenodd"
+						d="M50 100V0C77.6142 0 100 22.3858 100 50C100 77.6142 77.6142 100 50 100Z"
+						class="fill-primary"
+					/>
+					<circle cx="50" cy="25" r="25" class="fill-primary" />
+					<circle cx="50" cy="75" r="25" class="fill-dark" />
+					<circle cx="50.25" cy="25.25" r="6.25" class="fill-dark" />
+					<circle cx="50.25" cy="75.25" r="6.25" class="fill-primary" />
+				</svg>
+			</div>
+			<div class="text-primary dark:text-dark mb-4 text-9xl font-bold">4</div>
+		</div>
+		<p class="mb-8 text-black/60 dark:text-white/60">{isZh ? '抱歉,页面未找到' : 'Sorry, page not found'}</p>
+		<a href="/" class="bg-primary dark:bg-dark rounded px-6 py-2 text-white hover:opacity-90">{isZh ? '返回首页' : 'Back to home'}</a>
+	</div>
+</div>
+
+<style>
+	@keyframes svg-spin {
+		0% {
+			transform: rotate(360deg);
+		}
+		100% {
+			transform: rotate(0deg);
+		}
+	}
+
+	.svg-spin {
+		animation: svg-spin 8s linear infinite;
+	}
+</style>

+ 2 - 0
docs/site/src/routes/+layout.svelte

@@ -100,7 +100,9 @@
 <main class="bg-primaryWhite dark:bg-darkBlack relative min-h-screen text-justify text-black antialiased dark:text-white">
 	<Header {showLeftNav} showBottonLine={!isHome} onclickCmdK={headerCmdKFun} />
 	<!-- <Router {routes} /> -->
+	<!-- <div class="mx-auto max-w-[1536px]"> -->
 	{@render children()}
+	<!-- </div> -->
 
 	<CmdK />
 	<!-- 赞赏 -->

+ 357 - 193
docs/site/src/routes/+page.svelte

@@ -1,126 +1,304 @@
 <script lang="ts">
 	import { onMount, onDestroy } from 'svelte';
-	// import { link } from 'svelte-spa-router';
 	import { fade } from 'svelte/transition';
 	import { Confetti } from 'svelte-confetti';
 	import { currentThemeStore, currentColorStore } from '../store';
+	// @ts-ignore
 	import { encodeData, rendererLine } from 'beautify-qrcode';
+	import { Tab, Loading, Switch, Avatar, Pagination, Input, Rate, Icon, NoticeBar, Slider, Swiper, Button } from 'stdf';
+	import type { SwiperImgProps, SwiperProps } from 'stdf/types';
+	import { menuList, type MenuList } from '../data/menuList';
+	import themes from '../data/themes/index.js';
+	import { switchTheme } from 'stdf/theme';
+
+	const isZh = localStorage.getItem('lang') === 'zh_CN';
+
+	// 随机生成 1_0 到 1_53 这种字符串
+	const randomNum = Math.floor(Math.random() * 53) + 1;
+	const randomNumStr = `1_${randomNum}`;
+	const swiperData: SwiperImgProps[] = [
+		{ type: 'img', url: '/assets/images/home/wall_1.jpg' },
+		{ type: 'img', url: '/assets/images/home/wall_2.jpg' },
+		{ type: 'img', url: '/assets/images/home/wall_3.jpg' },
+		{ type: 'img', url: '/assets/images/home/wall_4.jpg' }
+	];
+	const swiperOptions: SwiperProps[] = [
+		{
+			data: swiperData,
+			containerWidth: 390,
+			px: '6',
+			py: '6',
+			indicateInjClass: 'bg-none',
+			indicateColor: 'bg-black/5 dark:bg-white/10',
+			indicateActiveColor: 'bg-primary dark:bg-dark',
+			radius: 'xl',
+			indicateStyle: 'longLine'
+		},
+		{
+			data: swiperData,
+			containerWidth: 390,
+			px: '16',
+			py: '6',
+			indicateInjClass: 'bg-none',
+			indicateColor: 'bg-primary dark:bg-dark',
+			indicateActiveColor: 'bg-primary dark:bg-dark',
+			radius: 'xl',
+			aspectRatio: [3, 1],
+			innerInjClass: 'shadow-md shadow-black/20 dark:shadow-white/20',
+			translateX: 100
+		},
+		{
+			data: swiperData,
+			containerWidth: 390,
+			px: '4',
+			py: '8',
+			indicateInjClass: 'bg-none',
+			indicateColor: 'bg-primary dark:bg-dark',
+			indicateActiveColor: 'bg-primary dark:bg-dark',
+			radius: 'xl',
+			rotateY: 90,
+			innerInjClass: 'shadow-md shadow-black/20 dark:shadow-white/20'
+		},
+		{
+			data: swiperData,
+			containerWidth: 390,
+			px: '24',
+			py: '8',
+			indicateInjClass: 'bg-none',
+			indicateColor: 'bg-primary dark:bg-dark',
+			indicateActiveColor: 'bg-primary dark:bg-dark',
+			innerInjClass: 'shadow-md shadow-black/20 dark:shadow-white/20',
+			radius: 'xl',
+			aspectRatio: [3, 1],
+			translateX: 160,
+			notActiveInjClass: 'grayscale'
+		},
+		{
+			data: swiperData,
+			indicateStyle: 'longLine',
+			containerWidth: 390,
+			px: '12',
+			py: '8',
+			indicateInjClass: 'bg-none',
+			indicateColor: 'bg-black/5 dark:bg-white/10',
+			indicateActiveColor: 'bg-primary dark:bg-dark',
+			radius: 'xl',
+			translateZ: 600,
+			innerInjClass: 'shadow-md shadow-black/20 dark:shadow-white/20'
+		}
+	];
+	const swiperOption = swiperOptions[Math.floor(Math.random() * swiperOptions.length)];
+	//数组二级组成新数组
+	const ArrChildFun = (arr: MenuList[]) => {
+		const newArr = [];
+		for (let e = 0; e < arr.length; e++) {
+			newArr.push(...arr[e].childs);
+		}
+		return newArr;
+	};
+	const menuChildList = ArrChildFun(menuList);
+	// 从 menuChildList 中随机取 3 个
+	const randomMenuChildList = menuChildList.sort(() => Math.random() - 0.5).slice(0, 3);
+	const textList = randomMenuChildList.map((item, index) => {
+		return `${index + 1}. ${isZh ? item.tip : item.tip_en}`;
+	});
+	const labels = randomMenuChildList.map((item) => {
+		return { text: isZh ? item.title_zh : item.title_en };
+	});
+	// Avatar radius 随机 'none'|'sm'|'xl'|'2xl'|'3xl'|'full'
+	const avatarRadiusList = ['none', 'sm', 'xl', '2xl', '3xl', 'full'] as const;
+	const avatarRadius = avatarRadiusList[Math.floor(Math.random() * avatarRadiusList.length)];
+	const avatarImgs = ['/assets/images/home/wall_3.jpg', '/assets/images/home/avatar_1.jpg', null];
+	const avatar = avatarImgs[Math.floor(Math.random() * avatarImgs.length)];
+	// Switch radius 随机 'none'|'middle'|'full' ,inside 随机 'state'|'loading'|null
+	const switchRadiusList = ['none', 'middle', 'full'];
+	const switchRadius = switchRadiusList[Math.floor(Math.random() * switchRadiusList.length)] as 'none' | 'middle' | 'full';
+	const switchInsideList = ['state', 'loading', null];
+	const switchInside = switchInsideList[Math.floor(Math.random() * switchInsideList.length)] as 'state' | 'loading' | null;
+	// Slider 随机 0-100
+	const sliderValue = Math.floor(Math.random() * 100);
+	// slider radius 随机 'none'|'full'|'sm'|'xl'
+	const sliderRadiusList = ['none', 'full', 'sm', 'xl'];
+	const sliderRadius = sliderRadiusList[Math.floor(Math.random() * sliderRadiusList.length)] as 'none' | 'full' | 'sm' | 'xl';
+	// 列举 20 个与评分相关的 emoji 表情
+	const emojiList1 = ['love', 'default'];
+	const emojiList2 = ['👍', '👋', '👏', '🌺', '🏆', '🎯', '💯', '🎳', '🎖️'];
+	// 随机出一个 emoji,emojiList1 的概率为 0.5,emojiList2 的概率为 0.5
+	const emoji =
+		Math.random() > 0.5
+			? emojiList1[Math.floor(Math.random() * emojiList1.length)]
+			: emojiList2[Math.floor(Math.random() * emojiList2.length)];
+	// Tab radius 随机 'none'|'full'|'sm'|'xl'
+	const tabRadiusList = ['none', 'full', 'sm', 'xl'];
+	const tabRadius = tabRadiusList[Math.floor(Math.random() * tabRadiusList.length)] as 'none' | 'full' | 'sm' | 'xl';
+	// lineType 随机 true 或 false
+	const lineType = Math.random() > 0.5;
+	// Pagination 随机总条数 50 - 200 和当前页,保证当前页在 1 - 总条数/10 之间
+	const paginationTotal = Math.floor(Math.random() * 150) + 50;
+	const paginationCurrent = Math.floor(Math.random() * (paginationTotal / 10)) + 1;
+	// paginationType 随机 'block'|'bold'|'border'
+	const paginationTypeList = ['block', 'bold', 'border'];
+	const paginationType = paginationTypeList[Math.floor(Math.random() * paginationTypeList.length)] as 'block' | 'bold' | 'border';
+	const paginationRadiusList = ['none', 'sm', 'md', 'lg', 'xl', 'full'];
+	const paginationRadius = paginationRadiusList[Math.floor(Math.random() * paginationRadiusList.length)] as
+		| 'none'
+		| 'sm'
+		| 'md'
+		| 'lg'
+		| 'xl'
+		| 'full';
+	const injPaginationRadiusList = {
+		none: 'rounded-none',
+		sm: 'rounded-sm',
+		md: 'rounded-md',
+		lg: 'rounded-lg',
+		xl: 'rounded-xl',
+		full: 'rounded-full'
+	};
+	const injPaginationRadius = injPaginationRadiusList[paginationRadius];
+	// 随机主题
+	const randomThemeFunc = () => {
+		const item = themes[Math.floor(Math.random() * themes.length)];
+		currentColorStore.set(item.name);
+		localStorage.setItem('theme_color', item.name);
+		const theme = item.theme;
+
+		switchTheme(theme);
+		// 修改 HTML 的 meta name="theme-color" 属性,适配 Safari 的 tab 背景色,需要设置 light 和 dark 两种颜色
+		const safariLight = theme.color.primaryWhite;
+		const safariDark = theme.color.darkBlack;
+		// 查找 meta 标签,name="theme-color" 且 media="(prefers-color-scheme: light)"
+		const lightMeta = document.querySelector('meta[name="theme-color"][media="(prefers-color-scheme: light)"]');
+		// 查找 meta 标签,name="theme-color" 且 media="(prefers-color-scheme: dark)"
+		const darkMeta = document.querySelector('meta[name="theme-color"][media="(prefers-color-scheme: dark)"]');
+		// 如果找到了,就修改它的 content 属性
+		if (lightMeta) {
+			lightMeta.setAttribute('content', safariLight);
+		}
+		if (darkMeta) {
+			darkMeta.setAttribute('content', safariDark);
+		}
+	};
+	// randomMenuChildList 随机出一个
+	const inputList = randomMenuChildList[Math.floor(Math.random() * randomMenuChildList.length)];
+	const inputTitle = isZh ? inputList.title_zh : inputList.title_en;
+	let inputValue = $state(isZh ? inputList.tip : inputList.tip_en);
+	const inputRadiusList = ['none', 'full', 'sm', 'xl'];
+	const inputRadius = inputRadiusList[Math.floor(Math.random() * inputRadiusList.length)] as 'none' | 'full' | 'sm' | 'xl';
+	const inputStyleList = ['line', 'block'];
+	const inputStyle = inputStyleList[Math.floor(Math.random() * inputStyleList.length)] as 'line' | 'block';
+	let showInputConfetti = $derived(inputValue === inputTitle);
+	// 当 inputValue === inputTitle 时,显示 confetti
+	const inputFun = (v: string) => {
+		inputValue = v;
+	};
 
 	const descList = [
 		{
 			title: 'Simple',
-			titleZh: '简 单',
-			desc: '使用 Svelte 语法编码简洁迅速。组件源码逻辑清晰、简单易懂、中英注释详细,查看源码、修改逻辑也可以得心应手。',
-			descEn:
-				'Coding with Svelte syntax is simple and fast. The component source code logic is clear, simple and easy to understand, and the English and Chinese comments are detailed. You can also get used to it by viewing the source code and modifying the logic yourself.',
-			icon: '/assets/images/3D-simple.png',
-			iconDark: '/assets/images/3D-simple-dark.png',
+			titleZh: '简单',
+			desc: '代码清晰,文档完善,易于使用。',
+			descEn: 'Clear code, complete docs, easy to use.',
+			icon: '/assets/images/home/s.jpeg',
 			shwTip: false
 		},
 		{
 			title: 'Thin',
-			titleZh: '轻 量',
-			desc: '源码体积小巧,无三方依赖。基于 Svelte 与 Tailwind 编译出的代码在体积上也优势明显,这在移动端显得尤为重要。',
-			descEn:
-				'The source code is small and has no third-party dependencies. The code compiled based on Svelte and Tailwind also has obvious advantages in terms of volume, which is particularly important in mobile terminals.',
-			icon: '/assets/images/3D-thin.png',
-			iconDark: '/assets/images/3D-thin-dark.png',
+			titleZh: '轻量',
+			desc: '体积小,无依赖,适合移动端。',
+			descEn: 'Small size, no deps, for mobile.',
+			icon: '/assets/images/home/t.jpeg',
 			shwTip: true
 		},
 		{
 			title: 'Design',
-			titleZh: '设 计',
-			desc: '针对移动设备优化设计与交互,使用友好、高效、灵活。支持通过简单配置定制颜色系统、圆角风格、亮暗模式等。',
-			descEn:
-				'Optimized design and interaction for mobile devices, user-friendly, efficient, and flexible. Support customizing color system, corner style, light and dark mode, etc. through simple configuration.',
-			icon: '/assets/images/3D-design.png',
-			iconDark: '/assets/images/3D-design-dark.png',
+			titleZh: '设计',
+			desc: '优化移动端设计交互,支持主题配置。',
+			descEn: 'Better mobile design & themes.',
+			icon: '/assets/images/home/d.jpeg',
 			shwTip: false
 		},
 		{
 			title: 'Fast',
-			titleZh: '快 速',
-			desc: '无运行时,无虚拟 DOM,无烦杂的 CSS 代码,状态管理简单轻快。编码过程、编译处理、线上运行全都快起来了。',
-			descEn:
-				'No runtime, no virtual DOM, no cumbersome CSS code, simple and fast state management. The coding process, compilation processing, and online running are all faster.',
-			icon: '/assets/images/3D-fast.png',
-			iconDark: '/assets/images/3D-fast-dark.png',
+			titleZh: '快速',
+			desc: '脚手架快速开发,无虚拟 DOM,性能卓越。',
+			descEn: 'Quick dev with CLI, no vDOM, high performance.',
+			icon: '/assets/images/home/f.jpeg',
 			shwTip: false
 		}
 	];
 	const dominant = {
-		title: '💪 优势 & 目标',
-		title_en: '💪 Advantages & Goals',
+		title: '优势 & 目标',
+		title_en: 'Advantages & Goals',
 		data: [
 			{
 				icon: 'svelte',
-				p: '补充 Svelte 生态,让开发者可以更快速更舒服地开发出高质量的应用。',
-				p_en: 'Supplement the Svelte ecosystem so that developers can develop high-quality applications faster and more comfortably.'
+				p: '丰富 Svelte 生态,助力开发者更高效地构建优质应用。',
+				p_en: 'Enrich the Svelte ecosystem to help developers build quality applications more efficiently.'
 			},
 			{
 				icon: 'css3-line',
-				p: '避免写繁琐的 CSS 代码,让开发者专注于业务逻辑,提高开发效率。',
-				p_en: 'Avoid writing tedious CSS code, allowing developers to focus on business logic and improve development efficiency.'
+				p: '简化 CSS 开发,让开发者专注业务逻辑,提升开发效率。',
+				p_en: 'Simplify CSS development so developers can focus on business logic and improve productivity.'
 			},
 			{
 				icon: 'contrast-2-line',
-				p: '支持暗黑模式与主题配置,方便开发者直接适配,让应用更加现代化。',
-				p_en: 'Supports dark mode and theme configuration, making it easy for developers to adapt directly and make applications more modern.'
+				p: '内置暗黑模式与主题配置,轻松打造现代化应用界面。',
+				p_en: 'Built-in dark mode and theme configuration for easily creating modern application interfaces.'
 			},
 			{
 				icon: 'paint-brush-line',
-				p: '普适性较强。移动端组件库多用于 C 端,对比 B 端更加需要注重 UI 的灵活性。',
-				p_en: 'It has strong versatility. Mobile component libraries are mostly used in C-end scenarios where UI flexibility is more important than B-end.'
+				p: '高度通用性。作为面向 C 端的移动组件库,特别注重 UI 的灵活性。',
+				p_en: 'Highly versatile. As a C-end mobile component library, it particularly emphasizes UI flexibility.'
 			},
 			{
 				icon: 'clockwise-line',
-				p: '注重交互与体验。适当的过渡动画与合理的交互设计,希望给你更好的用户体验。',
-				p_en: 'Emphasis on interaction and experience. Appropriate transition animations and reasonable interaction design hope to give you a better user experience.'
+				p: '精心设计的交互体验。合理的动画过渡与交互设计,带来出色的用户体验。',
+				p_en: 'Carefully designed interactions. Thoughtful animations and interaction design for excellent user experience.'
 			},
 			{
 				icon: 'article-line',
-				p: '站点文档、示例、源码注释都支持中英双语,且不再中英混杂,一目了然。',
-				p_en: 'Site documentation, examples, and source code comments all support bilingual Chinese and English, making it clear at a glance.'
+				p: '完整的中英双语支持。文档、示例和源码注释清晰分离,一目了然。',
+				p_en: 'Complete bilingual support. Documentation, examples and code comments are clearly separated in both languages.'
 			},
 			{
 				icon: 'file-copy-2-line',
-				p: '示例代码丰富,方便直接复制使用,配备脚手架、插件等工具,对开发者友好。',
-				p_en: 'The example code is extensive and convenient for direct copying and usage. It is equipped with scaffolding, plugins, etc. making it developer-friendly.'
+				p: '丰富的示例代码与开发工具,包含脚手架和插件,助力快速开发。',
+				p_en: 'Rich example code and development tools, including scaffolding and plugins, to aid rapid development.'
 			},
 			{
 				icon: 'planet-line',
-				p: '组件支持国际化(目前 60+ 语言),让应用轻松实现多语言支持。',
-				p_en: 'Component supports internationalization (currently 60+ languages), making it easy for applications to achieve multilingual support.'
+				p: '强大的国际化能力,支持 60+ 种语言,轻松实现多语言应用。',
+				p_en: 'Powerful internationalization with 60+ languages support for easily creating multilingual applications.'
 			}
 		]
 	};
 	const ugly = {
-		title: '🔔 提前警告',
-		title_en: '🔔 Early Warning',
+		title: '提前警告',
+		title_en: 'Early Warning',
 		data: [
 			{
 				icon: 'medal-line',
-				p: 'STDF 不体现任何「价值观」,更加不能为您「赋能」,只希望能给您更好的开发体验,很简单很朴实。',
-				p_en: 'STDF does not reflect any "values", and cannot "empower" you. We only hope to provide you with a better development experience, which is simple and straightforward.'
+				p: 'STDF 不追求高大上的概念,只专注于为您提供简单实用的开发工具。',
+				p_en: 'STDF focuses solely on providing practical development tools, without any fancy concepts.'
 			},
 			{
 				icon: 'service-line',
-				p: 'Svelte 生态相对 Vue 和 React 还很薄弱,如果您有兴趣,请积极参与和丰富 Svelte 生态。',
-				p_en: 'The Svelte ecosystem is still relatively weak compared to Vue and React. If you are interested, please actively participate in and enrich the Svelte ecosystem.'
+				p: 'Svelte 生态仍在发展中,欢迎您加入我们一起建设更好的 Svelte 社区。',
+				p_en: 'The Svelte ecosystem is still growing. We welcome you to join us in building a better Svelte community.'
 			},
 			{
 				icon: 'bard-line',
-				p: 'STDF 也适用于 Svelte 生态的其他工程,比如 SvelteKit 等,使用前请确保知晓它们的基础原理。',
-				p_en: 'STDF also applies to other projects in the Svelte ecosystem, such as SvelteKit, etc. When using them, please ensure that you understand their basic principles.'
+				p: 'STDF 可能使用到 Vite、SvelteKit 等生态,建议先了解这些项目的核心概念。',
+				p_en: 'STDF may use Vite, SvelteKit, etc. We recommend understanding their core concepts first.'
 			},
 			{
 				icon: 'git-close-pull-request-line',
-				p: 'STDF 也适用于 Tailwind CSS 的类库,如 UnoCSS 等,使用它们请确保您知晓它们的基础原理。',
-				p_en: 'STDF also applies to class libraries of Tailwind CSS, such as UnoCSS, etc. When using them, please ensure that you understand their basic principles.'
+				p: 'STDF 支持 UnoCSS 等 Tailwind CSS 类库,使用前请先掌握相关基础知识。',
+				p_en: 'STDF supports Tailwind CSS-like libraries such as UnoCSS. Please master the basics before using them.'
 			}
 		]
 	};
-	const isZh = localStorage.getItem('lang') === 'zh_CN';
 
 	// 赞助人员
 	const thinkGithub = [
@@ -144,12 +322,7 @@
 			title: '工具',
 			title_en: 'Tools',
 			list: [
-				{
-					title: 'create-stdf',
-					title_en: 'create-stdf',
-					link: 'https://www.npmjs.com/package/create-stdf',
-					_blank: true
-				},
+				{ title: 'create-stdf', title_en: 'create-stdf', link: 'https://www.npmjs.com/package/create-stdf', _blank: true },
 				{
 					title: 'rollup-plugin-stdf-icon',
 					title_en: 'rollup-plugin-stdf-icon',
@@ -177,57 +350,29 @@
 				{ title: '关于', title_en: 'About', link: '/guide/about', _blank: false },
 				{ title: '常见问题', title_en: 'FAQ', link: '/guide/faq', _blank: false },
 				{ title: '更新日志', title_en: 'Changelog', link: '/guide/changelog', _blank: false },
-				{
-					title: '开源许可',
-					title_en: 'License',
-					link: 'https://github.com/any-tdf/stdf/blob/main/LICENSE',
-					_blank: true
-				}
+				{ title: '开源许可', title_en: 'License', link: 'https://github.com/any-tdf/stdf/blob/main/LICENSE', _blank: true }
 			]
 		},
 		{
 			title: '社区',
 			title_en: 'Community',
 			list: [
-				// { title: 'GitHub', title_en: 'GitHub', link: 'https://github.com/any-tdf/stdf' },
 				{
 					title: 'QQ 群',
 					title_en: 'QQ Group',
 					link: 'https://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=U8ZlXJ3KVpTI9oZzs1jBnyWc3gVA0h6Y&authKey=ScWu0nU9g8BqNsC7o2eYkESwgVDVz9vzGNZEb17MrEAay9%2F7bTkXDiLJRIzo2vrg&noverify=0&group_code=581073686',
 					_blank: true
 				},
-				// { title: '钉钉群', title_en: 'DingTalk Group', link: '', _blank: true },
-				{
-					title: 'Discord',
-					title_en: 'Discord',
-					link: 'https://discord.gg/DMkHu8GGre',
-					_blank: true
-				},
-				{
-					title: 'QQ 频道',
-					title_en: 'QQ Discord',
-					link: 'https://pd.qq.com/s/fdd8incyr',
-					_blank: true
-				},
-				{
-					title: 'Discussions',
-					title_en: 'Discussions',
-					link: 'https://github.com/any-tdf/stdf/discussions',
-					_blank: true
-				}
+				{ title: 'Discord', title_en: 'Discord', link: 'https://discord.gg/DMkHu8GGre', _blank: true },
+				{ title: 'QQ 频道', title_en: 'QQ Discord', link: 'https://pd.qq.com/s/fdd8incyr', _blank: true },
+				{ title: 'Discussions', title_en: 'Discussions', link: 'https://github.com/any-tdf/stdf/discussions', _blank: true }
 			]
 		}
 	];
 	let showQr = $state(false);
-	let show3D = $state(!(localStorage.getItem('show3D') === '0'));
-
-	const change3DFunc = () => {
-		show3D = !show3D;
-		localStorage.setItem('show3D', show3D ? '1' : '0');
-	};
 
 	const io = new IntersectionObserver((entries: IntersectionObserverEntry[]) => {
-		entries.forEach((item) => {
+		for (const item of entries) {
 			// isIntersecting 是一个 Boolean 值,判断目标元素当前是否可见
 			if (item.isIntersecting) {
 				const target = item.target as HTMLElement;
@@ -240,7 +385,7 @@
 				// item.target.style.opacity = 0;
 				// item.target.style.transform = 'translateY(200px)';
 			}
-		});
+		}
 	});
 	let A_a1Svg = $state();
 	const mouseenterFun = () => {
@@ -256,75 +401,32 @@
 		 * @param {String} [options.posColor] 定位点颜色
 		 */
 		const qrcode = encodeData({
-			text: 'https://demo.stdf.design?lang=' + (isZh ? 'zh_CN' : 'en_US'),
+			text: `https://demo.stdf.design?lang=${isZh ? 'zh_CN' : 'en_US'}`,
 			isSpace: false
 		});
 		const color = $currentThemeStore === 'dark' ? 'var(--color-dark)' : 'var(--color-primary)';
 		A_a1Svg = rendererLine(qrcode, { posType: 2, otherColor: color, posColor: color });
 		showQr = true;
 	};
+
 	onMount(() => {
 		const intersectionList = document.querySelectorAll('.intersection');
-		intersectionList.forEach((item) => {
+		for (const item of intersectionList) {
 			// 开始时 opacity 为 0,不可见,transform 为 translateY(200px)
 			const target = item as HTMLElement;
 			target.style.opacity = '0';
 			target.style.transform = 'translateY(200px)';
 			target.style.transitionDuration = '1s';
 			io.observe(item);
-		});
-	});
-	const unsubscribe = currentColorStore.subscribe(() => {
-		show3D = false;
-		setTimeout(() => {
-			show3D = localStorage.getItem('show3D') === '1';
-		}, 0);
-	});
-	onDestroy(() => {
-		unsubscribe();
+		}
 	});
 </script>
 
-<div class="mx-auto max-w-[2000px]">
-	<div class="flex-row-reverse justify-center lg:flex">
-		{#if show3D}
-			<div class="group relative mt-10 basis-1/2 overflow-hidden md:mt-0">
-				<spline-viewer
-					class="aspect-[4/3] scale-110 md:aspect-auto md:scale-100"
-					url="/assets/3d/scene.splinecode"
-					background={$currentThemeStore === 'dark'
-						? `rgb(${getComputedStyle(document.documentElement).getPropertyValue('--theme-color-darkBlack')})`
-						: `rgb(${getComputedStyle(document.documentElement).getPropertyValue('--theme-color-primaryWhite')})`}
-				></spline-viewer>
-				<!-- background="rgb(242, 242, 243)" -->
-				<!-- background={backgroundColor} -->
-				<!-- background="rgb(255, 0, 0)" -->
-				<button
-					onclick={() => {
-						show3D = false;
-						localStorage.setItem('show3D', '0');
-					}}
-					class="absolute left-10 top-10 hidden scale-0 cursor-pointer rounded-sm bg-black/5 px-2 py-1 text-xs text-black/80 transition-all duration-500 group-hover:scale-100 md:block dark:bg-white/10 dark:text-white/90"
-				>
-					{isZh ? '隐藏 3D LOGO' : 'Hidden 3D LOGO'}
-				</button>
-			</div>
-		{:else}
-			<!-- 图片 -->
-			<div class="group relative mt-10 flex basis-1/2 flex-col justify-center overflow-hidden md:mt-0">
-				<img src="/assets/3d/dark.png" alt="" class="hidden w-full object-cover dark:block" />
-				<img src="/assets/3d/light.png" alt="" class="block w-full object-cover dark:hidden" />
-				<button
-					onclick={() => {
-						show3D = true;
-						localStorage.setItem('show3D', '1');
-					}}
-					class="absolute left-10 top-10 hidden scale-0 cursor-pointer rounded-sm bg-black/5 px-2 py-1 text-xs text-black/80 transition-all duration-300 group-hover:scale-100 md:block dark:bg-white/10 dark:text-white/90"
-				>
-					{isZh ? '显示 3D LOGO' : 'Show 3D LOGO'}
-				</button>
-			</div>
-		{/if}
+<!-- <div style="width: 100%; height: 100vh; background: #f0f0f0"> -->
+<!-- </div> -->
+
+<div class="mx-auto max-w-[1536px]">
+	<div class="justify-center lg:flex">
 		<div class="flex basis-2/5 flex-col justify-center py-16 text-center md:py-20">
 			<div class="relative mb-20 mt-16 hidden h-20 flex-col items-center justify-center md:flex md:h-28">
 				<div class="animate-dynamicsBg absolute rounded-full opacity-50 blur-xl md:opacity-100 md:blur-3xl">
@@ -364,8 +466,8 @@
 					</svg>
 				</div>
 			</div>
-			<div class="text-5xl font-medium md:text-8xl">S T D F</div>
-			<div class="mt-4 px-4 md:text-xl">
+			<div class="text-6xl md:text-8xl">STDF</div>
+			<div class="mb-10 mt-4 px-4 text-gray-700 md:mb-0 md:text-lg">
 				{#if isZh}
 					基于
 					<a
@@ -455,29 +557,95 @@
 				</a>
 			</div>
 		</div>
+		<div class="group relative mt-10 hidden basis-3/5 xl:mt-0 xl:block">
+			<div class="animate-elementUpDownMove1 -translate-x-18 absolute inset-1/2 size-20 -translate-y-12">
+				{#if avatar}
+					<Avatar size="md" radius={avatarRadius} image={avatar} injClass="shadow-lg dark:shadow-white/10" />
+				{:else}
+					<Avatar size="md" radius={avatarRadius} injClass="shadow-lg dark:shadow-white/10" />
+				{/if}
+			</div>
+			<div class="animate-elementUpDownMove1 absolute inset-1/2 -translate-x-96 -translate-y-40">
+				<Loading type={randomNumStr} theme />
+			</div>
+			<div class="animate-elementUpDownMove3 absolute inset-1/2 -translate-y-48 translate-x-52">
+				<Switch radius={switchRadius} inside={switchInside} active />
+			</div>
+			<div class="animate-elementUpDownMove6 -translate-y-42 absolute inset-1/2 w-96 -translate-x-72">
+				<Tab {labels} radius={tabRadius} {lineType} />
+			</div>
+			<div
+				class="animate-elementUpDownMove5 w-84 absolute inset-1/2 h-24 translate-x-20 translate-y-6 rounded-lg bg-white px-2 shadow-lg dark:bg-black/80 dark:shadow-white/10"
+			>
+				<Input
+					title={inputTitle}
+					value={inputValue}
+					{inputStyle}
+					placeholder={isZh ? `请输入${inputTitle}` : `Input ${inputTitle}`}
+					radius={inputRadius}
+					lineTransition="left"
+					clear
+					onchange={inputFun}
+				/>
+				<span class="absolute left-0 top-1/2 {showInputConfetti ? 'block' : 'hidden'}">
+					<Confetti infinite rounded x={[-0.5, 0.5]} y={[-0.5, 0.5]} />
+				</span>
+			</div>
+			<div class="animate-elementUpDownMove6 absolute inset-1/2 w-96 translate-x-2 translate-y-48">
+				<Pagination
+					total={paginationTotal}
+					type={paginationType}
+					current={paginationCurrent}
+					radius={paginationRadius}
+					injClass="{injPaginationRadius} shadow-lg dark:shadow-white/10"
+				/>
+			</div>
+			<div class="animate-elementUpDownMove4 absolute inset-1/2 w-64 -translate-x-80 -translate-y-8">
+				{#if emoji === 'default'}
+					<Rate />
+				{:else}
+					<Rate half opacity="0.2" value={3.5}>
+						{#if emoji === 'love'}
+							<Icon name="ri-heart-3-fill" injClass="text-[red]" />
+						{:else}
+							<div class="text-xl">{emoji}</div>
+						{/if}
+					</Rate>
+				{/if}
+			</div>
+			<div
+				class="animate-elementUpDownMove3 h-15 absolute inset-1/2 w-96 -translate-x-96 -translate-y-72 rounded-lg bg-white p-3 shadow-lg dark:bg-black/80 dark:shadow-white/10"
+			>
+				<NoticeBar vertical {textList}></NoticeBar>
+			</div>
+			<div class="animate-elementUpDownMove1 absolute inset-1/2 w-64 -translate-y-20 translate-x-32">
+				<Slider value={sliderValue} showTip="always" radius={sliderRadius} />
+			</div>
+			<div class="animate-elementUpDownMove5 h-54 -translate-x-110 absolute inset-1/2 w-[390px] translate-y-16 overflow-hidden">
+				<Swiper {...swiperOption} />
+			</div>
+			<div class="animate-elementUpDownMove1 -translate-y-74 absolute inset-1/2 w-64 translate-x-32">
+				<Button heightIn="2" onclick={randomThemeFunc}>
+					{isZh ? '随机主题' : 'Random Theme'}
+				</Button>
+			</div>
+		</div>
 	</div>
-	<div class="flex flex-wrap justify-around gap-8 px-8 xl:flex-nowrap">
+	<div class="mt-16 flex flex-wrap justify-around gap-12 px-8 xl:flex-nowrap">
 		{#each descList as desc}
 			<div
-				class="intersection group flex w-full flex-col items-center space-y-5 overflow-hidden rounded-xl border-black/5 pb-8 transition-all duration-300 ease-out sm:w-2/3 md:w-80 lg:w-96 dark:border-white/5 dark:hover:shadow-white/5"
+				class="intersection shadow-primary/10 dark:shadow-dark/20 group flex w-full flex-col space-y-5 overflow-hidden rounded-2xl shadow-xl transition-all duration-300 sm:w-2/3 md:w-80 lg:w-96"
 			>
-				<div class="overflow-hidden">
-					<img
-						class="block scale-100 object-cover transition-all duration-500 group-hover:scale-[1.6] dark:hidden"
-						src={desc.icon}
-						alt=""
-					/>
-					<img
-						class="hidden scale-100 object-cover transition-all duration-500 group-hover:scale-[1.6] dark:block"
-						src={desc.iconDark}
-						alt=""
-					/>
-				</div>
-				{#if isZh}
-					<div class="py-4 text-3xl font-medium">{isZh ? desc.titleZh : desc.title}</div>
-				{/if}
-				<div class="text-sm text-black/70 dark:text-white/60 {isZh ? 'text-justify' : 'pt-10 text-left'}">
-					{isZh ? desc.desc : desc.descEn}
+				<div class="relative w-full">
+					<img class="aspect-5/3 h-full w-full object-cover transition-all duration-500 group-hover:scale-125" src={desc.icon} alt="" />
+					<div
+						class="text-shadow-lg bg-primary/10 dark:bg-dark/10 absolute bottom-1.5 left-0 right-0 mx-1.5 flex flex-col justify-center rounded-2xl border border-white/20 px-3 py-1.5 text-white backdrop-blur-sm"
+					>
+						<div class="mb-0.5 text-3xl font-bold transition-all duration-500 group-hover:translate-x-4">{desc.title}</div>
+						<div class="text-xs font-bold transition-all duration-500">
+							{isZh ? desc.desc : desc.descEn}
+						</div>
+					</div>
 				</div>
 			</div>
 		{/each}
@@ -491,15 +659,15 @@
 			<div class="grid grid-cols-1 gap-10 md:grid-cols-4">
 				{#each dominant.data as item}
 					<div
-						class="intersection border-px group relative overflow-hidden rounded-lg border border-black/5 p-0.5 transition-all ease-out dark:border-white/5"
+						class="intersection shadow-primary/10 dark:shadow-dark/10 border-primary/10 dark:border-dark/20 group relative overflow-hidden rounded-xl border p-0.5 shadow-lg"
 					>
 						<div
 							class="bg-primary absolute -left-1/2 top-1/3 hidden h-1/2 w-[200%] group-hover:block {$currentThemeStore === 'dark'
 								? 'animate-spin-line-dark'
 								: 'animate-spin-line'}"
 						></div>
-						<div class="bg-primaryWhite dark:bg-darkBlack relative h-full w-full rounded-lg px-8 py-10">
-							<div class="text-primary dark:text-dark h-8 w-8 flex-none transition-all ease-out group-hover:scale-90">
+						<div class="bg-primaryWhite dark:bg-darkBlack relative rounded-lg p-4">
+							<div class="text-primary dark:text-dark size-6 flex-none transition-all ease-out group-hover:scale-110">
 								<svg style="fill: currentColor;display: inline;" viewBox="0 0 24 24">
 									<use xlink:href="/assets/fonts/home.symbol.svg#{item.icon}" />
 								</svg>
@@ -517,15 +685,15 @@
 			<div class="grid grid-cols-1 gap-10 md:grid-cols-4">
 				{#each ugly.data as item}
 					<div
-						class="intersection border-px group relative overflow-hidden rounded-lg border border-black/5 p-0.5 transition-all ease-out dark:border-white/5"
+						class="intersection shadow-primary/10 dark:shadow-dark/10 border-primary/10 dark:border-dark/20 group relative overflow-hidden rounded-xl border p-0.5 shadow-lg"
 					>
 						<div
 							class="bg-primary absolute -left-1/2 top-1/3 hidden h-1/2 w-[200%] group-hover:block {$currentThemeStore === 'dark'
 								? 'animate-spin-line-dark'
 								: 'animate-spin-line'}"
 						></div>
-						<div class="bg-primaryWhite dark:bg-darkBlack relative h-full w-full rounded-lg px-8 py-10">
-							<div class="text-primary dark:text-dark h-8 w-8 flex-none transition-all ease-out group-hover:scale-90">
+						<div class="bg-primaryWhite dark:bg-darkBlack relative rounded-lg p-4">
+							<div class="text-primary dark:text-dark size-6 flex-none transition-all ease-out group-hover:scale-110">
 								<svg style="fill: currentColor;display: inline;" viewBox="0 0 24 24">
 									<use xlink:href="/assets/fonts/home.symbol.svg#{item.icon}" />
 								</svg>
@@ -586,28 +754,24 @@
 		</div>
 	</div>
 </div>
-<div class="grid grid-cols-2 gap-10 bg-white px-4 pb-16 pt-20 text-center md:grid-cols-4 md:px-10 dark:bg-black">
-	{#each bottomInfo as item}
-		<div>
-			<div class="mb-2 text-lg font-bold">{isZh ? item.title : item.title_en}</div>
-			<div class="flex flex-col gap-2">
-				{#each item.list as i}
-					<a href={i.link} target={i._blank ? '_blank' : '_self'} title={i.link} class="text-sm hover:underline"
-						>{isZh ? i.title : i.title_en}</a
-					>
-				{/each}
+<div class="bg-white dark:bg-black">
+	<div class="mx-auto grid max-w-[1536px] grid-cols-2 gap-10 pb-16 pt-20 text-left md:grid-cols-4 md:px-10">
+		{#each bottomInfo as item}
+			<div>
+				<div class="mb-2 text-lg font-bold">{isZh ? item.title : item.title_en}</div>
+				<div class="flex flex-col gap-2">
+					{#each item.list as i}
+						<a href={i.link} target={i._blank ? '_blank' : '_self'} title={i.link} class="text-sm hover:underline">
+							{isZh ? i.title : i.title_en}
+						</a>
+					{/each}
+				</div>
 			</div>
-		</div>
-	{/each}
+		{/each}
+	</div>
 </div>
 
 <div class="border-t border-black/10 bg-white py-4 text-center text-xs dark:border-white/10 dark:bg-black">
-	<div class="mb-3 text-sm" title={isZh ? '如果页面卡顿,请关闭 3D 模型。' : 'If the page is stuck, please turn off the 3D model.'}>
-		<button class="text-primary dark:text-dark cursor-pointer" onclick={change3DFunc}>
-			{show3D ? (isZh ? '隐藏' : 'Hidden') : isZh ? '显示' : 'Show'}
-			3D LOGO
-		</button>
-	</div>
 	<div class="flex justify-center gap-1">
 		<div>STDF DESIGN • MADE BY DUFU</div>
 		<div>
@@ -626,10 +790,10 @@
 	}
 	.animate-spin-line {
 		animation: spin-line 6s linear infinite;
-		background: conic-gradient(transparent 50deg, rgba(var(--theme-color-primary), 0.4) 80deg, transparent 90deg);
+		background: conic-gradient(transparent 50deg, rgba(var(--color-primary), 0.4) 80deg, transparent 90deg);
 	}
 	.animate-spin-line-dark {
 		animation: spin-line 6s linear infinite;
-		background: conic-gradient(transparent 50deg, rgba(var(--theme-color-dark), 0.6) 80deg, transparent 90deg);
+		background: conic-gradient(transparent 50deg, rgba(var(--color-dark), 0.6) 80deg, transparent 90deg);
 	}
 </style>

+ 10 - 9
docs/site/src/routes/components/+page.svelte

@@ -1,7 +1,7 @@
 <script lang="ts">
 	import { onMount } from 'svelte';
 	import { fly } from 'svelte/transition';
-	import { isShowNavStore, isCmdKStore } from '../../store';
+	import { isShowNavStore, isCmdKStore, isWideScreenStore } from '../../store';
 	import { menuList, type MenuList } from '../../data/menuList';
 	import { page } from '$app/stores';
 	import hljs from 'highlight.js';
@@ -165,10 +165,7 @@
 			params.set('nav', currentMenu.nav);
 			goto(`/components?nav=${currentMenu.nav}&tab=${params.get('tab') ? params.get('tab') : '0'}`);
 			const componentStr = await getComponentStrFunc(currentMenu.nav);
-			highlightedCode = hljs.highlight(componentStr, {
-				language: 'svelte',
-				ignoreIllegals: true
-			}).value;
+			highlightedCode = hljs.highlight(componentStr, { language: 'svelte', ignoreIllegals: true }).value;
 			menuChange = true;
 		}, 10);
 	};
@@ -193,7 +190,7 @@
 
 <div class="flex">
 	<div
-		class="fixed -left-52 top-14 z-[100] w-52 overflow-y-scroll border-r border-black/10 bg-white transition-all duration-300 md:left-0 md:bg-transparent dark:border-white/20 dark:bg-black dark:md:bg-transparent"
+		class="fixed -left-52 top-14 z-[100] w-52 overflow-y-scroll border-black/10 bg-white transition-all duration-300 md:left-0 md:bg-transparent dark:border-white/20 dark:bg-black dark:md:bg-transparent"
 		class:left-0={$isShowNavStore}
 		class:-left-52={!$isShowNavStore}
 		style="height:{navBarHeight + 'px'}"
@@ -201,7 +198,11 @@
 		<Menu {menuList} currentNav={currentNav?.nav} onclickMenu={menuClickFun} />
 	</div>
 	{#if visible}
-		<div class="flex w-full flex-col md:pl-48" in:fly={{ x: 100, duration: 500 }} out:fly={{ x: 100, duration: 100 }}>
+		<div
+			class="mx-auto flex w-full flex-col md:pl-48 {$isWideScreenStore ? 'max-w-full' : 'max-w-[1472px]'}"
+			in:fly={{ x: 100, duration: 500 }}
+			out:fly={{ x: 100, duration: 100 }}
+		>
 			<div class="relative z-20 px-4 pt-4 md:flex md:space-x-4 md:px-8" bind:this={titleDom}>
 				{#if loading}
 					{isZh ? '请等待...' : 'Please wait...'}
@@ -230,7 +231,7 @@
 				<Tab {currentTab} onclickTab={tabClickFun} />
 			</div>
 			<div class="my-4 ml-4">
-				<div class="h-px bg-black/10 dark:bg-white/20"></div>
+				<!-- <div class="h-px bg-black/10 dark:bg-white/20"></div> -->
 			</div>
 			<div>
 				<!-- 示例 -->
@@ -296,7 +297,7 @@
 						<div
 							in:fly={{ y: 100, duration: 500 }}
 							out:fly={{ y: 100, duration: 100 }}
-							class={`mt-4 flex-1 rounded-sm p-4 md:px-8 md:py-4 `}
+							class="mx-auto mt-4 flex-1 rounded-sm p-4 md:px-8 md:py-4"
 							style="width:{titleWidth}px;"
 						>
 							<Guide guide={currentNav?.nav} />

+ 2 - 38
docs/site/src/routes/components/Guide.svelte

@@ -1,7 +1,7 @@
 <script lang="ts">
 	import { onMount } from 'svelte';
 	import { mdTextToHljs } from './../../utils/index';
-	import { themeStore, sysThemeStore, isWideScreenStore } from '../../store';
+	import { themeStore, sysThemeStore } from '../../store';
 
 	interface Props {
 		guide?: string;
@@ -27,24 +27,9 @@
 	onMount(async () => {
 		guideText = await getMdStrFunc(guide);
 	});
-
-	// 全屏
-	const changeFullFunc = () => {
-		if ($isWideScreenStore) {
-			isWideScreenStore.set(false);
-			localStorage.setItem('isFull', 'notFull');
-		} else {
-			isWideScreenStore.set(true);
-			localStorage.setItem('isFull', 'full');
-		}
-	};
 </script>
 
-<article
-	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark pb-12 {$isWideScreenStore
-		? 'max-w-full'
-		: 'max-w-5xl'}"
->
+<article class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark max-w-none pb-12">
 	{#if loading}
 		{isZh ? '请等待...' : 'Please wait...'}
 	{:else}
@@ -68,24 +53,3 @@
 		{isZh ? '在 GitHub 上编辑' : 'Edit on GitHub'}
 	</a>
 </div>
-
-<button
-	class="bg-primary shadow-primary/50 dark:bg-dark dark:shadow-dark/50 fixed bottom-4 right-2 z-50 hidden h-8 w-8 rounded-full p-1.5 text-white shadow-md md:block dark:text-black"
-	onclick={changeFullFunc}
->
-	{#if $isWideScreenStore}
-		<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
-			><path
-				d="M20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20ZM11 5H5V19H11V15H13V19H19V5H13V9H11V5ZM15 9L18 12L15 15V13H9V15L6 12L9 9V11H15V9Z"
-				fill="currentColor"
-			></path></svg
-		>
-	{:else}
-		<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
-			><path
-				d="M20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20ZM11 5H5V10.999H7V9L10 12L7 15V13H5V19H11V17H13V19H19V13H17V15L14 12L17 9V10.999H19V5H13V7H11V5ZM13 13V15H11V13H13ZM13 9V11H11V9H13Z"
-				fill="currentColor"
-			></path></svg
-		>
-	{/if}
-</button>

+ 5 - 5
docs/site/src/routes/guide/+layout.svelte

@@ -124,7 +124,7 @@
 
 <div class="flex">
 	<div
-		class="fixed -left-52 top-14 z-[100] w-48 overflow-y-scroll border-r border-black/10 bg-white transition-all duration-300 md:left-0 md:bg-transparent dark:border-white/20 dark:bg-black dark:md:bg-transparent"
+		class="fixed -left-52 top-14 z-[100] w-48 overflow-y-scroll border-black/10 bg-white transition-all duration-300 md:left-0 md:bg-transparent dark:border-white/20 dark:bg-black dark:md:bg-transparent"
 		class:left-0={$isShowNavStore}
 		class:-left-52={!$isShowNavStore}
 		style="height:{menuHeight + 'px'}"
@@ -132,19 +132,19 @@
 		<Menu {menuList} currentNav={currentNav.nav} onclickMenu={menuClickFun} showNum={false} />
 	</div>
 	<div class="w-screen md:pl-48">
-		{#if !$page.url.pathname.includes('generator')}
+		<!-- {#if !$page.url.pathname.includes('generator')}
 			<div class="px-4 py-12 md:px-8 md:py-4">
 				<div class="text-4xl font-bold">
 					{isZh ? currentNav.title : currentNav.title_en}
 				</div>
 			</div>
 			<div class="h-px bg-black/10 dark:bg-white/20"></div>
-		{/if}
+		{/if} -->
 		<div class="px-4 pt-4 {$page.url.pathname.includes('generator') ? 'md:px-4 md:pt-4' : 'md:px-8 md:pt-12'}">
 			{@render children()}
 		</div>
 		{#if !$page.url.pathname.includes('generator') && currentNav.nav != 'color' && currentNav.nav != 'logo' && currentNav.nav != 'shortkey'}
-			<div class="flex gap-2 px-4 pb-8 text-xs md:px-8">
+			<div class="mx-auto flex gap-2 px-4 pb-8 text-xs {$isWideScreenStore ? 'max-w-full md:px-8' : 'max-w-7xl md:px-0'}">
 				<a href={editUrlFn(currentNav.nav)} class="text-primary dark:text-dark flex w-full" target="_blank">
 					<span class="mr-1 h-4 w-4">
 						<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="h-4 w-4" style="fill: currentColor;">
@@ -161,7 +161,7 @@
 </div>
 {#if !$page.url.pathname.includes('generator')}
 	<button
-		class="bg-primary shadow-primary/50 dark:bg-dark dark:shadow-dark/50 fixed bottom-4 right-2 z-50 hidden h-8 w-8 rounded-full p-1.5 text-white shadow-md md:block dark:text-black"
+		class="bg-primary shadow-primary/50 dark:bg-dark dark:shadow-dark/50 fixed bottom-4 right-2 z-50 hidden h-8 w-8 cursor-pointer rounded-full p-1.5 text-white shadow-md md:block dark:text-black"
 		onclick={changeFullFunc}
 	>
 		{#if $isWideScreenStore}

+ 2 - 2
docs/site/src/routes/guide/+page.svelte

@@ -12,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-12 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html text}

+ 4 - 2
docs/site/src/routes/guide/about/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/about.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/about_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -11,9 +13,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 4 - 2
docs/site/src/routes/guide/changelog/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/changelog.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/changelog_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -64,9 +66,9 @@
 </script>
 
 <article
-	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark pb-12 text-xs {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 text-xs {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<p class="mb-4 text-xs text-black/40 dark:text-white/30">
 		{isZh

+ 2 - 2
docs/site/src/routes/guide/color/Color.svelte

@@ -118,9 +118,9 @@
 </script>
 
 <article
-	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark pb-12 {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<blockquote>
 		{isZh

+ 4 - 2
docs/site/src/routes/guide/compatibility/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/compatibility.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/compatibility_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -10,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 4 - 2
docs/site/src/routes/guide/contribution/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs, groupIconMdPlugin } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/contribution.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/contribution_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -10,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 4 - 2
docs/site/src/routes/guide/create/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs, groupIconMdPlugin } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import createText from '../../../../../../packages/create-stdf/README_CN.md';
+	// @ts-ignore
 	import createText_en from '../../../../../../packages/create-stdf/README.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -12,9 +14,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html text}

+ 4 - 2
docs/site/src/routes/guide/faq/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/faq.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/faq_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -10,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 4 - 2
docs/site/src/routes/guide/future/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/future.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/future_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -10,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 4 - 4
docs/site/src/routes/guide/generator/+page.svelte

@@ -485,7 +485,7 @@ ${extendListStr2}
 			<div class="text-left">{isZh ? '主题名称' : 'Theme name'}</div>
 			<div class="flex-1">
 				<input
-					class="focus:outline-primary dark:focus:outline-dark rounded-xs focus:outline-hidden w-full bg-transparent px-1 py-1 text-sm outline outline-black/10 dark:outline-white/20"
+					class="focus:outline-primary dark:focus:outline-dark rounded-xs w-full bg-transparent px-1 py-1 text-xs outline outline-black/10 dark:outline-white/20"
 					type="text"
 					bind:value={name}
 					placeholder={isZh ? '请输入主题名称' : 'Please enter theme name'}
@@ -544,7 +544,7 @@ ${extendListStr2}
 							</div>
 							<div class="flex px-0.5">
 								<input
-									class="focus:outline-primary dark:focus:outline-dark rounded-xs focus:outline-hidden h-6 w-full bg-transparent px-1 py-1 text-xs outline outline-black/10 dark:outline-white/20"
+									class="focus:outline-primary dark:focus:outline-dark rounded-xs h-6 w-full bg-transparent px-1 py-1 text-xs outline outline-black/10 dark:outline-white/20"
 									type="text"
 									bind:value={item.alias}
 									placeholder={isZh ? `请输入 extend${i} 别名` : `Please enter extend${i} alias`}
@@ -691,13 +691,13 @@ ${extendListStr2}
 			<div class="flex w-full justify-between pb-2">
 				<div>
 					<button
-						class="bg-primary dark:bg-dark cursor-pointer rounded-sm px-4 py-2 text-xs text-white hover:opacity-90 dark:text-black"
+						class="bg-primary dark:bg-dark cursor-pointer rounded-sm px-4 py-1.5 text-xs text-white hover:opacity-90 dark:text-black"
 						onclick={randomFunc}
 					>
 						{isZh ? '随机主题' : 'Random theme'}
 					</button>
 					<button
-						class="border-primary dark:border-dark ml-2 cursor-pointer rounded-sm border px-4 py-2 text-xs text-black hover:opacity-90 dark:text-white"
+						class="border-primary dark:border-dark ml-2 cursor-pointer rounded-sm border px-4 py-1.5 text-xs text-black hover:opacity-90 dark:text-white"
 						onclick={resetFunc}
 					>
 						{isZh ? '重置' : 'Reset'}

+ 4 - 2
docs/site/src/routes/guide/icon-plugin/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs, groupIconMdPlugin } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import iconPluginText from '../../../../../../packages/rollup-plugin-stdf-icon/README_CN.md';
+	// @ts-ignore
 	import iconPluginText_en from '../../../../../../packages/rollup-plugin-stdf-icon/README.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -12,9 +14,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html text}

+ 4 - 2
docs/site/src/routes/guide/icon/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/icon.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/icon_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -10,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 4 - 2
docs/site/src/routes/guide/internation/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/internation.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/internation_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -10,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 44 - 38
docs/site/src/routes/guide/logo/+page.svelte

@@ -1,39 +1,45 @@
-<div class="mb-4 flex justify-around gap-3 text-9xl font-bold md:justify-start md:gap-10">
-	<div class="text-dark dark:text-primary">S</div>
-	<div class="text-primary dark:text-dark">T</div>
-	<div class="text-primary dark:text-dark">D</div>
-	<div class="text-primary dark:text-dark">F</div>
-</div>
-<div class="max-w-full md:max-w-md">
-	<svg class="w-full" viewBox="0 0 91 81" fill="none" xmlns="http://www.w3.org/2000/svg">
-		<path
-			fill-rule="evenodd"
-			clip-rule="evenodd"
-			d="M0 1H50C64.8057 1 77.7325 9.04398 84.6487 21H50H40V31H50C55.5229 31 60 35.4771 60 41C60 46.5229 55.5229 51 50 51H40V81H20V21H0V1ZM90 41C90 63.0914 72.0914 81 50 81V61C61.0457 61 70 52.0457 70 41C70 37.3571 69.0261 33.9417 67.3243 31H88.7398C89.5625 34.1962 90 37.547 90 41Z"
-			class="fill-primary dark:fill-dark"
-		/>
-		<path fill-rule="evenodd" clip-rule="evenodd" d="M20 1V31H40L20 81V51H0L20 1Z" class="fill-dark dark:fill-primary" />
-		<line y1="0.9" x2="90" y2="0.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="10.9" x2="90" y2="10.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="20.9" x2="90" y2="20.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="30.9" x2="90" y2="30.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="40.9" x2="90" y2="40.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="50.9" x2="90" y2="50.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="60.9" x2="90" y2="60.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="70.9" x2="90" y2="70.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line y1="80.9" x2="90" y2="80.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="0.1" y1="1" x2="0.0999965" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="10.1" y1="1" x2="10.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="20.1" y1="1" x2="20.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="30.1" y1="1" x2="30.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="40.1" y1="1" x2="40.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="50.1" y1="1" x2="50.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="60.1" y1="1" x2="60.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="70.1" y1="1" x2="70.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="80.1" y1="1" x2="80.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<line x1="90.1" y1="1" x2="90.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<circle cx="50" cy="41" r="39.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<circle cx="50" cy="41" r="19.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-		<circle cx="50" cy="41" r="9.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
-	</svg>
+<script lang="ts">
+	import { isWideScreenStore } from '../../../store';
+</script>
+
+<div class="mx-auto {$isWideScreenStore ? 'max-w-full' : 'max-w-7xl'}">
+	<div class="mb-4 flex justify-around gap-3 text-9xl font-bold md:justify-start md:gap-10">
+		<div class="text-dark dark:text-primary">S</div>
+		<div class="text-primary dark:text-dark">T</div>
+		<div class="text-primary dark:text-dark">D</div>
+		<div class="text-primary dark:text-dark">F</div>
+	</div>
+	<div class="max-w-full md:max-w-md">
+		<svg class="w-full" viewBox="0 0 91 81" fill="none" xmlns="http://www.w3.org/2000/svg">
+			<path
+				fill-rule="evenodd"
+				clip-rule="evenodd"
+				d="M0 1H50C64.8057 1 77.7325 9.04398 84.6487 21H50H40V31H50C55.5229 31 60 35.4771 60 41C60 46.5229 55.5229 51 50 51H40V81H20V21H0V1ZM90 41C90 63.0914 72.0914 81 50 81V61C61.0457 61 70 52.0457 70 41C70 37.3571 69.0261 33.9417 67.3243 31H88.7398C89.5625 34.1962 90 37.547 90 41Z"
+				class="fill-primary dark:fill-dark"
+			/>
+			<path fill-rule="evenodd" clip-rule="evenodd" d="M20 1V31H40L20 81V51H0L20 1Z" class="fill-dark dark:fill-primary" />
+			<line y1="0.9" x2="90" y2="0.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="10.9" x2="90" y2="10.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="20.9" x2="90" y2="20.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="30.9" x2="90" y2="30.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="40.9" x2="90" y2="40.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="50.9" x2="90" y2="50.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="60.9" x2="90" y2="60.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="70.9" x2="90" y2="70.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line y1="80.9" x2="90" y2="80.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="0.1" y1="1" x2="0.0999965" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="10.1" y1="1" x2="10.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="20.1" y1="1" x2="20.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="30.1" y1="1" x2="30.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="40.1" y1="1" x2="40.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="50.1" y1="1" x2="50.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="60.1" y1="1" x2="60.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="70.1" y1="1" x2="70.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="80.1" y1="1" x2="80.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<line x1="90.1" y1="1" x2="90.1" y2="81" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<circle cx="50" cy="41" r="39.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<circle cx="50" cy="41" r="19.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+			<circle cx="50" cy="41" r="9.9" class="stroke-gray-400 dark:stroke-gray-600" stroke-width="0.2" stroke-dasharray="2 2" />
+		</svg>
+	</div>
 </div>

+ 4 - 2
docs/site/src/routes/guide/md/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs, groupIconMdPlugin } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import mdPluginText from '../../../../../../packages/rollup-plugin-md-ts/README_CN.md';
+	// @ts-ignore
 	import mdPluginText_en from '../../../../../../packages/rollup-plugin-md-ts/README.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -12,9 +14,9 @@
 </script>
 
 <article
-	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark pb-12 {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html text}

+ 4 - 2
docs/site/src/routes/guide/milestone/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/milestone.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/milestone_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -11,9 +13,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

+ 3 - 3
docs/site/src/routes/guide/shortkey/+page.svelte

@@ -5,9 +5,9 @@
 </script>
 
 <article
-	class="prose hidden pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark md:block {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto hidden pb-8 md:block {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	{#if isZh}
 		<h2>全站</h2>
@@ -35,7 +35,7 @@
 	{/if}
 </article>
 
-<article class="prose block max-w-5xl pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark md:hidden">
+<article class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark block max-w-5xl pb-12 md:hidden">
 	{#if isZh}
 		<p>快捷键仅用于桌面端。</p>
 	{:else}

+ 2 - 2
docs/site/src/routes/guide/theme/+page.svelte

@@ -10,9 +10,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-12 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html text}

+ 4 - 2
docs/site/src/routes/guide/vscode/+page.svelte

@@ -2,7 +2,9 @@
 	import { mdTextToHljs } from '../../../utils/index';
 	import { isWideScreenStore } from '../../../store';
 
+	// @ts-ignore
 	import text from '../../../../../mds/guide/vscode.md';
+	// @ts-ignore
 	import text_en from '../../../../../mds/guide/vscode_en.md';
 
 	const isZh = localStorage.getItem('lang') === 'zh_CN';
@@ -10,9 +12,9 @@
 </script>
 
 <article
-	class="prose pb-12 dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark {$isWideScreenStore
+	class="prose dark:prose-invert prose-strong:text-primary dark:prose-strong:text-dark mx-auto pb-8 {$isWideScreenStore
 		? 'max-w-full'
-		: 'max-w-5xl'}"
+		: 'max-w-7xl'}"
 >
 	<!-- eslint-disable-next-line svelte/no-at-html-tags -->
 	{@html hljsText}

BIN
docs/site/static/assets/3d/dark.png


BIN
docs/site/static/assets/3d/light.png


+ 0 - 5254
docs/site/static/assets/3d/process.js

@@ -1,5254 +0,0 @@
-var Module = (function () {
-	var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
-	return function (Module) {
-		Module = Module || {};
-		var Module = typeof Module !== 'undefined' ? Module : {};
-		var readyPromiseResolve, readyPromiseReject;
-		Module['ready'] = new Promise(function (resolve, reject) {
-			readyPromiseResolve = resolve;
-			readyPromiseReject = reject;
-		});
-		var moduleOverrides = {};
-		var key;
-		for (key in Module) {
-			if (Module.hasOwnProperty(key)) {
-				moduleOverrides[key] = Module[key];
-			}
-		}
-		var arguments_ = [];
-		var thisProgram = './this.program';
-		var quit_ = function (status, toThrow) {
-			throw toThrow;
-		};
-		var ENVIRONMENT_IS_WEB = true;
-		var ENVIRONMENT_IS_WORKER = false;
-		var scriptDirectory = '';
-		function locateFile(path) {
-			if (Module['locateFile']) {
-				return Module['locateFile'](path, scriptDirectory);
-			}
-			return scriptDirectory + path;
-		}
-		var read_, readAsync, readBinary, setWindowTitle;
-		if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
-			if (ENVIRONMENT_IS_WORKER) {
-				scriptDirectory = self.location.href;
-			} else if (typeof document !== 'undefined' && document.currentScript) {
-				scriptDirectory = document.currentScript.src;
-			}
-			if (_scriptDir) {
-				scriptDirectory = _scriptDir;
-			}
-			if (scriptDirectory.indexOf('blob:') !== 0) {
-				scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/') + 1);
-			} else {
-				scriptDirectory = '';
-			}
-			{
-				read_ = function (url) {
-					var xhr = new XMLHttpRequest();
-					xhr.open('GET', url, false);
-					xhr.send(null);
-					return xhr.responseText;
-				};
-				if (ENVIRONMENT_IS_WORKER) {
-					readBinary = function (url) {
-						var xhr = new XMLHttpRequest();
-						xhr.open('GET', url, false);
-						xhr.responseType = 'arraybuffer';
-						xhr.send(null);
-						return new Uint8Array(xhr.response);
-					};
-				}
-				readAsync = function (url, onload, onerror) {
-					var xhr = new XMLHttpRequest();
-					xhr.open('GET', url, true);
-					xhr.responseType = 'arraybuffer';
-					xhr.onload = function () {
-						if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {
-							onload(xhr.response);
-							return;
-						}
-						onerror();
-					};
-					xhr.onerror = onerror;
-					xhr.send(null);
-				};
-			}
-			setWindowTitle = function (title) {
-				document.title = title;
-			};
-		} else {
-		}
-		var out = Module['print'] || console.log.bind(console);
-		var err = Module['printErr'] || console.warn.bind(console);
-		for (key in moduleOverrides) {
-			if (moduleOverrides.hasOwnProperty(key)) {
-				Module[key] = moduleOverrides[key];
-			}
-		}
-		moduleOverrides = null;
-		if (Module['arguments']) arguments_ = Module['arguments'];
-		if (Module['thisProgram']) thisProgram = Module['thisProgram'];
-		if (Module['quit']) quit_ = Module['quit'];
-		var tempRet0 = 0;
-		var setTempRet0 = function (value) {
-			tempRet0 = value;
-		};
-		var wasmBinary;
-		if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
-		var noExitRuntime = Module['noExitRuntime'] || true;
-		if (typeof WebAssembly !== 'object') {
-			abort('no native wasm support detected');
-		}
-		var wasmMemory;
-		var ABORT = false;
-		var EXITSTATUS;
-		function assert(condition, text) {
-			if (!condition) {
-				abort('Assertion failed: ' + text);
-			}
-		}
-		function getCFunc(ident) {
-			var func = Module['_' + ident];
-			assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported');
-			return func;
-		}
-		function ccall(ident, returnType, argTypes, args, opts) {
-			var toC = {
-				string: function (str) {
-					var ret = 0;
-					if (str !== null && str !== undefined && str !== 0) {
-						var len = (str.length << 2) + 1;
-						ret = stackAlloc(len);
-						stringToUTF8(str, ret, len);
-					}
-					return ret;
-				},
-				array: function (arr) {
-					var ret = stackAlloc(arr.length);
-					writeArrayToMemory(arr, ret);
-					return ret;
-				}
-			};
-			function convertReturnValue(ret) {
-				if (returnType === 'string') return UTF8ToString(ret);
-				if (returnType === 'boolean') return Boolean(ret);
-				return ret;
-			}
-			var func = getCFunc(ident);
-			var cArgs = [];
-			var stack = 0;
-			if (args) {
-				for (var i = 0; i < args.length; i++) {
-					var converter = toC[argTypes[i]];
-					if (converter) {
-						if (stack === 0) stack = stackSave();
-						cArgs[i] = converter(args[i]);
-					} else {
-						cArgs[i] = args[i];
-					}
-				}
-			}
-			var ret = func.apply(null, cArgs);
-			function onDone(ret) {
-				if (stack !== 0) stackRestore(stack);
-				return convertReturnValue(ret);
-			}
-			ret = onDone(ret);
-			return ret;
-		}
-		var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;
-		function UTF8ArrayToString(heap, idx, maxBytesToRead) {
-			var endIdx = idx + maxBytesToRead;
-			var endPtr = idx;
-			while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;
-			if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
-				return UTF8Decoder.decode(heap.subarray(idx, endPtr));
-			} else {
-				var str = '';
-				while (idx < endPtr) {
-					var u0 = heap[idx++];
-					if (!(u0 & 128)) {
-						str += String.fromCharCode(u0);
-						continue;
-					}
-					var u1 = heap[idx++] & 63;
-					if ((u0 & 224) == 192) {
-						str += String.fromCharCode(((u0 & 31) << 6) | u1);
-						continue;
-					}
-					var u2 = heap[idx++] & 63;
-					if ((u0 & 240) == 224) {
-						u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
-					} else {
-						u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63);
-					}
-					if (u0 < 65536) {
-						str += String.fromCharCode(u0);
-					} else {
-						var ch = u0 - 65536;
-						str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));
-					}
-				}
-			}
-			return str;
-		}
-		function UTF8ToString(ptr, maxBytesToRead) {
-			return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
-		}
-		function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
-			if (!(maxBytesToWrite > 0)) return 0;
-			var startIdx = outIdx;
-			var endIdx = outIdx + maxBytesToWrite - 1;
-			for (var i = 0; i < str.length; ++i) {
-				var u = str.charCodeAt(i);
-				if (u >= 55296 && u <= 57343) {
-					var u1 = str.charCodeAt(++i);
-					u = (65536 + ((u & 1023) << 10)) | (u1 & 1023);
-				}
-				if (u <= 127) {
-					if (outIdx >= endIdx) break;
-					heap[outIdx++] = u;
-				} else if (u <= 2047) {
-					if (outIdx + 1 >= endIdx) break;
-					heap[outIdx++] = 192 | (u >> 6);
-					heap[outIdx++] = 128 | (u & 63);
-				} else if (u <= 65535) {
-					if (outIdx + 2 >= endIdx) break;
-					heap[outIdx++] = 224 | (u >> 12);
-					heap[outIdx++] = 128 | ((u >> 6) & 63);
-					heap[outIdx++] = 128 | (u & 63);
-				} else {
-					if (outIdx + 3 >= endIdx) break;
-					heap[outIdx++] = 240 | (u >> 18);
-					heap[outIdx++] = 128 | ((u >> 12) & 63);
-					heap[outIdx++] = 128 | ((u >> 6) & 63);
-					heap[outIdx++] = 128 | (u & 63);
-				}
-			}
-			heap[outIdx] = 0;
-			return outIdx - startIdx;
-		}
-		function stringToUTF8(str, outPtr, maxBytesToWrite) {
-			return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
-		}
-		function lengthBytesUTF8(str) {
-			var len = 0;
-			for (var i = 0; i < str.length; ++i) {
-				var u = str.charCodeAt(i);
-				if (u >= 55296 && u <= 57343) u = (65536 + ((u & 1023) << 10)) | (str.charCodeAt(++i) & 1023);
-				if (u <= 127) ++len;
-				else if (u <= 2047) len += 2;
-				else if (u <= 65535) len += 3;
-				else len += 4;
-			}
-			return len;
-		}
-		var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined;
-		function UTF16ToString(ptr, maxBytesToRead) {
-			var endPtr = ptr;
-			var idx = endPtr >> 1;
-			var maxIdx = idx + maxBytesToRead / 2;
-			while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx;
-			endPtr = idx << 1;
-			if (endPtr - ptr > 32 && UTF16Decoder) {
-				return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
-			} else {
-				var str = '';
-				for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
-					var codeUnit = HEAP16[(ptr + i * 2) >> 1];
-					if (codeUnit == 0) break;
-					str += String.fromCharCode(codeUnit);
-				}
-				return str;
-			}
-		}
-		function stringToUTF16(str, outPtr, maxBytesToWrite) {
-			if (maxBytesToWrite === undefined) {
-				maxBytesToWrite = 2147483647;
-			}
-			if (maxBytesToWrite < 2) return 0;
-			maxBytesToWrite -= 2;
-			var startPtr = outPtr;
-			var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;
-			for (var i = 0; i < numCharsToWrite; ++i) {
-				var codeUnit = str.charCodeAt(i);
-				HEAP16[outPtr >> 1] = codeUnit;
-				outPtr += 2;
-			}
-			HEAP16[outPtr >> 1] = 0;
-			return outPtr - startPtr;
-		}
-		function lengthBytesUTF16(str) {
-			return str.length * 2;
-		}
-		function UTF32ToString(ptr, maxBytesToRead) {
-			var i = 0;
-			var str = '';
-			while (!(i >= maxBytesToRead / 4)) {
-				var utf32 = HEAP32[(ptr + i * 4) >> 2];
-				if (utf32 == 0) break;
-				++i;
-				if (utf32 >= 65536) {
-					var ch = utf32 - 65536;
-					str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));
-				} else {
-					str += String.fromCharCode(utf32);
-				}
-			}
-			return str;
-		}
-		function stringToUTF32(str, outPtr, maxBytesToWrite) {
-			if (maxBytesToWrite === undefined) {
-				maxBytesToWrite = 2147483647;
-			}
-			if (maxBytesToWrite < 4) return 0;
-			var startPtr = outPtr;
-			var endPtr = startPtr + maxBytesToWrite - 4;
-			for (var i = 0; i < str.length; ++i) {
-				var codeUnit = str.charCodeAt(i);
-				if (codeUnit >= 55296 && codeUnit <= 57343) {
-					var trailSurrogate = str.charCodeAt(++i);
-					codeUnit = (65536 + ((codeUnit & 1023) << 10)) | (trailSurrogate & 1023);
-				}
-				HEAP32[outPtr >> 2] = codeUnit;
-				outPtr += 4;
-				if (outPtr + 4 > endPtr) break;
-			}
-			HEAP32[outPtr >> 2] = 0;
-			return outPtr - startPtr;
-		}
-		function lengthBytesUTF32(str) {
-			var len = 0;
-			for (var i = 0; i < str.length; ++i) {
-				var codeUnit = str.charCodeAt(i);
-				if (codeUnit >= 55296 && codeUnit <= 57343) ++i;
-				len += 4;
-			}
-			return len;
-		}
-		function writeArrayToMemory(array, buffer) {
-			HEAP8.set(array, buffer);
-		}
-		function writeAsciiToMemory(str, buffer, dontAddNull) {
-			for (var i = 0; i < str.length; ++i) {
-				HEAP8[buffer++ >> 0] = str.charCodeAt(i);
-			}
-			if (!dontAddNull) HEAP8[buffer >> 0] = 0;
-		}
-		function alignUp(x, multiple) {
-			if (x % multiple > 0) {
-				x += multiple - (x % multiple);
-			}
-			return x;
-		}
-		var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
-		function updateGlobalBufferAndViews(buf) {
-			buffer = buf;
-			Module['HEAP8'] = HEAP8 = new Int8Array(buf);
-			Module['HEAP16'] = HEAP16 = new Int16Array(buf);
-			Module['HEAP32'] = HEAP32 = new Int32Array(buf);
-			Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
-			Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);
-			Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
-			Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);
-			Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);
-		}
-		var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;
-		var wasmTable;
-		var __ATPRERUN__ = [];
-		var __ATINIT__ = [];
-		var __ATPOSTRUN__ = [];
-		var runtimeInitialized = false;
-		function preRun() {
-			if (Module['preRun']) {
-				if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
-				while (Module['preRun'].length) {
-					addOnPreRun(Module['preRun'].shift());
-				}
-			}
-			callRuntimeCallbacks(__ATPRERUN__);
-		}
-		function initRuntime() {
-			runtimeInitialized = true;
-			if (!Module['noFSInit'] && !FS.init.initialized) FS.init();
-			FS.ignorePermissions = false;
-			TTY.init();
-			callRuntimeCallbacks(__ATINIT__);
-		}
-		function postRun() {
-			if (Module['postRun']) {
-				if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
-				while (Module['postRun'].length) {
-					addOnPostRun(Module['postRun'].shift());
-				}
-			}
-			callRuntimeCallbacks(__ATPOSTRUN__);
-		}
-		function addOnPreRun(cb) {
-			__ATPRERUN__.unshift(cb);
-		}
-		function addOnInit(cb) {
-			__ATINIT__.unshift(cb);
-		}
-		function addOnPostRun(cb) {
-			__ATPOSTRUN__.unshift(cb);
-		}
-		var runDependencies = 0;
-		var runDependencyWatcher = null;
-		var dependenciesFulfilled = null;
-		function getUniqueRunDependency(id) {
-			return id;
-		}
-		function addRunDependency(id) {
-			runDependencies++;
-			if (Module['monitorRunDependencies']) {
-				Module['monitorRunDependencies'](runDependencies);
-			}
-		}
-		function removeRunDependency(id) {
-			runDependencies--;
-			if (Module['monitorRunDependencies']) {
-				Module['monitorRunDependencies'](runDependencies);
-			}
-			if (runDependencies == 0) {
-				if (runDependencyWatcher !== null) {
-					clearInterval(runDependencyWatcher);
-					runDependencyWatcher = null;
-				}
-				if (dependenciesFulfilled) {
-					var callback = dependenciesFulfilled;
-					dependenciesFulfilled = null;
-					callback();
-				}
-			}
-		}
-		Module['preloadedImages'] = {};
-		Module['preloadedAudios'] = {};
-		function abort(what) {
-			{
-				if (Module['onAbort']) {
-					Module['onAbort'](what);
-				}
-			}
-			what = 'Aborted(' + what + ')';
-			err(what);
-			ABORT = true;
-			EXITSTATUS = 1;
-			what += '. Build with -s ASSERTIONS=1 for more info.';
-			var e = new WebAssembly.RuntimeError(what);
-			readyPromiseReject(e);
-			throw e;
-		}
-		var dataURIPrefix = 'data:application/octet-stream;base64,';
-		function isDataURI(filename) {
-			return filename.startsWith(dataURIPrefix);
-		}
-		var wasmBinaryFile;
-		wasmBinaryFile = 'process.wasm';
-		if (!isDataURI(wasmBinaryFile)) {
-			wasmBinaryFile = locateFile(wasmBinaryFile);
-		}
-		function getBinary(file) {
-			try {
-				if (file == wasmBinaryFile && wasmBinary) {
-					return new Uint8Array(wasmBinary);
-				}
-				if (readBinary) {
-					return readBinary(file);
-				} else {
-					throw 'both async and sync fetching of the wasm failed';
-				}
-			} catch (err) {
-				abort(err);
-			}
-		}
-		function getBinaryPromise() {
-			if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
-				if (typeof fetch === 'function') {
-					return fetch(wasmBinaryFile, { credentials: 'same-origin' })
-						.then(function (response) {
-							if (!response['ok']) {
-								throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
-							}
-							return response['arrayBuffer']();
-						})
-						.catch(function () {
-							return getBinary(wasmBinaryFile);
-						});
-				}
-			}
-			return Promise.resolve().then(function () {
-				return getBinary(wasmBinaryFile);
-			});
-		}
-		function createWasm() {
-			var info = { a: asmLibraryArg };
-			function receiveInstance(instance, module) {
-				var exports = instance.exports;
-				Module['asm'] = exports;
-				wasmMemory = Module['asm']['M'];
-				updateGlobalBufferAndViews(wasmMemory.buffer);
-				wasmTable = Module['asm']['O'];
-				addOnInit(Module['asm']['N']);
-				removeRunDependency('wasm-instantiate');
-			}
-			addRunDependency('wasm-instantiate');
-			function receiveInstantiationResult(result) {
-				receiveInstance(result['instance']);
-			}
-			function instantiateArrayBuffer(receiver) {
-				return getBinaryPromise()
-					.then(function (binary) {
-						return WebAssembly.instantiate(binary, info);
-					})
-					.then(function (instance) {
-						return instance;
-					})
-					.then(receiver, function (reason) {
-						err('failed to asynchronously prepare wasm: ' + reason);
-						abort(reason);
-					});
-			}
-			function instantiateAsync() {
-				if (
-					!wasmBinary &&
-					typeof WebAssembly.instantiateStreaming === 'function' &&
-					!isDataURI(wasmBinaryFile) &&
-					typeof fetch === 'function'
-				) {
-					return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) {
-						var result = WebAssembly.instantiateStreaming(response, info);
-						return result.then(receiveInstantiationResult, function (reason) {
-							err('wasm streaming compile failed: ' + reason);
-							err('falling back to ArrayBuffer instantiation');
-							return instantiateArrayBuffer(receiveInstantiationResult);
-						});
-					});
-				} else {
-					return instantiateArrayBuffer(receiveInstantiationResult);
-				}
-			}
-			if (Module['instantiateWasm']) {
-				try {
-					var exports = Module['instantiateWasm'](info, receiveInstance);
-					return exports;
-				} catch (e) {
-					err('Module.instantiateWasm callback failed with error: ' + e);
-					return false;
-				}
-			}
-			instantiateAsync().catch(readyPromiseReject);
-			return {};
-		}
-		var tempDouble;
-		var tempI64;
-		function callRuntimeCallbacks(callbacks) {
-			while (callbacks.length > 0) {
-				var callback = callbacks.shift();
-				if (typeof callback == 'function') {
-					callback(Module);
-					continue;
-				}
-				var func = callback.func;
-				if (typeof func === 'number') {
-					if (callback.arg === undefined) {
-						getWasmTableEntry(func)();
-					} else {
-						getWasmTableEntry(func)(callback.arg);
-					}
-				} else {
-					func(callback.arg === undefined ? null : callback.arg);
-				}
-			}
-		}
-		var wasmTableMirror = [];
-		function getWasmTableEntry(funcPtr) {
-			var func = wasmTableMirror[funcPtr];
-			if (!func) {
-				if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;
-				wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);
-			}
-			return func;
-		}
-		function ___cxa_allocate_exception(size) {
-			return _malloc(size + 16) + 16;
-		}
-		function ExceptionInfo(excPtr) {
-			this.excPtr = excPtr;
-			this.ptr = excPtr - 16;
-			this.set_type = function (type) {
-				HEAP32[(this.ptr + 4) >> 2] = type;
-			};
-			this.get_type = function () {
-				return HEAP32[(this.ptr + 4) >> 2];
-			};
-			this.set_destructor = function (destructor) {
-				HEAP32[(this.ptr + 8) >> 2] = destructor;
-			};
-			this.get_destructor = function () {
-				return HEAP32[(this.ptr + 8) >> 2];
-			};
-			this.set_refcount = function (refcount) {
-				HEAP32[this.ptr >> 2] = refcount;
-			};
-			this.set_caught = function (caught) {
-				caught = caught ? 1 : 0;
-				HEAP8[(this.ptr + 12) >> 0] = caught;
-			};
-			this.get_caught = function () {
-				return HEAP8[(this.ptr + 12) >> 0] != 0;
-			};
-			this.set_rethrown = function (rethrown) {
-				rethrown = rethrown ? 1 : 0;
-				HEAP8[(this.ptr + 13) >> 0] = rethrown;
-			};
-			this.get_rethrown = function () {
-				return HEAP8[(this.ptr + 13) >> 0] != 0;
-			};
-			this.init = function (type, destructor) {
-				this.set_type(type);
-				this.set_destructor(destructor);
-				this.set_refcount(0);
-				this.set_caught(false);
-				this.set_rethrown(false);
-			};
-			this.add_ref = function () {
-				var value = HEAP32[this.ptr >> 2];
-				HEAP32[this.ptr >> 2] = value + 1;
-			};
-			this.release_ref = function () {
-				var prev = HEAP32[this.ptr >> 2];
-				HEAP32[this.ptr >> 2] = prev - 1;
-				return prev === 1;
-			};
-		}
-		var exceptionLast = 0;
-		var uncaughtExceptionCount = 0;
-		function ___cxa_throw(ptr, type, destructor) {
-			var info = new ExceptionInfo(ptr);
-			info.init(type, destructor);
-			exceptionLast = ptr;
-			uncaughtExceptionCount++;
-			throw ptr;
-		}
-		var tupleRegistrations = {};
-		function runDestructors(destructors) {
-			while (destructors.length) {
-				var ptr = destructors.pop();
-				var del = destructors.pop();
-				del(ptr);
-			}
-		}
-		function simpleReadValueFromPointer(pointer) {
-			return this['fromWireType'](HEAPU32[pointer >> 2]);
-		}
-		var awaitingDependencies = {};
-		var registeredTypes = {};
-		var typeDependencies = {};
-		var char_0 = 48;
-		var char_9 = 57;
-		function makeLegalFunctionName(name) {
-			if (undefined === name) {
-				return '_unknown';
-			}
-			name = name.replace(/[^a-zA-Z0-9_]/g, '$');
-			var f = name.charCodeAt(0);
-			if (f >= char_0 && f <= char_9) {
-				return '_' + name;
-			} else {
-				return name;
-			}
-		}
-		function createNamedFunction(name, body) {
-			name = makeLegalFunctionName(name);
-			return new Function('body', 'return function ' + name + '() {\n    "use strict";    return body.apply(this, arguments);\n};\n')(body);
-		}
-		function extendError(baseErrorType, errorName) {
-			var errorClass = createNamedFunction(errorName, function (message) {
-				this.name = errorName;
-				this.message = message;
-				var stack = new Error(message).stack;
-				if (stack !== undefined) {
-					this.stack = this.toString() + '\n' + stack.replace(/^Error(:[^\n]*)?\n/, '');
-				}
-			});
-			errorClass.prototype = Object.create(baseErrorType.prototype);
-			errorClass.prototype.constructor = errorClass;
-			errorClass.prototype.toString = function () {
-				if (this.message === undefined) {
-					return this.name;
-				} else {
-					return this.name + ': ' + this.message;
-				}
-			};
-			return errorClass;
-		}
-		var InternalError = undefined;
-		function throwInternalError(message) {
-			throw new InternalError(message);
-		}
-		function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) {
-			myTypes.forEach(function (type) {
-				typeDependencies[type] = dependentTypes;
-			});
-			function onComplete(typeConverters) {
-				var myTypeConverters = getTypeConverters(typeConverters);
-				if (myTypeConverters.length !== myTypes.length) {
-					throwInternalError('Mismatched type converter count');
-				}
-				for (var i = 0; i < myTypes.length; ++i) {
-					registerType(myTypes[i], myTypeConverters[i]);
-				}
-			}
-			var typeConverters = new Array(dependentTypes.length);
-			var unregisteredTypes = [];
-			var registered = 0;
-			dependentTypes.forEach(function (dt, i) {
-				if (registeredTypes.hasOwnProperty(dt)) {
-					typeConverters[i] = registeredTypes[dt];
-				} else {
-					unregisteredTypes.push(dt);
-					if (!awaitingDependencies.hasOwnProperty(dt)) {
-						awaitingDependencies[dt] = [];
-					}
-					awaitingDependencies[dt].push(function () {
-						typeConverters[i] = registeredTypes[dt];
-						++registered;
-						if (registered === unregisteredTypes.length) {
-							onComplete(typeConverters);
-						}
-					});
-				}
-			});
-			if (0 === unregisteredTypes.length) {
-				onComplete(typeConverters);
-			}
-		}
-		function __embind_finalize_value_array(rawTupleType) {
-			var reg = tupleRegistrations[rawTupleType];
-			delete tupleRegistrations[rawTupleType];
-			var elements = reg.elements;
-			var elementsLength = elements.length;
-			var elementTypes = elements
-				.map(function (elt) {
-					return elt.getterReturnType;
-				})
-				.concat(
-					elements.map(function (elt) {
-						return elt.setterArgumentType;
-					})
-				);
-			var rawConstructor = reg.rawConstructor;
-			var rawDestructor = reg.rawDestructor;
-			whenDependentTypesAreResolved([rawTupleType], elementTypes, function (elementTypes) {
-				elements.forEach(function (elt, i) {
-					var getterReturnType = elementTypes[i];
-					var getter = elt.getter;
-					var getterContext = elt.getterContext;
-					var setterArgumentType = elementTypes[i + elementsLength];
-					var setter = elt.setter;
-					var setterContext = elt.setterContext;
-					elt.read = function (ptr) {
-						return getterReturnType['fromWireType'](getter(getterContext, ptr));
-					};
-					elt.write = function (ptr, o) {
-						var destructors = [];
-						setter(setterContext, ptr, setterArgumentType['toWireType'](destructors, o));
-						runDestructors(destructors);
-					};
-				});
-				return [
-					{
-						name: reg.name,
-						fromWireType: function (ptr) {
-							var rv = new Array(elementsLength);
-							for (var i = 0; i < elementsLength; ++i) {
-								rv[i] = elements[i].read(ptr);
-							}
-							rawDestructor(ptr);
-							return rv;
-						},
-						toWireType: function (destructors, o) {
-							if (elementsLength !== o.length) {
-								throw new TypeError(
-									'Incorrect number of tuple elements for ' + reg.name + ': expected=' + elementsLength + ', actual=' + o.length
-								);
-							}
-							var ptr = rawConstructor();
-							for (var i = 0; i < elementsLength; ++i) {
-								elements[i].write(ptr, o[i]);
-							}
-							if (destructors !== null) {
-								destructors.push(rawDestructor, ptr);
-							}
-							return ptr;
-						},
-						argPackAdvance: 8,
-						readValueFromPointer: simpleReadValueFromPointer,
-						destructorFunction: rawDestructor
-					}
-				];
-			});
-		}
-		var structRegistrations = {};
-		function __embind_finalize_value_object(structType) {
-			var reg = structRegistrations[structType];
-			delete structRegistrations[structType];
-			var rawConstructor = reg.rawConstructor;
-			var rawDestructor = reg.rawDestructor;
-			var fieldRecords = reg.fields;
-			var fieldTypes = fieldRecords
-				.map(function (field) {
-					return field.getterReturnType;
-				})
-				.concat(
-					fieldRecords.map(function (field) {
-						return field.setterArgumentType;
-					})
-				);
-			whenDependentTypesAreResolved([structType], fieldTypes, function (fieldTypes) {
-				var fields = {};
-				fieldRecords.forEach(function (field, i) {
-					var fieldName = field.fieldName;
-					var getterReturnType = fieldTypes[i];
-					var getter = field.getter;
-					var getterContext = field.getterContext;
-					var setterArgumentType = fieldTypes[i + fieldRecords.length];
-					var setter = field.setter;
-					var setterContext = field.setterContext;
-					fields[fieldName] = {
-						read: function (ptr) {
-							return getterReturnType['fromWireType'](getter(getterContext, ptr));
-						},
-						write: function (ptr, o) {
-							var destructors = [];
-							setter(setterContext, ptr, setterArgumentType['toWireType'](destructors, o));
-							runDestructors(destructors);
-						}
-					};
-				});
-				return [
-					{
-						name: reg.name,
-						fromWireType: function (ptr) {
-							var rv = {};
-							for (var i in fields) {
-								rv[i] = fields[i].read(ptr);
-							}
-							rawDestructor(ptr);
-							return rv;
-						},
-						toWireType: function (destructors, o) {
-							for (var fieldName in fields) {
-								if (!(fieldName in o)) {
-									throw new TypeError('Missing field:  "' + fieldName + '"');
-								}
-							}
-							var ptr = rawConstructor();
-							for (fieldName in fields) {
-								fields[fieldName].write(ptr, o[fieldName]);
-							}
-							if (destructors !== null) {
-								destructors.push(rawDestructor, ptr);
-							}
-							return ptr;
-						},
-						argPackAdvance: 8,
-						readValueFromPointer: simpleReadValueFromPointer,
-						destructorFunction: rawDestructor
-					}
-				];
-			});
-		}
-		function __embind_register_bigint(primitiveType, name, size, minRange, maxRange) {}
-		function getShiftFromSize(size) {
-			switch (size) {
-				case 1:
-					return 0;
-				case 2:
-					return 1;
-				case 4:
-					return 2;
-				case 8:
-					return 3;
-				default:
-					throw new TypeError('Unknown type size: ' + size);
-			}
-		}
-		function embind_init_charCodes() {
-			var codes = new Array(256);
-			for (var i = 0; i < 256; ++i) {
-				codes[i] = String.fromCharCode(i);
-			}
-			embind_charCodes = codes;
-		}
-		var embind_charCodes = undefined;
-		function readLatin1String(ptr) {
-			var ret = '';
-			var c = ptr;
-			while (HEAPU8[c]) {
-				ret += embind_charCodes[HEAPU8[c++]];
-			}
-			return ret;
-		}
-		var BindingError = undefined;
-		function throwBindingError(message) {
-			throw new BindingError(message);
-		}
-		function registerType(rawType, registeredInstance, options) {
-			options = options || {};
-			if (!('argPackAdvance' in registeredInstance)) {
-				throw new TypeError('registerType registeredInstance requires argPackAdvance');
-			}
-			var name = registeredInstance.name;
-			if (!rawType) {
-				throwBindingError('type "' + name + '" must have a positive integer typeid pointer');
-			}
-			if (registeredTypes.hasOwnProperty(rawType)) {
-				if (options.ignoreDuplicateRegistrations) {
-					return;
-				} else {
-					throwBindingError("Cannot register type '" + name + "' twice");
-				}
-			}
-			registeredTypes[rawType] = registeredInstance;
-			delete typeDependencies[rawType];
-			if (awaitingDependencies.hasOwnProperty(rawType)) {
-				var callbacks = awaitingDependencies[rawType];
-				delete awaitingDependencies[rawType];
-				callbacks.forEach(function (cb) {
-					cb();
-				});
-			}
-		}
-		function __embind_register_bool(rawType, name, size, trueValue, falseValue) {
-			var shift = getShiftFromSize(size);
-			name = readLatin1String(name);
-			registerType(rawType, {
-				name: name,
-				fromWireType: function (wt) {
-					return !!wt;
-				},
-				toWireType: function (destructors, o) {
-					return o ? trueValue : falseValue;
-				},
-				argPackAdvance: 8,
-				readValueFromPointer: function (pointer) {
-					var heap;
-					if (size === 1) {
-						heap = HEAP8;
-					} else if (size === 2) {
-						heap = HEAP16;
-					} else if (size === 4) {
-						heap = HEAP32;
-					} else {
-						throw new TypeError('Unknown boolean type size: ' + name);
-					}
-					return this['fromWireType'](heap[pointer >> shift]);
-				},
-				destructorFunction: null
-			});
-		}
-		function ClassHandle_isAliasOf(other) {
-			if (!(this instanceof ClassHandle)) {
-				return false;
-			}
-			if (!(other instanceof ClassHandle)) {
-				return false;
-			}
-			var leftClass = this.$$.ptrType.registeredClass;
-			var left = this.$$.ptr;
-			var rightClass = other.$$.ptrType.registeredClass;
-			var right = other.$$.ptr;
-			while (leftClass.baseClass) {
-				left = leftClass.upcast(left);
-				leftClass = leftClass.baseClass;
-			}
-			while (rightClass.baseClass) {
-				right = rightClass.upcast(right);
-				rightClass = rightClass.baseClass;
-			}
-			return leftClass === rightClass && left === right;
-		}
-		function shallowCopyInternalPointer(o) {
-			return {
-				count: o.count,
-				deleteScheduled: o.deleteScheduled,
-				preservePointerOnDelete: o.preservePointerOnDelete,
-				ptr: o.ptr,
-				ptrType: o.ptrType,
-				smartPtr: o.smartPtr,
-				smartPtrType: o.smartPtrType
-			};
-		}
-		function throwInstanceAlreadyDeleted(obj) {
-			function getInstanceTypeName(handle) {
-				return handle.$$.ptrType.registeredClass.name;
-			}
-			throwBindingError(getInstanceTypeName(obj) + ' instance already deleted');
-		}
-		var finalizationRegistry = false;
-		function detachFinalizer(handle) {}
-		function runDestructor($$) {
-			if ($$.smartPtr) {
-				$$.smartPtrType.rawDestructor($$.smartPtr);
-			} else {
-				$$.ptrType.registeredClass.rawDestructor($$.ptr);
-			}
-		}
-		function releaseClassHandle($$) {
-			$$.count.value -= 1;
-			var toDelete = 0 === $$.count.value;
-			if (toDelete) {
-				runDestructor($$);
-			}
-		}
-		function attachFinalizer(handle) {
-			if ('undefined' === typeof FinalizationRegistry) {
-				attachFinalizer = function (handle) {
-					return handle;
-				};
-				return handle;
-			}
-			finalizationRegistry = new FinalizationRegistry(function (info) {
-				releaseClassHandle(info.$$);
-			});
-			attachFinalizer = function (handle) {
-				var $$ = handle.$$;
-				var info = { $$: $$ };
-				finalizationRegistry.register(handle, info, handle);
-				return handle;
-			};
-			detachFinalizer = function (handle) {
-				finalizationRegistry.unregister(handle);
-			};
-			return attachFinalizer(handle);
-		}
-		function ClassHandle_clone() {
-			if (!this.$$.ptr) {
-				throwInstanceAlreadyDeleted(this);
-			}
-			if (this.$$.preservePointerOnDelete) {
-				this.$$.count.value += 1;
-				return this;
-			} else {
-				var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { $$: { value: shallowCopyInternalPointer(this.$$) } }));
-				clone.$$.count.value += 1;
-				clone.$$.deleteScheduled = false;
-				return clone;
-			}
-		}
-		function ClassHandle_delete() {
-			if (!this.$$.ptr) {
-				throwInstanceAlreadyDeleted(this);
-			}
-			if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
-				throwBindingError('Object already scheduled for deletion');
-			}
-			detachFinalizer(this);
-			releaseClassHandle(this.$$);
-			if (!this.$$.preservePointerOnDelete) {
-				this.$$.smartPtr = undefined;
-				this.$$.ptr = undefined;
-			}
-		}
-		function ClassHandle_isDeleted() {
-			return !this.$$.ptr;
-		}
-		var delayFunction = undefined;
-		var deletionQueue = [];
-		function flushPendingDeletes() {
-			while (deletionQueue.length) {
-				var obj = deletionQueue.pop();
-				obj.$$.deleteScheduled = false;
-				obj['delete']();
-			}
-		}
-		function ClassHandle_deleteLater() {
-			if (!this.$$.ptr) {
-				throwInstanceAlreadyDeleted(this);
-			}
-			if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
-				throwBindingError('Object already scheduled for deletion');
-			}
-			deletionQueue.push(this);
-			if (deletionQueue.length === 1 && delayFunction) {
-				delayFunction(flushPendingDeletes);
-			}
-			this.$$.deleteScheduled = true;
-			return this;
-		}
-		function init_ClassHandle() {
-			ClassHandle.prototype['isAliasOf'] = ClassHandle_isAliasOf;
-			ClassHandle.prototype['clone'] = ClassHandle_clone;
-			ClassHandle.prototype['delete'] = ClassHandle_delete;
-			ClassHandle.prototype['isDeleted'] = ClassHandle_isDeleted;
-			ClassHandle.prototype['deleteLater'] = ClassHandle_deleteLater;
-		}
-		function ClassHandle() {}
-		var registeredPointers = {};
-		function ensureOverloadTable(proto, methodName, humanName) {
-			if (undefined === proto[methodName].overloadTable) {
-				var prevFunc = proto[methodName];
-				proto[methodName] = function () {
-					if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) {
-						throwBindingError(
-							"Function '" +
-								humanName +
-								"' called with an invalid number of arguments (" +
-								arguments.length +
-								') - expects one of (' +
-								proto[methodName].overloadTable +
-								')!'
-						);
-					}
-					return proto[methodName].overloadTable[arguments.length].apply(this, arguments);
-				};
-				proto[methodName].overloadTable = [];
-				proto[methodName].overloadTable[prevFunc.argCount] = prevFunc;
-			}
-		}
-		function exposePublicSymbol(name, value, numArguments) {
-			if (Module.hasOwnProperty(name)) {
-				if (
-					undefined === numArguments ||
-					(undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])
-				) {
-					throwBindingError("Cannot register public name '" + name + "' twice");
-				}
-				ensureOverloadTable(Module, name, name);
-				if (Module.hasOwnProperty(numArguments)) {
-					throwBindingError('Cannot register multiple overloads of a function with the same number of arguments (' + numArguments + ')!');
-				}
-				Module[name].overloadTable[numArguments] = value;
-			} else {
-				Module[name] = value;
-				if (undefined !== numArguments) {
-					Module[name].numArguments = numArguments;
-				}
-			}
-		}
-		function RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) {
-			this.name = name;
-			this.constructor = constructor;
-			this.instancePrototype = instancePrototype;
-			this.rawDestructor = rawDestructor;
-			this.baseClass = baseClass;
-			this.getActualType = getActualType;
-			this.upcast = upcast;
-			this.downcast = downcast;
-			this.pureVirtualFunctions = [];
-		}
-		function upcastPointer(ptr, ptrClass, desiredClass) {
-			while (ptrClass !== desiredClass) {
-				if (!ptrClass.upcast) {
-					throwBindingError('Expected null or instance of ' + desiredClass.name + ', got an instance of ' + ptrClass.name);
-				}
-				ptr = ptrClass.upcast(ptr);
-				ptrClass = ptrClass.baseClass;
-			}
-			return ptr;
-		}
-		function constNoSmartPtrRawPointerToWireType(destructors, handle) {
-			if (handle === null) {
-				if (this.isReference) {
-					throwBindingError('null is not a valid ' + this.name);
-				}
-				return 0;
-			}
-			if (!handle.$$) {
-				throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
-			}
-			if (!handle.$$.ptr) {
-				throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name);
-			}
-			var handleClass = handle.$$.ptrType.registeredClass;
-			var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
-			return ptr;
-		}
-		function genericPointerToWireType(destructors, handle) {
-			var ptr;
-			if (handle === null) {
-				if (this.isReference) {
-					throwBindingError('null is not a valid ' + this.name);
-				}
-				if (this.isSmartPointer) {
-					ptr = this.rawConstructor();
-					if (destructors !== null) {
-						destructors.push(this.rawDestructor, ptr);
-					}
-					return ptr;
-				} else {
-					return 0;
-				}
-			}
-			if (!handle.$$) {
-				throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
-			}
-			if (!handle.$$.ptr) {
-				throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name);
-			}
-			if (!this.isConst && handle.$$.ptrType.isConst) {
-				throwBindingError(
-					'Cannot convert argument of type ' +
-						(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) +
-						' to parameter type ' +
-						this.name
-				);
-			}
-			var handleClass = handle.$$.ptrType.registeredClass;
-			ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
-			if (this.isSmartPointer) {
-				if (undefined === handle.$$.smartPtr) {
-					throwBindingError('Passing raw pointer to smart pointer is illegal');
-				}
-				switch (this.sharingPolicy) {
-					case 0:
-						if (handle.$$.smartPtrType === this) {
-							ptr = handle.$$.smartPtr;
-						} else {
-							throwBindingError(
-								'Cannot convert argument of type ' +
-									(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) +
-									' to parameter type ' +
-									this.name
-							);
-						}
-						break;
-					case 1:
-						ptr = handle.$$.smartPtr;
-						break;
-					case 2:
-						if (handle.$$.smartPtrType === this) {
-							ptr = handle.$$.smartPtr;
-						} else {
-							var clonedHandle = handle['clone']();
-							ptr = this.rawShare(
-								ptr,
-								Emval.toHandle(function () {
-									clonedHandle['delete']();
-								})
-							);
-							if (destructors !== null) {
-								destructors.push(this.rawDestructor, ptr);
-							}
-						}
-						break;
-					default:
-						throwBindingError('Unsupporting sharing policy');
-				}
-			}
-			return ptr;
-		}
-		function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {
-			if (handle === null) {
-				if (this.isReference) {
-					throwBindingError('null is not a valid ' + this.name);
-				}
-				return 0;
-			}
-			if (!handle.$$) {
-				throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
-			}
-			if (!handle.$$.ptr) {
-				throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name);
-			}
-			if (handle.$$.ptrType.isConst) {
-				throwBindingError('Cannot convert argument of type ' + handle.$$.ptrType.name + ' to parameter type ' + this.name);
-			}
-			var handleClass = handle.$$.ptrType.registeredClass;
-			var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
-			return ptr;
-		}
-		function RegisteredPointer_getPointee(ptr) {
-			if (this.rawGetPointee) {
-				ptr = this.rawGetPointee(ptr);
-			}
-			return ptr;
-		}
-		function RegisteredPointer_destructor(ptr) {
-			if (this.rawDestructor) {
-				this.rawDestructor(ptr);
-			}
-		}
-		function RegisteredPointer_deleteObject(handle) {
-			if (handle !== null) {
-				handle['delete']();
-			}
-		}
-		function downcastPointer(ptr, ptrClass, desiredClass) {
-			if (ptrClass === desiredClass) {
-				return ptr;
-			}
-			if (undefined === desiredClass.baseClass) {
-				return null;
-			}
-			var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass);
-			if (rv === null) {
-				return null;
-			}
-			return desiredClass.downcast(rv);
-		}
-		function getInheritedInstanceCount() {
-			return Object.keys(registeredInstances).length;
-		}
-		function getLiveInheritedInstances() {
-			var rv = [];
-			for (var k in registeredInstances) {
-				if (registeredInstances.hasOwnProperty(k)) {
-					rv.push(registeredInstances[k]);
-				}
-			}
-			return rv;
-		}
-		function setDelayFunction(fn) {
-			delayFunction = fn;
-			if (deletionQueue.length && delayFunction) {
-				delayFunction(flushPendingDeletes);
-			}
-		}
-		function init_embind() {
-			Module['getInheritedInstanceCount'] = getInheritedInstanceCount;
-			Module['getLiveInheritedInstances'] = getLiveInheritedInstances;
-			Module['flushPendingDeletes'] = flushPendingDeletes;
-			Module['setDelayFunction'] = setDelayFunction;
-		}
-		var registeredInstances = {};
-		function getBasestPointer(class_, ptr) {
-			if (ptr === undefined) {
-				throwBindingError('ptr should not be undefined');
-			}
-			while (class_.baseClass) {
-				ptr = class_.upcast(ptr);
-				class_ = class_.baseClass;
-			}
-			return ptr;
-		}
-		function getInheritedInstance(class_, ptr) {
-			ptr = getBasestPointer(class_, ptr);
-			return registeredInstances[ptr];
-		}
-		function makeClassHandle(prototype, record) {
-			if (!record.ptrType || !record.ptr) {
-				throwInternalError('makeClassHandle requires ptr and ptrType');
-			}
-			var hasSmartPtrType = !!record.smartPtrType;
-			var hasSmartPtr = !!record.smartPtr;
-			if (hasSmartPtrType !== hasSmartPtr) {
-				throwInternalError('Both smartPtrType and smartPtr must be specified');
-			}
-			record.count = { value: 1 };
-			return attachFinalizer(Object.create(prototype, { $$: { value: record } }));
-		}
-		function RegisteredPointer_fromWireType(ptr) {
-			var rawPointer = this.getPointee(ptr);
-			if (!rawPointer) {
-				this.destructor(ptr);
-				return null;
-			}
-			var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer);
-			if (undefined !== registeredInstance) {
-				if (0 === registeredInstance.$$.count.value) {
-					registeredInstance.$$.ptr = rawPointer;
-					registeredInstance.$$.smartPtr = ptr;
-					return registeredInstance['clone']();
-				} else {
-					var rv = registeredInstance['clone']();
-					this.destructor(ptr);
-					return rv;
-				}
-			}
-			function makeDefaultHandle() {
-				if (this.isSmartPointer) {
-					return makeClassHandle(this.registeredClass.instancePrototype, {
-						ptrType: this.pointeeType,
-						ptr: rawPointer,
-						smartPtrType: this,
-						smartPtr: ptr
-					});
-				} else {
-					return makeClassHandle(this.registeredClass.instancePrototype, { ptrType: this, ptr: ptr });
-				}
-			}
-			var actualType = this.registeredClass.getActualType(rawPointer);
-			var registeredPointerRecord = registeredPointers[actualType];
-			if (!registeredPointerRecord) {
-				return makeDefaultHandle.call(this);
-			}
-			var toType;
-			if (this.isConst) {
-				toType = registeredPointerRecord.constPointerType;
-			} else {
-				toType = registeredPointerRecord.pointerType;
-			}
-			var dp = downcastPointer(rawPointer, this.registeredClass, toType.registeredClass);
-			if (dp === null) {
-				return makeDefaultHandle.call(this);
-			}
-			if (this.isSmartPointer) {
-				return makeClassHandle(toType.registeredClass.instancePrototype, { ptrType: toType, ptr: dp, smartPtrType: this, smartPtr: ptr });
-			} else {
-				return makeClassHandle(toType.registeredClass.instancePrototype, { ptrType: toType, ptr: dp });
-			}
-		}
-		function init_RegisteredPointer() {
-			RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;
-			RegisteredPointer.prototype.destructor = RegisteredPointer_destructor;
-			RegisteredPointer.prototype['argPackAdvance'] = 8;
-			RegisteredPointer.prototype['readValueFromPointer'] = simpleReadValueFromPointer;
-			RegisteredPointer.prototype['deleteObject'] = RegisteredPointer_deleteObject;
-			RegisteredPointer.prototype['fromWireType'] = RegisteredPointer_fromWireType;
-		}
-		function RegisteredPointer(
-			name,
-			registeredClass,
-			isReference,
-			isConst,
-			isSmartPointer,
-			pointeeType,
-			sharingPolicy,
-			rawGetPointee,
-			rawConstructor,
-			rawShare,
-			rawDestructor
-		) {
-			this.name = name;
-			this.registeredClass = registeredClass;
-			this.isReference = isReference;
-			this.isConst = isConst;
-			this.isSmartPointer = isSmartPointer;
-			this.pointeeType = pointeeType;
-			this.sharingPolicy = sharingPolicy;
-			this.rawGetPointee = rawGetPointee;
-			this.rawConstructor = rawConstructor;
-			this.rawShare = rawShare;
-			this.rawDestructor = rawDestructor;
-			if (!isSmartPointer && registeredClass.baseClass === undefined) {
-				if (isConst) {
-					this['toWireType'] = constNoSmartPtrRawPointerToWireType;
-					this.destructorFunction = null;
-				} else {
-					this['toWireType'] = nonConstNoSmartPtrRawPointerToWireType;
-					this.destructorFunction = null;
-				}
-			} else {
-				this['toWireType'] = genericPointerToWireType;
-			}
-		}
-		function replacePublicSymbol(name, value, numArguments) {
-			if (!Module.hasOwnProperty(name)) {
-				throwInternalError('Replacing nonexistant public symbol');
-			}
-			if (undefined !== Module[name].overloadTable && undefined !== numArguments) {
-				Module[name].overloadTable[numArguments] = value;
-			} else {
-				Module[name] = value;
-				Module[name].argCount = numArguments;
-			}
-		}
-		function dynCallLegacy(sig, ptr, args) {
-			var f = Module['dynCall_' + sig];
-			return args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr);
-		}
-		function dynCall(sig, ptr, args) {
-			if (sig.includes('j')) {
-				return dynCallLegacy(sig, ptr, args);
-			}
-			return getWasmTableEntry(ptr).apply(null, args);
-		}
-		function getDynCaller(sig, ptr) {
-			var argCache = [];
-			return function () {
-				argCache.length = arguments.length;
-				for (var i = 0; i < arguments.length; i++) {
-					argCache[i] = arguments[i];
-				}
-				return dynCall(sig, ptr, argCache);
-			};
-		}
-		function embind__requireFunction(signature, rawFunction) {
-			signature = readLatin1String(signature);
-			function makeDynCaller() {
-				if (signature.includes('j')) {
-					return getDynCaller(signature, rawFunction);
-				}
-				return getWasmTableEntry(rawFunction);
-			}
-			var fp = makeDynCaller();
-			if (typeof fp !== 'function') {
-				throwBindingError('unknown function pointer with signature ' + signature + ': ' + rawFunction);
-			}
-			return fp;
-		}
-		var UnboundTypeError = undefined;
-		function getTypeName(type) {
-			var ptr = ___getTypeName(type);
-			var rv = readLatin1String(ptr);
-			_free(ptr);
-			return rv;
-		}
-		function throwUnboundTypeError(message, types) {
-			var unboundTypes = [];
-			var seen = {};
-			function visit(type) {
-				if (seen[type]) {
-					return;
-				}
-				if (registeredTypes[type]) {
-					return;
-				}
-				if (typeDependencies[type]) {
-					typeDependencies[type].forEach(visit);
-					return;
-				}
-				unboundTypes.push(type);
-				seen[type] = true;
-			}
-			types.forEach(visit);
-			throw new UnboundTypeError(message + ': ' + unboundTypes.map(getTypeName).join([', ']));
-		}
-		function __embind_register_class(
-			rawType,
-			rawPointerType,
-			rawConstPointerType,
-			baseClassRawType,
-			getActualTypeSignature,
-			getActualType,
-			upcastSignature,
-			upcast,
-			downcastSignature,
-			downcast,
-			name,
-			destructorSignature,
-			rawDestructor
-		) {
-			name = readLatin1String(name);
-			getActualType = embind__requireFunction(getActualTypeSignature, getActualType);
-			if (upcast) {
-				upcast = embind__requireFunction(upcastSignature, upcast);
-			}
-			if (downcast) {
-				downcast = embind__requireFunction(downcastSignature, downcast);
-			}
-			rawDestructor = embind__requireFunction(destructorSignature, rawDestructor);
-			var legalFunctionName = makeLegalFunctionName(name);
-			exposePublicSymbol(legalFunctionName, function () {
-				throwUnboundTypeError('Cannot construct ' + name + ' due to unbound types', [baseClassRawType]);
-			});
-			whenDependentTypesAreResolved(
-				[rawType, rawPointerType, rawConstPointerType],
-				baseClassRawType ? [baseClassRawType] : [],
-				function (base) {
-					base = base[0];
-					var baseClass;
-					var basePrototype;
-					if (baseClassRawType) {
-						baseClass = base.registeredClass;
-						basePrototype = baseClass.instancePrototype;
-					} else {
-						basePrototype = ClassHandle.prototype;
-					}
-					var constructor = createNamedFunction(legalFunctionName, function () {
-						if (Object.getPrototypeOf(this) !== instancePrototype) {
-							throw new BindingError("Use 'new' to construct " + name);
-						}
-						if (undefined === registeredClass.constructor_body) {
-							throw new BindingError(name + ' has no accessible constructor');
-						}
-						var body = registeredClass.constructor_body[arguments.length];
-						if (undefined === body) {
-							throw new BindingError(
-								'Tried to invoke ctor of ' +
-									name +
-									' with invalid number of parameters (' +
-									arguments.length +
-									') - expected (' +
-									Object.keys(registeredClass.constructor_body).toString() +
-									') parameters instead!'
-							);
-						}
-						return body.apply(this, arguments);
-					});
-					var instancePrototype = Object.create(basePrototype, { constructor: { value: constructor } });
-					constructor.prototype = instancePrototype;
-					var registeredClass = new RegisteredClass(
-						name,
-						constructor,
-						instancePrototype,
-						rawDestructor,
-						baseClass,
-						getActualType,
-						upcast,
-						downcast
-					);
-					var referenceConverter = new RegisteredPointer(name, registeredClass, true, false, false);
-					var pointerConverter = new RegisteredPointer(name + '*', registeredClass, false, false, false);
-					var constPointerConverter = new RegisteredPointer(name + ' const*', registeredClass, false, true, false);
-					registeredPointers[rawType] = { pointerType: pointerConverter, constPointerType: constPointerConverter };
-					replacePublicSymbol(legalFunctionName, constructor);
-					return [referenceConverter, pointerConverter, constPointerConverter];
-				}
-			);
-		}
-		function heap32VectorToArray(count, firstElement) {
-			var array = [];
-			for (var i = 0; i < count; i++) {
-				array.push(HEAP32[(firstElement >> 2) + i]);
-			}
-			return array;
-		}
-		function __embind_register_class_constructor(rawClassType, argCount, rawArgTypesAddr, invokerSignature, invoker, rawConstructor) {
-			assert(argCount > 0);
-			var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
-			invoker = embind__requireFunction(invokerSignature, invoker);
-			whenDependentTypesAreResolved([], [rawClassType], function (classType) {
-				classType = classType[0];
-				var humanName = 'constructor ' + classType.name;
-				if (undefined === classType.registeredClass.constructor_body) {
-					classType.registeredClass.constructor_body = [];
-				}
-				if (undefined !== classType.registeredClass.constructor_body[argCount - 1]) {
-					throw new BindingError(
-						'Cannot register multiple constructors with identical number of parameters (' +
-							(argCount - 1) +
-							") for class '" +
-							classType.name +
-							"'! Overload resolution is currently only performed using the parameter count, not actual type info!"
-					);
-				}
-				classType.registeredClass.constructor_body[argCount - 1] = function unboundTypeHandler() {
-					throwUnboundTypeError('Cannot construct ' + classType.name + ' due to unbound types', rawArgTypes);
-				};
-				whenDependentTypesAreResolved([], rawArgTypes, function (argTypes) {
-					argTypes.splice(1, 0, null);
-					classType.registeredClass.constructor_body[argCount - 1] = craftInvokerFunction(
-						humanName,
-						argTypes,
-						null,
-						invoker,
-						rawConstructor
-					);
-					return [];
-				});
-				return [];
-			});
-		}
-		function new_(constructor, argumentList) {
-			if (!(constructor instanceof Function)) {
-				throw new TypeError('new_ called with constructor type ' + typeof constructor + ' which is not a function');
-			}
-			var dummy = createNamedFunction(constructor.name || 'unknownFunctionName', function () {});
-			dummy.prototype = constructor.prototype;
-			var obj = new dummy();
-			var r = constructor.apply(obj, argumentList);
-			return r instanceof Object ? r : obj;
-		}
-		function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) {
-			var argCount = argTypes.length;
-			if (argCount < 2) {
-				throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!");
-			}
-			var isClassMethodFunc = argTypes[1] !== null && classType !== null;
-			var needsDestructorStack = false;
-			for (var i = 1; i < argTypes.length; ++i) {
-				if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) {
-					needsDestructorStack = true;
-					break;
-				}
-			}
-			var returns = argTypes[0].name !== 'void';
-			var argsList = '';
-			var argsListWired = '';
-			for (var i = 0; i < argCount - 2; ++i) {
-				argsList += (i !== 0 ? ', ' : '') + 'arg' + i;
-				argsListWired += (i !== 0 ? ', ' : '') + 'arg' + i + 'Wired';
-			}
-			var invokerFnBody =
-				'return function ' +
-				makeLegalFunctionName(humanName) +
-				'(' +
-				argsList +
-				') {\nif (arguments.length !== ' +
-				(argCount - 2) +
-				') {\n' +
-				"throwBindingError('function " +
-				humanName +
-				" called with ' + arguments.length + ' arguments, expected " +
-				(argCount - 2) +
-				" args!');\n" +
-				'}\n';
-			if (needsDestructorStack) {
-				invokerFnBody += 'var destructors = [];\n';
-			}
-			var dtorStack = needsDestructorStack ? 'destructors' : 'null';
-			var args1 = ['throwBindingError', 'invoker', 'fn', 'runDestructors', 'retType', 'classParam'];
-			var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]];
-			if (isClassMethodFunc) {
-				invokerFnBody += 'var thisWired = classParam.toWireType(' + dtorStack + ', this);\n';
-			}
-			for (var i = 0; i < argCount - 2; ++i) {
-				invokerFnBody +=
-					'var arg' + i + 'Wired = argType' + i + '.toWireType(' + dtorStack + ', arg' + i + '); // ' + argTypes[i + 2].name + '\n';
-				args1.push('argType' + i);
-				args2.push(argTypes[i + 2]);
-			}
-			if (isClassMethodFunc) {
-				argsListWired = 'thisWired' + (argsListWired.length > 0 ? ', ' : '') + argsListWired;
-			}
-			invokerFnBody += (returns ? 'var rv = ' : '') + 'invoker(fn' + (argsListWired.length > 0 ? ', ' : '') + argsListWired + ');\n';
-			if (needsDestructorStack) {
-				invokerFnBody += 'runDestructors(destructors);\n';
-			} else {
-				for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {
-					var paramName = i === 1 ? 'thisWired' : 'arg' + (i - 2) + 'Wired';
-					if (argTypes[i].destructorFunction !== null) {
-						invokerFnBody += paramName + '_dtor(' + paramName + '); // ' + argTypes[i].name + '\n';
-						args1.push(paramName + '_dtor');
-						args2.push(argTypes[i].destructorFunction);
-					}
-				}
-			}
-			if (returns) {
-				invokerFnBody += 'var ret = retType.fromWireType(rv);\nreturn ret;\n';
-			} else {
-			}
-			invokerFnBody += '}\n';
-			args1.push(invokerFnBody);
-			var invokerFunction = new_(Function, args1).apply(null, args2);
-			return invokerFunction;
-		}
-		function __embind_register_class_function(
-			rawClassType,
-			methodName,
-			argCount,
-			rawArgTypesAddr,
-			invokerSignature,
-			rawInvoker,
-			context,
-			isPureVirtual
-		) {
-			var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
-			methodName = readLatin1String(methodName);
-			rawInvoker = embind__requireFunction(invokerSignature, rawInvoker);
-			whenDependentTypesAreResolved([], [rawClassType], function (classType) {
-				classType = classType[0];
-				var humanName = classType.name + '.' + methodName;
-				if (methodName.startsWith('@@')) {
-					methodName = Symbol[methodName.substring(2)];
-				}
-				if (isPureVirtual) {
-					classType.registeredClass.pureVirtualFunctions.push(methodName);
-				}
-				function unboundTypesHandler() {
-					throwUnboundTypeError('Cannot call ' + humanName + ' due to unbound types', rawArgTypes);
-				}
-				var proto = classType.registeredClass.instancePrototype;
-				var method = proto[methodName];
-				if (
-					undefined === method ||
-					(undefined === method.overloadTable && method.className !== classType.name && method.argCount === argCount - 2)
-				) {
-					unboundTypesHandler.argCount = argCount - 2;
-					unboundTypesHandler.className = classType.name;
-					proto[methodName] = unboundTypesHandler;
-				} else {
-					ensureOverloadTable(proto, methodName, humanName);
-					proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler;
-				}
-				whenDependentTypesAreResolved([], rawArgTypes, function (argTypes) {
-					var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context);
-					if (undefined === proto[methodName].overloadTable) {
-						memberFunction.argCount = argCount - 2;
-						proto[methodName] = memberFunction;
-					} else {
-						proto[methodName].overloadTable[argCount - 2] = memberFunction;
-					}
-					return [];
-				});
-				return [];
-			});
-		}
-		function validateThis(this_, classType, humanName) {
-			if (!(this_ instanceof Object)) {
-				throwBindingError(humanName + ' with invalid "this": ' + this_);
-			}
-			if (!(this_ instanceof classType.registeredClass.constructor)) {
-				throwBindingError(humanName + ' incompatible with "this" of type ' + this_.constructor.name);
-			}
-			if (!this_.$$.ptr) {
-				throwBindingError('cannot call emscripten binding method ' + humanName + ' on deleted object');
-			}
-			return upcastPointer(this_.$$.ptr, this_.$$.ptrType.registeredClass, classType.registeredClass);
-		}
-		function __embind_register_class_property(
-			classType,
-			fieldName,
-			getterReturnType,
-			getterSignature,
-			getter,
-			getterContext,
-			setterArgumentType,
-			setterSignature,
-			setter,
-			setterContext
-		) {
-			fieldName = readLatin1String(fieldName);
-			getter = embind__requireFunction(getterSignature, getter);
-			whenDependentTypesAreResolved([], [classType], function (classType) {
-				classType = classType[0];
-				var humanName = classType.name + '.' + fieldName;
-				var desc = {
-					get: function () {
-						throwUnboundTypeError('Cannot access ' + humanName + ' due to unbound types', [getterReturnType, setterArgumentType]);
-					},
-					enumerable: true,
-					configurable: true
-				};
-				if (setter) {
-					desc.set = function () {
-						throwUnboundTypeError('Cannot access ' + humanName + ' due to unbound types', [getterReturnType, setterArgumentType]);
-					};
-				} else {
-					desc.set = function (v) {
-						throwBindingError(humanName + ' is a read-only property');
-					};
-				}
-				Object.defineProperty(classType.registeredClass.instancePrototype, fieldName, desc);
-				whenDependentTypesAreResolved([], setter ? [getterReturnType, setterArgumentType] : [getterReturnType], function (types) {
-					var getterReturnType = types[0];
-					var desc = {
-						get: function () {
-							var ptr = validateThis(this, classType, humanName + ' getter');
-							return getterReturnType['fromWireType'](getter(getterContext, ptr));
-						},
-						enumerable: true
-					};
-					if (setter) {
-						setter = embind__requireFunction(setterSignature, setter);
-						var setterArgumentType = types[1];
-						desc.set = function (v) {
-							var ptr = validateThis(this, classType, humanName + ' setter');
-							var destructors = [];
-							setter(setterContext, ptr, setterArgumentType['toWireType'](destructors, v));
-							runDestructors(destructors);
-						};
-					}
-					Object.defineProperty(classType.registeredClass.instancePrototype, fieldName, desc);
-					return [];
-				});
-				return [];
-			});
-		}
-		var emval_free_list = [];
-		var emval_handle_array = [{}, { value: undefined }, { value: null }, { value: true }, { value: false }];
-		function __emval_decref(handle) {
-			if (handle > 4 && 0 === --emval_handle_array[handle].refcount) {
-				emval_handle_array[handle] = undefined;
-				emval_free_list.push(handle);
-			}
-		}
-		function count_emval_handles() {
-			var count = 0;
-			for (var i = 5; i < emval_handle_array.length; ++i) {
-				if (emval_handle_array[i] !== undefined) {
-					++count;
-				}
-			}
-			return count;
-		}
-		function get_first_emval() {
-			for (var i = 5; i < emval_handle_array.length; ++i) {
-				if (emval_handle_array[i] !== undefined) {
-					return emval_handle_array[i];
-				}
-			}
-			return null;
-		}
-		function init_emval() {
-			Module['count_emval_handles'] = count_emval_handles;
-			Module['get_first_emval'] = get_first_emval;
-		}
-		var Emval = {
-			toValue: function (handle) {
-				if (!handle) {
-					throwBindingError('Cannot use deleted val. handle = ' + handle);
-				}
-				return emval_handle_array[handle].value;
-			},
-			toHandle: function (value) {
-				switch (value) {
-					case undefined: {
-						return 1;
-					}
-					case null: {
-						return 2;
-					}
-					case true: {
-						return 3;
-					}
-					case false: {
-						return 4;
-					}
-					default: {
-						var handle = emval_free_list.length ? emval_free_list.pop() : emval_handle_array.length;
-						emval_handle_array[handle] = { refcount: 1, value: value };
-						return handle;
-					}
-				}
-			}
-		};
-		function __embind_register_emval(rawType, name) {
-			name = readLatin1String(name);
-			registerType(rawType, {
-				name: name,
-				fromWireType: function (handle) {
-					var rv = Emval.toValue(handle);
-					__emval_decref(handle);
-					return rv;
-				},
-				toWireType: function (destructors, value) {
-					return Emval.toHandle(value);
-				},
-				argPackAdvance: 8,
-				readValueFromPointer: simpleReadValueFromPointer,
-				destructorFunction: null
-			});
-		}
-		function enumReadValueFromPointer(name, shift, signed) {
-			switch (shift) {
-				case 0:
-					return function (pointer) {
-						var heap = signed ? HEAP8 : HEAPU8;
-						return this['fromWireType'](heap[pointer]);
-					};
-				case 1:
-					return function (pointer) {
-						var heap = signed ? HEAP16 : HEAPU16;
-						return this['fromWireType'](heap[pointer >> 1]);
-					};
-				case 2:
-					return function (pointer) {
-						var heap = signed ? HEAP32 : HEAPU32;
-						return this['fromWireType'](heap[pointer >> 2]);
-					};
-				default:
-					throw new TypeError('Unknown integer type: ' + name);
-			}
-		}
-		function __embind_register_enum(rawType, name, size, isSigned) {
-			var shift = getShiftFromSize(size);
-			name = readLatin1String(name);
-			function ctor() {}
-			ctor.values = {};
-			registerType(rawType, {
-				name: name,
-				constructor: ctor,
-				fromWireType: function (c) {
-					return this.constructor.values[c];
-				},
-				toWireType: function (destructors, c) {
-					return c.value;
-				},
-				argPackAdvance: 8,
-				readValueFromPointer: enumReadValueFromPointer(name, shift, isSigned),
-				destructorFunction: null
-			});
-			exposePublicSymbol(name, ctor);
-		}
-		function requireRegisteredType(rawType, humanName) {
-			var impl = registeredTypes[rawType];
-			if (undefined === impl) {
-				throwBindingError(humanName + ' has unknown type ' + getTypeName(rawType));
-			}
-			return impl;
-		}
-		function __embind_register_enum_value(rawEnumType, name, enumValue) {
-			var enumType = requireRegisteredType(rawEnumType, 'enum');
-			name = readLatin1String(name);
-			var Enum = enumType.constructor;
-			var Value = Object.create(enumType.constructor.prototype, {
-				value: { value: enumValue },
-				constructor: { value: createNamedFunction(enumType.name + '_' + name, function () {}) }
-			});
-			Enum.values[enumValue] = Value;
-			Enum[name] = Value;
-		}
-		function _embind_repr(v) {
-			if (v === null) {
-				return 'null';
-			}
-			var t = typeof v;
-			if (t === 'object' || t === 'array' || t === 'function') {
-				return v.toString();
-			} else {
-				return '' + v;
-			}
-		}
-		function floatReadValueFromPointer(name, shift) {
-			switch (shift) {
-				case 2:
-					return function (pointer) {
-						return this['fromWireType'](HEAPF32[pointer >> 2]);
-					};
-				case 3:
-					return function (pointer) {
-						return this['fromWireType'](HEAPF64[pointer >> 3]);
-					};
-				default:
-					throw new TypeError('Unknown float type: ' + name);
-			}
-		}
-		function __embind_register_float(rawType, name, size) {
-			var shift = getShiftFromSize(size);
-			name = readLatin1String(name);
-			registerType(rawType, {
-				name: name,
-				fromWireType: function (value) {
-					return value;
-				},
-				toWireType: function (destructors, value) {
-					if (typeof value !== 'number' && typeof value !== 'boolean') {
-						throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
-					}
-					return value;
-				},
-				argPackAdvance: 8,
-				readValueFromPointer: floatReadValueFromPointer(name, shift),
-				destructorFunction: null
-			});
-		}
-		function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) {
-			var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
-			name = readLatin1String(name);
-			rawInvoker = embind__requireFunction(signature, rawInvoker);
-			exposePublicSymbol(
-				name,
-				function () {
-					throwUnboundTypeError('Cannot call ' + name + ' due to unbound types', argTypes);
-				},
-				argCount - 1
-			);
-			whenDependentTypesAreResolved([], argTypes, function (argTypes) {
-				var invokerArgsArray = [argTypes[0], null].concat(argTypes.slice(1));
-				replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null, rawInvoker, fn), argCount - 1);
-				return [];
-			});
-		}
-		function integerReadValueFromPointer(name, shift, signed) {
-			switch (shift) {
-				case 0:
-					return signed
-						? function readS8FromPointer(pointer) {
-								return HEAP8[pointer];
-							}
-						: function readU8FromPointer(pointer) {
-								return HEAPU8[pointer];
-							};
-				case 1:
-					return signed
-						? function readS16FromPointer(pointer) {
-								return HEAP16[pointer >> 1];
-							}
-						: function readU16FromPointer(pointer) {
-								return HEAPU16[pointer >> 1];
-							};
-				case 2:
-					return signed
-						? function readS32FromPointer(pointer) {
-								return HEAP32[pointer >> 2];
-							}
-						: function readU32FromPointer(pointer) {
-								return HEAPU32[pointer >> 2];
-							};
-				default:
-					throw new TypeError('Unknown integer type: ' + name);
-			}
-		}
-		function __embind_register_integer(primitiveType, name, size, minRange, maxRange) {
-			name = readLatin1String(name);
-			if (maxRange === -1) {
-				maxRange = 4294967295;
-			}
-			var shift = getShiftFromSize(size);
-			var fromWireType = function (value) {
-				return value;
-			};
-			if (minRange === 0) {
-				var bitshift = 32 - 8 * size;
-				fromWireType = function (value) {
-					return (value << bitshift) >>> bitshift;
-				};
-			}
-			var isUnsignedType = name.includes('unsigned');
-			registerType(primitiveType, {
-				name: name,
-				fromWireType: fromWireType,
-				toWireType: function (destructors, value) {
-					if (typeof value !== 'number' && typeof value !== 'boolean') {
-						throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
-					}
-					if (value < minRange || value > maxRange) {
-						throw new TypeError(
-							'Passing a number "' +
-								_embind_repr(value) +
-								'" from JS side to C/C++ side to an argument of type "' +
-								name +
-								'", which is outside the valid range [' +
-								minRange +
-								', ' +
-								maxRange +
-								']!'
-						);
-					}
-					return isUnsignedType ? value >>> 0 : value | 0;
-				},
-				argPackAdvance: 8,
-				readValueFromPointer: integerReadValueFromPointer(name, shift, minRange !== 0),
-				destructorFunction: null
-			});
-		}
-		function __embind_register_memory_view(rawType, dataTypeIndex, name) {
-			var typeMapping = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array];
-			var TA = typeMapping[dataTypeIndex];
-			function decodeMemoryView(handle) {
-				handle = handle >> 2;
-				var heap = HEAPU32;
-				var size = heap[handle];
-				var data = heap[handle + 1];
-				return new TA(buffer, data, size);
-			}
-			name = readLatin1String(name);
-			registerType(
-				rawType,
-				{ name: name, fromWireType: decodeMemoryView, argPackAdvance: 8, readValueFromPointer: decodeMemoryView },
-				{ ignoreDuplicateRegistrations: true }
-			);
-		}
-		function __embind_register_std_string(rawType, name) {
-			name = readLatin1String(name);
-			var stdStringIsUTF8 = name === 'std::string';
-			registerType(rawType, {
-				name: name,
-				fromWireType: function (value) {
-					var length = HEAPU32[value >> 2];
-					var str;
-					if (stdStringIsUTF8) {
-						var decodeStartPtr = value + 4;
-						for (var i = 0; i <= length; ++i) {
-							var currentBytePtr = value + 4 + i;
-							if (i == length || HEAPU8[currentBytePtr] == 0) {
-								var maxRead = currentBytePtr - decodeStartPtr;
-								var stringSegment = UTF8ToString(decodeStartPtr, maxRead);
-								if (str === undefined) {
-									str = stringSegment;
-								} else {
-									str += String.fromCharCode(0);
-									str += stringSegment;
-								}
-								decodeStartPtr = currentBytePtr + 1;
-							}
-						}
-					} else {
-						var a = new Array(length);
-						for (var i = 0; i < length; ++i) {
-							a[i] = String.fromCharCode(HEAPU8[value + 4 + i]);
-						}
-						str = a.join('');
-					}
-					_free(value);
-					return str;
-				},
-				toWireType: function (destructors, value) {
-					if (value instanceof ArrayBuffer) {
-						value = new Uint8Array(value);
-					}
-					var getLength;
-					var valueIsOfTypeString = typeof value === 'string';
-					if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) {
-						throwBindingError('Cannot pass non-string to std::string');
-					}
-					if (stdStringIsUTF8 && valueIsOfTypeString) {
-						getLength = function () {
-							return lengthBytesUTF8(value);
-						};
-					} else {
-						getLength = function () {
-							return value.length;
-						};
-					}
-					var length = getLength();
-					var ptr = _malloc(4 + length + 1);
-					HEAPU32[ptr >> 2] = length;
-					if (stdStringIsUTF8 && valueIsOfTypeString) {
-						stringToUTF8(value, ptr + 4, length + 1);
-					} else {
-						if (valueIsOfTypeString) {
-							for (var i = 0; i < length; ++i) {
-								var charCode = value.charCodeAt(i);
-								if (charCode > 255) {
-									_free(ptr);
-									throwBindingError('String has UTF-16 code units that do not fit in 8 bits');
-								}
-								HEAPU8[ptr + 4 + i] = charCode;
-							}
-						} else {
-							for (var i = 0; i < length; ++i) {
-								HEAPU8[ptr + 4 + i] = value[i];
-							}
-						}
-					}
-					if (destructors !== null) {
-						destructors.push(_free, ptr);
-					}
-					return ptr;
-				},
-				argPackAdvance: 8,
-				readValueFromPointer: simpleReadValueFromPointer,
-				destructorFunction: function (ptr) {
-					_free(ptr);
-				}
-			});
-		}
-		function __embind_register_std_wstring(rawType, charSize, name) {
-			name = readLatin1String(name);
-			var decodeString, encodeString, getHeap, lengthBytesUTF, shift;
-			if (charSize === 2) {
-				decodeString = UTF16ToString;
-				encodeString = stringToUTF16;
-				lengthBytesUTF = lengthBytesUTF16;
-				getHeap = function () {
-					return HEAPU16;
-				};
-				shift = 1;
-			} else if (charSize === 4) {
-				decodeString = UTF32ToString;
-				encodeString = stringToUTF32;
-				lengthBytesUTF = lengthBytesUTF32;
-				getHeap = function () {
-					return HEAPU32;
-				};
-				shift = 2;
-			}
-			registerType(rawType, {
-				name: name,
-				fromWireType: function (value) {
-					var length = HEAPU32[value >> 2];
-					var HEAP = getHeap();
-					var str;
-					var decodeStartPtr = value + 4;
-					for (var i = 0; i <= length; ++i) {
-						var currentBytePtr = value + 4 + i * charSize;
-						if (i == length || HEAP[currentBytePtr >> shift] == 0) {
-							var maxReadBytes = currentBytePtr - decodeStartPtr;
-							var stringSegment = decodeString(decodeStartPtr, maxReadBytes);
-							if (str === undefined) {
-								str = stringSegment;
-							} else {
-								str += String.fromCharCode(0);
-								str += stringSegment;
-							}
-							decodeStartPtr = currentBytePtr + charSize;
-						}
-					}
-					_free(value);
-					return str;
-				},
-				toWireType: function (destructors, value) {
-					if (!(typeof value === 'string')) {
-						throwBindingError('Cannot pass non-string to C++ string type ' + name);
-					}
-					var length = lengthBytesUTF(value);
-					var ptr = _malloc(4 + length + charSize);
-					HEAPU32[ptr >> 2] = length >> shift;
-					encodeString(value, ptr + 4, length + charSize);
-					if (destructors !== null) {
-						destructors.push(_free, ptr);
-					}
-					return ptr;
-				},
-				argPackAdvance: 8,
-				readValueFromPointer: simpleReadValueFromPointer,
-				destructorFunction: function (ptr) {
-					_free(ptr);
-				}
-			});
-		}
-		function __embind_register_value_array(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
-			tupleRegistrations[rawType] = {
-				name: readLatin1String(name),
-				rawConstructor: embind__requireFunction(constructorSignature, rawConstructor),
-				rawDestructor: embind__requireFunction(destructorSignature, rawDestructor),
-				elements: []
-			};
-		}
-		function __embind_register_value_array_element(
-			rawTupleType,
-			getterReturnType,
-			getterSignature,
-			getter,
-			getterContext,
-			setterArgumentType,
-			setterSignature,
-			setter,
-			setterContext
-		) {
-			tupleRegistrations[rawTupleType].elements.push({
-				getterReturnType: getterReturnType,
-				getter: embind__requireFunction(getterSignature, getter),
-				getterContext: getterContext,
-				setterArgumentType: setterArgumentType,
-				setter: embind__requireFunction(setterSignature, setter),
-				setterContext: setterContext
-			});
-		}
-		function __embind_register_value_object(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
-			structRegistrations[rawType] = {
-				name: readLatin1String(name),
-				rawConstructor: embind__requireFunction(constructorSignature, rawConstructor),
-				rawDestructor: embind__requireFunction(destructorSignature, rawDestructor),
-				fields: []
-			};
-		}
-		function __embind_register_value_object_field(
-			structType,
-			fieldName,
-			getterReturnType,
-			getterSignature,
-			getter,
-			getterContext,
-			setterArgumentType,
-			setterSignature,
-			setter,
-			setterContext
-		) {
-			structRegistrations[structType].fields.push({
-				fieldName: readLatin1String(fieldName),
-				getterReturnType: getterReturnType,
-				getter: embind__requireFunction(getterSignature, getter),
-				getterContext: getterContext,
-				setterArgumentType: setterArgumentType,
-				setter: embind__requireFunction(setterSignature, setter),
-				setterContext: setterContext
-			});
-		}
-		function __embind_register_void(rawType, name) {
-			name = readLatin1String(name);
-			registerType(rawType, {
-				isVoid: true,
-				name: name,
-				argPackAdvance: 0,
-				fromWireType: function () {
-					return undefined;
-				},
-				toWireType: function (destructors, o) {
-					return undefined;
-				}
-			});
-		}
-		function __emval_incref(handle) {
-			if (handle > 4) {
-				emval_handle_array[handle].refcount += 1;
-			}
-		}
-		function __emval_take_value(type, argv) {
-			type = requireRegisteredType(type, '_emval_take_value');
-			var v = type['readValueFromPointer'](argv);
-			return Emval.toHandle(v);
-		}
-		function _abort() {
-			abort('');
-		}
-		function _emscripten_memcpy_big(dest, src, num) {
-			HEAPU8.copyWithin(dest, src, src + num);
-		}
-		function emscripten_realloc_buffer(size) {
-			try {
-				wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16);
-				updateGlobalBufferAndViews(wasmMemory.buffer);
-				return 1;
-			} catch (e) {}
-		}
-		function _emscripten_resize_heap(requestedSize) {
-			var oldSize = HEAPU8.length;
-			requestedSize = requestedSize >>> 0;
-			var maxHeapSize = 2147483648;
-			if (requestedSize > maxHeapSize) {
-				return false;
-			}
-			for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
-				var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);
-				overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);
-				var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));
-				var replacement = emscripten_realloc_buffer(newSize);
-				if (replacement) {
-					return true;
-				}
-			}
-			return false;
-		}
-		var ENV = {};
-		function getExecutableName() {
-			return thisProgram || './this.program';
-		}
-		function getEnvStrings() {
-			if (!getEnvStrings.strings) {
-				var lang = ((typeof navigator === 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8';
-				var env = {
-					USER: 'web_user',
-					LOGNAME: 'web_user',
-					PATH: '/',
-					PWD: '/',
-					HOME: '/home/web_user',
-					LANG: lang,
-					_: getExecutableName()
-				};
-				for (var x in ENV) {
-					if (ENV[x] === undefined) delete env[x];
-					else env[x] = ENV[x];
-				}
-				var strings = [];
-				for (var x in env) {
-					strings.push(x + '=' + env[x]);
-				}
-				getEnvStrings.strings = strings;
-			}
-			return getEnvStrings.strings;
-		}
-		var PATH = {
-			splitPath: function (filename) {
-				var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
-				return splitPathRe.exec(filename).slice(1);
-			},
-			normalizeArray: function (parts, allowAboveRoot) {
-				var up = 0;
-				for (var i = parts.length - 1; i >= 0; i--) {
-					var last = parts[i];
-					if (last === '.') {
-						parts.splice(i, 1);
-					} else if (last === '..') {
-						parts.splice(i, 1);
-						up++;
-					} else if (up) {
-						parts.splice(i, 1);
-						up--;
-					}
-				}
-				if (allowAboveRoot) {
-					for (; up; up--) {
-						parts.unshift('..');
-					}
-				}
-				return parts;
-			},
-			normalize: function (path) {
-				var isAbsolute = path.charAt(0) === '/',
-					trailingSlash = path.substr(-1) === '/';
-				path = PATH.normalizeArray(
-					path.split('/').filter(function (p) {
-						return !!p;
-					}),
-					!isAbsolute
-				).join('/');
-				if (!path && !isAbsolute) {
-					path = '.';
-				}
-				if (path && trailingSlash) {
-					path += '/';
-				}
-				return (isAbsolute ? '/' : '') + path;
-			},
-			dirname: function (path) {
-				var result = PATH.splitPath(path),
-					root = result[0],
-					dir = result[1];
-				if (!root && !dir) {
-					return '.';
-				}
-				if (dir) {
-					dir = dir.substr(0, dir.length - 1);
-				}
-				return root + dir;
-			},
-			basename: function (path) {
-				if (path === '/') return '/';
-				path = PATH.normalize(path);
-				path = path.replace(/\/$/, '');
-				var lastSlash = path.lastIndexOf('/');
-				if (lastSlash === -1) return path;
-				return path.substr(lastSlash + 1);
-			},
-			extname: function (path) {
-				return PATH.splitPath(path)[3];
-			},
-			join: function () {
-				var paths = Array.prototype.slice.call(arguments, 0);
-				return PATH.normalize(paths.join('/'));
-			},
-			join2: function (l, r) {
-				return PATH.normalize(l + '/' + r);
-			}
-		};
-		function getRandomDevice() {
-			if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') {
-				var randomBuffer = new Uint8Array(1);
-				return function () {
-					crypto.getRandomValues(randomBuffer);
-					return randomBuffer[0];
-				};
-			} else
-				return function () {
-					abort('randomDevice');
-				};
-		}
-		var PATH_FS = {
-			resolve: function () {
-				var resolvedPath = '',
-					resolvedAbsolute = false;
-				for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
-					var path = i >= 0 ? arguments[i] : FS.cwd();
-					if (typeof path !== 'string') {
-						throw new TypeError('Arguments to path.resolve must be strings');
-					} else if (!path) {
-						return '';
-					}
-					resolvedPath = path + '/' + resolvedPath;
-					resolvedAbsolute = path.charAt(0) === '/';
-				}
-				resolvedPath = PATH.normalizeArray(
-					resolvedPath.split('/').filter(function (p) {
-						return !!p;
-					}),
-					!resolvedAbsolute
-				).join('/');
-				return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';
-			},
-			relative: function (from, to) {
-				from = PATH_FS.resolve(from).substr(1);
-				to = PATH_FS.resolve(to).substr(1);
-				function trim(arr) {
-					var start = 0;
-					for (; start < arr.length; start++) {
-						if (arr[start] !== '') break;
-					}
-					var end = arr.length - 1;
-					for (; end >= 0; end--) {
-						if (arr[end] !== '') break;
-					}
-					if (start > end) return [];
-					return arr.slice(start, end - start + 1);
-				}
-				var fromParts = trim(from.split('/'));
-				var toParts = trim(to.split('/'));
-				var length = Math.min(fromParts.length, toParts.length);
-				var samePartsLength = length;
-				for (var i = 0; i < length; i++) {
-					if (fromParts[i] !== toParts[i]) {
-						samePartsLength = i;
-						break;
-					}
-				}
-				var outputParts = [];
-				for (var i = samePartsLength; i < fromParts.length; i++) {
-					outputParts.push('..');
-				}
-				outputParts = outputParts.concat(toParts.slice(samePartsLength));
-				return outputParts.join('/');
-			}
-		};
-		var TTY = {
-			ttys: [],
-			init: function () {},
-			shutdown: function () {},
-			register: function (dev, ops) {
-				TTY.ttys[dev] = { input: [], output: [], ops: ops };
-				FS.registerDevice(dev, TTY.stream_ops);
-			},
-			stream_ops: {
-				open: function (stream) {
-					var tty = TTY.ttys[stream.node.rdev];
-					if (!tty) {
-						throw new FS.ErrnoError(43);
-					}
-					stream.tty = tty;
-					stream.seekable = false;
-				},
-				close: function (stream) {
-					stream.tty.ops.flush(stream.tty);
-				},
-				flush: function (stream) {
-					stream.tty.ops.flush(stream.tty);
-				},
-				read: function (stream, buffer, offset, length, pos) {
-					if (!stream.tty || !stream.tty.ops.get_char) {
-						throw new FS.ErrnoError(60);
-					}
-					var bytesRead = 0;
-					for (var i = 0; i < length; i++) {
-						var result;
-						try {
-							result = stream.tty.ops.get_char(stream.tty);
-						} catch (e) {
-							throw new FS.ErrnoError(29);
-						}
-						if (result === undefined && bytesRead === 0) {
-							throw new FS.ErrnoError(6);
-						}
-						if (result === null || result === undefined) break;
-						bytesRead++;
-						buffer[offset + i] = result;
-					}
-					if (bytesRead) {
-						stream.node.timestamp = Date.now();
-					}
-					return bytesRead;
-				},
-				write: function (stream, buffer, offset, length, pos) {
-					if (!stream.tty || !stream.tty.ops.put_char) {
-						throw new FS.ErrnoError(60);
-					}
-					try {
-						for (var i = 0; i < length; i++) {
-							stream.tty.ops.put_char(stream.tty, buffer[offset + i]);
-						}
-					} catch (e) {
-						throw new FS.ErrnoError(29);
-					}
-					if (length) {
-						stream.node.timestamp = Date.now();
-					}
-					return i;
-				}
-			},
-			default_tty_ops: {
-				get_char: function (tty) {
-					if (!tty.input.length) {
-						var result = null;
-						if (typeof window != 'undefined' && typeof window.prompt == 'function') {
-							result = window.prompt('Input: ');
-							if (result !== null) {
-								result += '\n';
-							}
-						} else if (typeof readline == 'function') {
-							result = readline();
-							if (result !== null) {
-								result += '\n';
-							}
-						}
-						if (!result) {
-							return null;
-						}
-						tty.input = intArrayFromString(result, true);
-					}
-					return tty.input.shift();
-				},
-				put_char: function (tty, val) {
-					if (val === null || val === 10) {
-						out(UTF8ArrayToString(tty.output, 0));
-						tty.output = [];
-					} else {
-						if (val != 0) tty.output.push(val);
-					}
-				},
-				flush: function (tty) {
-					if (tty.output && tty.output.length > 0) {
-						out(UTF8ArrayToString(tty.output, 0));
-						tty.output = [];
-					}
-				}
-			},
-			default_tty1_ops: {
-				put_char: function (tty, val) {
-					if (val === null || val === 10) {
-						err(UTF8ArrayToString(tty.output, 0));
-						tty.output = [];
-					} else {
-						if (val != 0) tty.output.push(val);
-					}
-				},
-				flush: function (tty) {
-					if (tty.output && tty.output.length > 0) {
-						err(UTF8ArrayToString(tty.output, 0));
-						tty.output = [];
-					}
-				}
-			}
-		};
-		function mmapAlloc(size) {
-			abort();
-		}
-		var MEMFS = {
-			ops_table: null,
-			mount: function (mount) {
-				return MEMFS.createNode(null, '/', 16384 | 511, 0);
-			},
-			createNode: function (parent, name, mode, dev) {
-				if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
-					throw new FS.ErrnoError(63);
-				}
-				if (!MEMFS.ops_table) {
-					MEMFS.ops_table = {
-						dir: {
-							node: {
-								getattr: MEMFS.node_ops.getattr,
-								setattr: MEMFS.node_ops.setattr,
-								lookup: MEMFS.node_ops.lookup,
-								mknod: MEMFS.node_ops.mknod,
-								rename: MEMFS.node_ops.rename,
-								unlink: MEMFS.node_ops.unlink,
-								rmdir: MEMFS.node_ops.rmdir,
-								readdir: MEMFS.node_ops.readdir,
-								symlink: MEMFS.node_ops.symlink
-							},
-							stream: { llseek: MEMFS.stream_ops.llseek }
-						},
-						file: {
-							node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr },
-							stream: {
-								llseek: MEMFS.stream_ops.llseek,
-								read: MEMFS.stream_ops.read,
-								write: MEMFS.stream_ops.write,
-								allocate: MEMFS.stream_ops.allocate,
-								mmap: MEMFS.stream_ops.mmap,
-								msync: MEMFS.stream_ops.msync
-							}
-						},
-						link: {
-							node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink },
-							stream: {}
-						},
-						chrdev: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: FS.chrdev_stream_ops }
-					};
-				}
-				var node = FS.createNode(parent, name, mode, dev);
-				if (FS.isDir(node.mode)) {
-					node.node_ops = MEMFS.ops_table.dir.node;
-					node.stream_ops = MEMFS.ops_table.dir.stream;
-					node.contents = {};
-				} else if (FS.isFile(node.mode)) {
-					node.node_ops = MEMFS.ops_table.file.node;
-					node.stream_ops = MEMFS.ops_table.file.stream;
-					node.usedBytes = 0;
-					node.contents = null;
-				} else if (FS.isLink(node.mode)) {
-					node.node_ops = MEMFS.ops_table.link.node;
-					node.stream_ops = MEMFS.ops_table.link.stream;
-				} else if (FS.isChrdev(node.mode)) {
-					node.node_ops = MEMFS.ops_table.chrdev.node;
-					node.stream_ops = MEMFS.ops_table.chrdev.stream;
-				}
-				node.timestamp = Date.now();
-				if (parent) {
-					parent.contents[name] = node;
-					parent.timestamp = node.timestamp;
-				}
-				return node;
-			},
-			getFileDataAsTypedArray: function (node) {
-				if (!node.contents) return new Uint8Array(0);
-				if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes);
-				return new Uint8Array(node.contents);
-			},
-			expandFileStorage: function (node, newCapacity) {
-				var prevCapacity = node.contents ? node.contents.length : 0;
-				if (prevCapacity >= newCapacity) return;
-				var CAPACITY_DOUBLING_MAX = 1024 * 1024;
-				newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0);
-				if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);
-				var oldContents = node.contents;
-				node.contents = new Uint8Array(newCapacity);
-				if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
-			},
-			resizeFileStorage: function (node, newSize) {
-				if (node.usedBytes == newSize) return;
-				if (newSize == 0) {
-					node.contents = null;
-					node.usedBytes = 0;
-				} else {
-					var oldContents = node.contents;
-					node.contents = new Uint8Array(newSize);
-					if (oldContents) {
-						node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)));
-					}
-					node.usedBytes = newSize;
-				}
-			},
-			node_ops: {
-				getattr: function (node) {
-					var attr = {};
-					attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
-					attr.ino = node.id;
-					attr.mode = node.mode;
-					attr.nlink = 1;
-					attr.uid = 0;
-					attr.gid = 0;
-					attr.rdev = node.rdev;
-					if (FS.isDir(node.mode)) {
-						attr.size = 4096;
-					} else if (FS.isFile(node.mode)) {
-						attr.size = node.usedBytes;
-					} else if (FS.isLink(node.mode)) {
-						attr.size = node.link.length;
-					} else {
-						attr.size = 0;
-					}
-					attr.atime = new Date(node.timestamp);
-					attr.mtime = new Date(node.timestamp);
-					attr.ctime = new Date(node.timestamp);
-					attr.blksize = 4096;
-					attr.blocks = Math.ceil(attr.size / attr.blksize);
-					return attr;
-				},
-				setattr: function (node, attr) {
-					if (attr.mode !== undefined) {
-						node.mode = attr.mode;
-					}
-					if (attr.timestamp !== undefined) {
-						node.timestamp = attr.timestamp;
-					}
-					if (attr.size !== undefined) {
-						MEMFS.resizeFileStorage(node, attr.size);
-					}
-				},
-				lookup: function (parent, name) {
-					throw FS.genericErrors[44];
-				},
-				mknod: function (parent, name, mode, dev) {
-					return MEMFS.createNode(parent, name, mode, dev);
-				},
-				rename: function (old_node, new_dir, new_name) {
-					if (FS.isDir(old_node.mode)) {
-						var new_node;
-						try {
-							new_node = FS.lookupNode(new_dir, new_name);
-						} catch (e) {}
-						if (new_node) {
-							for (var i in new_node.contents) {
-								throw new FS.ErrnoError(55);
-							}
-						}
-					}
-					delete old_node.parent.contents[old_node.name];
-					old_node.parent.timestamp = Date.now();
-					old_node.name = new_name;
-					new_dir.contents[new_name] = old_node;
-					new_dir.timestamp = old_node.parent.timestamp;
-					old_node.parent = new_dir;
-				},
-				unlink: function (parent, name) {
-					delete parent.contents[name];
-					parent.timestamp = Date.now();
-				},
-				rmdir: function (parent, name) {
-					var node = FS.lookupNode(parent, name);
-					for (var i in node.contents) {
-						throw new FS.ErrnoError(55);
-					}
-					delete parent.contents[name];
-					parent.timestamp = Date.now();
-				},
-				readdir: function (node) {
-					var entries = ['.', '..'];
-					for (var key in node.contents) {
-						if (!node.contents.hasOwnProperty(key)) {
-							continue;
-						}
-						entries.push(key);
-					}
-					return entries;
-				},
-				symlink: function (parent, newname, oldpath) {
-					var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
-					node.link = oldpath;
-					return node;
-				},
-				readlink: function (node) {
-					if (!FS.isLink(node.mode)) {
-						throw new FS.ErrnoError(28);
-					}
-					return node.link;
-				}
-			},
-			stream_ops: {
-				read: function (stream, buffer, offset, length, position) {
-					var contents = stream.node.contents;
-					if (position >= stream.node.usedBytes) return 0;
-					var size = Math.min(stream.node.usedBytes - position, length);
-					if (size > 8 && contents.subarray) {
-						buffer.set(contents.subarray(position, position + size), offset);
-					} else {
-						for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i];
-					}
-					return size;
-				},
-				write: function (stream, buffer, offset, length, position, canOwn) {
-					if (buffer.buffer === HEAP8.buffer) {
-						canOwn = false;
-					}
-					if (!length) return 0;
-					var node = stream.node;
-					node.timestamp = Date.now();
-					if (buffer.subarray && (!node.contents || node.contents.subarray)) {
-						if (canOwn) {
-							node.contents = buffer.subarray(offset, offset + length);
-							node.usedBytes = length;
-							return length;
-						} else if (node.usedBytes === 0 && position === 0) {
-							node.contents = buffer.slice(offset, offset + length);
-							node.usedBytes = length;
-							return length;
-						} else if (position + length <= node.usedBytes) {
-							node.contents.set(buffer.subarray(offset, offset + length), position);
-							return length;
-						}
-					}
-					MEMFS.expandFileStorage(node, position + length);
-					if (node.contents.subarray && buffer.subarray) {
-						node.contents.set(buffer.subarray(offset, offset + length), position);
-					} else {
-						for (var i = 0; i < length; i++) {
-							node.contents[position + i] = buffer[offset + i];
-						}
-					}
-					node.usedBytes = Math.max(node.usedBytes, position + length);
-					return length;
-				},
-				llseek: function (stream, offset, whence) {
-					var position = offset;
-					if (whence === 1) {
-						position += stream.position;
-					} else if (whence === 2) {
-						if (FS.isFile(stream.node.mode)) {
-							position += stream.node.usedBytes;
-						}
-					}
-					if (position < 0) {
-						throw new FS.ErrnoError(28);
-					}
-					return position;
-				},
-				allocate: function (stream, offset, length) {
-					MEMFS.expandFileStorage(stream.node, offset + length);
-					stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length);
-				},
-				mmap: function (stream, address, length, position, prot, flags) {
-					if (address !== 0) {
-						throw new FS.ErrnoError(28);
-					}
-					if (!FS.isFile(stream.node.mode)) {
-						throw new FS.ErrnoError(43);
-					}
-					var ptr;
-					var allocated;
-					var contents = stream.node.contents;
-					if (!(flags & 2) && contents.buffer === buffer) {
-						allocated = false;
-						ptr = contents.byteOffset;
-					} else {
-						if (position > 0 || position + length < contents.length) {
-							if (contents.subarray) {
-								contents = contents.subarray(position, position + length);
-							} else {
-								contents = Array.prototype.slice.call(contents, position, position + length);
-							}
-						}
-						allocated = true;
-						ptr = mmapAlloc(length);
-						if (!ptr) {
-							throw new FS.ErrnoError(48);
-						}
-						HEAP8.set(contents, ptr);
-					}
-					return { ptr: ptr, allocated: allocated };
-				},
-				msync: function (stream, buffer, offset, length, mmapFlags) {
-					if (!FS.isFile(stream.node.mode)) {
-						throw new FS.ErrnoError(43);
-					}
-					if (mmapFlags & 2) {
-						return 0;
-					}
-					var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
-					return 0;
-				}
-			}
-		};
-		function asyncLoad(url, onload, onerror, noRunDep) {
-			var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : '';
-			readAsync(
-				url,
-				function (arrayBuffer) {
-					assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
-					onload(new Uint8Array(arrayBuffer));
-					if (dep) removeRunDependency(dep);
-				},
-				function (event) {
-					if (onerror) {
-						onerror();
-					} else {
-						throw 'Loading data file "' + url + '" failed.';
-					}
-				}
-			);
-			if (dep) addRunDependency(dep);
-		}
-		var FS = {
-			root: null,
-			mounts: [],
-			devices: {},
-			streams: [],
-			nextInode: 1,
-			nameTable: null,
-			currentPath: '/',
-			initialized: false,
-			ignorePermissions: true,
-			ErrnoError: null,
-			genericErrors: {},
-			filesystems: null,
-			syncFSRequests: 0,
-			lookupPath: function (path, opts) {
-				path = PATH_FS.resolve(FS.cwd(), path);
-				opts = opts || {};
-				if (!path) return { path: '', node: null };
-				var defaults = { follow_mount: true, recurse_count: 0 };
-				for (var key in defaults) {
-					if (opts[key] === undefined) {
-						opts[key] = defaults[key];
-					}
-				}
-				if (opts.recurse_count > 8) {
-					throw new FS.ErrnoError(32);
-				}
-				var parts = PATH.normalizeArray(
-					path.split('/').filter(function (p) {
-						return !!p;
-					}),
-					false
-				);
-				var current = FS.root;
-				var current_path = '/';
-				for (var i = 0; i < parts.length; i++) {
-					var islast = i === parts.length - 1;
-					if (islast && opts.parent) {
-						break;
-					}
-					current = FS.lookupNode(current, parts[i]);
-					current_path = PATH.join2(current_path, parts[i]);
-					if (FS.isMountpoint(current)) {
-						if (!islast || (islast && opts.follow_mount)) {
-							current = current.mounted.root;
-						}
-					}
-					if (!islast || opts.follow) {
-						var count = 0;
-						while (FS.isLink(current.mode)) {
-							var link = FS.readlink(current_path);
-							current_path = PATH_FS.resolve(PATH.dirname(current_path), link);
-							var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });
-							current = lookup.node;
-							if (count++ > 40) {
-								throw new FS.ErrnoError(32);
-							}
-						}
-					}
-				}
-				return { path: current_path, node: current };
-			},
-			getPath: function (node) {
-				var path;
-				while (true) {
-					if (FS.isRoot(node)) {
-						var mount = node.mount.mountpoint;
-						if (!path) return mount;
-						return mount[mount.length - 1] !== '/' ? mount + '/' + path : mount + path;
-					}
-					path = path ? node.name + '/' + path : node.name;
-					node = node.parent;
-				}
-			},
-			hashName: function (parentid, name) {
-				var hash = 0;
-				for (var i = 0; i < name.length; i++) {
-					hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
-				}
-				return ((parentid + hash) >>> 0) % FS.nameTable.length;
-			},
-			hashAddNode: function (node) {
-				var hash = FS.hashName(node.parent.id, node.name);
-				node.name_next = FS.nameTable[hash];
-				FS.nameTable[hash] = node;
-			},
-			hashRemoveNode: function (node) {
-				var hash = FS.hashName(node.parent.id, node.name);
-				if (FS.nameTable[hash] === node) {
-					FS.nameTable[hash] = node.name_next;
-				} else {
-					var current = FS.nameTable[hash];
-					while (current) {
-						if (current.name_next === node) {
-							current.name_next = node.name_next;
-							break;
-						}
-						current = current.name_next;
-					}
-				}
-			},
-			lookupNode: function (parent, name) {
-				var errCode = FS.mayLookup(parent);
-				if (errCode) {
-					throw new FS.ErrnoError(errCode, parent);
-				}
-				var hash = FS.hashName(parent.id, name);
-				for (var node = FS.nameTable[hash]; node; node = node.name_next) {
-					var nodeName = node.name;
-					if (node.parent.id === parent.id && nodeName === name) {
-						return node;
-					}
-				}
-				return FS.lookup(parent, name);
-			},
-			createNode: function (parent, name, mode, rdev) {
-				var node = new FS.FSNode(parent, name, mode, rdev);
-				FS.hashAddNode(node);
-				return node;
-			},
-			destroyNode: function (node) {
-				FS.hashRemoveNode(node);
-			},
-			isRoot: function (node) {
-				return node === node.parent;
-			},
-			isMountpoint: function (node) {
-				return !!node.mounted;
-			},
-			isFile: function (mode) {
-				return (mode & 61440) === 32768;
-			},
-			isDir: function (mode) {
-				return (mode & 61440) === 16384;
-			},
-			isLink: function (mode) {
-				return (mode & 61440) === 40960;
-			},
-			isChrdev: function (mode) {
-				return (mode & 61440) === 8192;
-			},
-			isBlkdev: function (mode) {
-				return (mode & 61440) === 24576;
-			},
-			isFIFO: function (mode) {
-				return (mode & 61440) === 4096;
-			},
-			isSocket: function (mode) {
-				return (mode & 49152) === 49152;
-			},
-			flagModes: { r: 0, 'r+': 2, w: 577, 'w+': 578, a: 1089, 'a+': 1090 },
-			modeStringToFlags: function (str) {
-				var flags = FS.flagModes[str];
-				if (typeof flags === 'undefined') {
-					throw new Error('Unknown file open mode: ' + str);
-				}
-				return flags;
-			},
-			flagsToPermissionString: function (flag) {
-				var perms = ['r', 'w', 'rw'][flag & 3];
-				if (flag & 512) {
-					perms += 'w';
-				}
-				return perms;
-			},
-			nodePermissions: function (node, perms) {
-				if (FS.ignorePermissions) {
-					return 0;
-				}
-				if (perms.includes('r') && !(node.mode & 292)) {
-					return 2;
-				} else if (perms.includes('w') && !(node.mode & 146)) {
-					return 2;
-				} else if (perms.includes('x') && !(node.mode & 73)) {
-					return 2;
-				}
-				return 0;
-			},
-			mayLookup: function (dir) {
-				var errCode = FS.nodePermissions(dir, 'x');
-				if (errCode) return errCode;
-				if (!dir.node_ops.lookup) return 2;
-				return 0;
-			},
-			mayCreate: function (dir, name) {
-				try {
-					var node = FS.lookupNode(dir, name);
-					return 20;
-				} catch (e) {}
-				return FS.nodePermissions(dir, 'wx');
-			},
-			mayDelete: function (dir, name, isdir) {
-				var node;
-				try {
-					node = FS.lookupNode(dir, name);
-				} catch (e) {
-					return e.errno;
-				}
-				var errCode = FS.nodePermissions(dir, 'wx');
-				if (errCode) {
-					return errCode;
-				}
-				if (isdir) {
-					if (!FS.isDir(node.mode)) {
-						return 54;
-					}
-					if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
-						return 10;
-					}
-				} else {
-					if (FS.isDir(node.mode)) {
-						return 31;
-					}
-				}
-				return 0;
-			},
-			mayOpen: function (node, flags) {
-				if (!node) {
-					return 44;
-				}
-				if (FS.isLink(node.mode)) {
-					return 32;
-				} else if (FS.isDir(node.mode)) {
-					if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) {
-						return 31;
-					}
-				}
-				return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
-			},
-			MAX_OPEN_FDS: 4096,
-			nextfd: function (fd_start, fd_end) {
-				fd_start = fd_start || 0;
-				fd_end = fd_end || FS.MAX_OPEN_FDS;
-				for (var fd = fd_start; fd <= fd_end; fd++) {
-					if (!FS.streams[fd]) {
-						return fd;
-					}
-				}
-				throw new FS.ErrnoError(33);
-			},
-			getStream: function (fd) {
-				return FS.streams[fd];
-			},
-			createStream: function (stream, fd_start, fd_end) {
-				if (!FS.FSStream) {
-					FS.FSStream = function () {};
-					FS.FSStream.prototype = {
-						object: {
-							get: function () {
-								return this.node;
-							},
-							set: function (val) {
-								this.node = val;
-							}
-						},
-						isRead: {
-							get: function () {
-								return (this.flags & 2097155) !== 1;
-							}
-						},
-						isWrite: {
-							get: function () {
-								return (this.flags & 2097155) !== 0;
-							}
-						},
-						isAppend: {
-							get: function () {
-								return this.flags & 1024;
-							}
-						}
-					};
-				}
-				var newStream = new FS.FSStream();
-				for (var p in stream) {
-					newStream[p] = stream[p];
-				}
-				stream = newStream;
-				var fd = FS.nextfd(fd_start, fd_end);
-				stream.fd = fd;
-				FS.streams[fd] = stream;
-				return stream;
-			},
-			closeStream: function (fd) {
-				FS.streams[fd] = null;
-			},
-			chrdev_stream_ops: {
-				open: function (stream) {
-					var device = FS.getDevice(stream.node.rdev);
-					stream.stream_ops = device.stream_ops;
-					if (stream.stream_ops.open) {
-						stream.stream_ops.open(stream);
-					}
-				},
-				llseek: function () {
-					throw new FS.ErrnoError(70);
-				}
-			},
-			major: function (dev) {
-				return dev >> 8;
-			},
-			minor: function (dev) {
-				return dev & 255;
-			},
-			makedev: function (ma, mi) {
-				return (ma << 8) | mi;
-			},
-			registerDevice: function (dev, ops) {
-				FS.devices[dev] = { stream_ops: ops };
-			},
-			getDevice: function (dev) {
-				return FS.devices[dev];
-			},
-			getMounts: function (mount) {
-				var mounts = [];
-				var check = [mount];
-				while (check.length) {
-					var m = check.pop();
-					mounts.push(m);
-					check.push.apply(check, m.mounts);
-				}
-				return mounts;
-			},
-			syncfs: function (populate, callback) {
-				if (typeof populate === 'function') {
-					callback = populate;
-					populate = false;
-				}
-				FS.syncFSRequests++;
-				if (FS.syncFSRequests > 1) {
-					err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work');
-				}
-				var mounts = FS.getMounts(FS.root.mount);
-				var completed = 0;
-				function doCallback(errCode) {
-					FS.syncFSRequests--;
-					return callback(errCode);
-				}
-				function done(errCode) {
-					if (errCode) {
-						if (!done.errored) {
-							done.errored = true;
-							return doCallback(errCode);
-						}
-						return;
-					}
-					if (++completed >= mounts.length) {
-						doCallback(null);
-					}
-				}
-				mounts.forEach(function (mount) {
-					if (!mount.type.syncfs) {
-						return done(null);
-					}
-					mount.type.syncfs(mount, populate, done);
-				});
-			},
-			mount: function (type, opts, mountpoint) {
-				var root = mountpoint === '/';
-				var pseudo = !mountpoint;
-				var node;
-				if (root && FS.root) {
-					throw new FS.ErrnoError(10);
-				} else if (!root && !pseudo) {
-					var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
-					mountpoint = lookup.path;
-					node = lookup.node;
-					if (FS.isMountpoint(node)) {
-						throw new FS.ErrnoError(10);
-					}
-					if (!FS.isDir(node.mode)) {
-						throw new FS.ErrnoError(54);
-					}
-				}
-				var mount = { type: type, opts: opts, mountpoint: mountpoint, mounts: [] };
-				var mountRoot = type.mount(mount);
-				mountRoot.mount = mount;
-				mount.root = mountRoot;
-				if (root) {
-					FS.root = mountRoot;
-				} else if (node) {
-					node.mounted = mount;
-					if (node.mount) {
-						node.mount.mounts.push(mount);
-					}
-				}
-				return mountRoot;
-			},
-			unmount: function (mountpoint) {
-				var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
-				if (!FS.isMountpoint(lookup.node)) {
-					throw new FS.ErrnoError(28);
-				}
-				var node = lookup.node;
-				var mount = node.mounted;
-				var mounts = FS.getMounts(mount);
-				Object.keys(FS.nameTable).forEach(function (hash) {
-					var current = FS.nameTable[hash];
-					while (current) {
-						var next = current.name_next;
-						if (mounts.includes(current.mount)) {
-							FS.destroyNode(current);
-						}
-						current = next;
-					}
-				});
-				node.mounted = null;
-				var idx = node.mount.mounts.indexOf(mount);
-				node.mount.mounts.splice(idx, 1);
-			},
-			lookup: function (parent, name) {
-				return parent.node_ops.lookup(parent, name);
-			},
-			mknod: function (path, mode, dev) {
-				var lookup = FS.lookupPath(path, { parent: true });
-				var parent = lookup.node;
-				var name = PATH.basename(path);
-				if (!name || name === '.' || name === '..') {
-					throw new FS.ErrnoError(28);
-				}
-				var errCode = FS.mayCreate(parent, name);
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				if (!parent.node_ops.mknod) {
-					throw new FS.ErrnoError(63);
-				}
-				return parent.node_ops.mknod(parent, name, mode, dev);
-			},
-			create: function (path, mode) {
-				mode = mode !== undefined ? mode : 438;
-				mode &= 4095;
-				mode |= 32768;
-				return FS.mknod(path, mode, 0);
-			},
-			mkdir: function (path, mode) {
-				mode = mode !== undefined ? mode : 511;
-				mode &= 511 | 512;
-				mode |= 16384;
-				return FS.mknod(path, mode, 0);
-			},
-			mkdirTree: function (path, mode) {
-				var dirs = path.split('/');
-				var d = '';
-				for (var i = 0; i < dirs.length; ++i) {
-					if (!dirs[i]) continue;
-					d += '/' + dirs[i];
-					try {
-						FS.mkdir(d, mode);
-					} catch (e) {
-						if (e.errno != 20) throw e;
-					}
-				}
-			},
-			mkdev: function (path, mode, dev) {
-				if (typeof dev === 'undefined') {
-					dev = mode;
-					mode = 438;
-				}
-				mode |= 8192;
-				return FS.mknod(path, mode, dev);
-			},
-			symlink: function (oldpath, newpath) {
-				if (!PATH_FS.resolve(oldpath)) {
-					throw new FS.ErrnoError(44);
-				}
-				var lookup = FS.lookupPath(newpath, { parent: true });
-				var parent = lookup.node;
-				if (!parent) {
-					throw new FS.ErrnoError(44);
-				}
-				var newname = PATH.basename(newpath);
-				var errCode = FS.mayCreate(parent, newname);
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				if (!parent.node_ops.symlink) {
-					throw new FS.ErrnoError(63);
-				}
-				return parent.node_ops.symlink(parent, newname, oldpath);
-			},
-			rename: function (old_path, new_path) {
-				var old_dirname = PATH.dirname(old_path);
-				var new_dirname = PATH.dirname(new_path);
-				var old_name = PATH.basename(old_path);
-				var new_name = PATH.basename(new_path);
-				var lookup, old_dir, new_dir;
-				lookup = FS.lookupPath(old_path, { parent: true });
-				old_dir = lookup.node;
-				lookup = FS.lookupPath(new_path, { parent: true });
-				new_dir = lookup.node;
-				if (!old_dir || !new_dir) throw new FS.ErrnoError(44);
-				if (old_dir.mount !== new_dir.mount) {
-					throw new FS.ErrnoError(75);
-				}
-				var old_node = FS.lookupNode(old_dir, old_name);
-				var relative = PATH_FS.relative(old_path, new_dirname);
-				if (relative.charAt(0) !== '.') {
-					throw new FS.ErrnoError(28);
-				}
-				relative = PATH_FS.relative(new_path, old_dirname);
-				if (relative.charAt(0) !== '.') {
-					throw new FS.ErrnoError(55);
-				}
-				var new_node;
-				try {
-					new_node = FS.lookupNode(new_dir, new_name);
-				} catch (e) {}
-				if (old_node === new_node) {
-					return;
-				}
-				var isdir = FS.isDir(old_node.mode);
-				var errCode = FS.mayDelete(old_dir, old_name, isdir);
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				if (!old_dir.node_ops.rename) {
-					throw new FS.ErrnoError(63);
-				}
-				if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
-					throw new FS.ErrnoError(10);
-				}
-				if (new_dir !== old_dir) {
-					errCode = FS.nodePermissions(old_dir, 'w');
-					if (errCode) {
-						throw new FS.ErrnoError(errCode);
-					}
-				}
-				FS.hashRemoveNode(old_node);
-				try {
-					old_dir.node_ops.rename(old_node, new_dir, new_name);
-				} catch (e) {
-					throw e;
-				} finally {
-					FS.hashAddNode(old_node);
-				}
-			},
-			rmdir: function (path) {
-				var lookup = FS.lookupPath(path, { parent: true });
-				var parent = lookup.node;
-				var name = PATH.basename(path);
-				var node = FS.lookupNode(parent, name);
-				var errCode = FS.mayDelete(parent, name, true);
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				if (!parent.node_ops.rmdir) {
-					throw new FS.ErrnoError(63);
-				}
-				if (FS.isMountpoint(node)) {
-					throw new FS.ErrnoError(10);
-				}
-				parent.node_ops.rmdir(parent, name);
-				FS.destroyNode(node);
-			},
-			readdir: function (path) {
-				var lookup = FS.lookupPath(path, { follow: true });
-				var node = lookup.node;
-				if (!node.node_ops.readdir) {
-					throw new FS.ErrnoError(54);
-				}
-				return node.node_ops.readdir(node);
-			},
-			unlink: function (path) {
-				var lookup = FS.lookupPath(path, { parent: true });
-				var parent = lookup.node;
-				var name = PATH.basename(path);
-				var node = FS.lookupNode(parent, name);
-				var errCode = FS.mayDelete(parent, name, false);
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				if (!parent.node_ops.unlink) {
-					throw new FS.ErrnoError(63);
-				}
-				if (FS.isMountpoint(node)) {
-					throw new FS.ErrnoError(10);
-				}
-				parent.node_ops.unlink(parent, name);
-				FS.destroyNode(node);
-			},
-			readlink: function (path) {
-				var lookup = FS.lookupPath(path);
-				var link = lookup.node;
-				if (!link) {
-					throw new FS.ErrnoError(44);
-				}
-				if (!link.node_ops.readlink) {
-					throw new FS.ErrnoError(28);
-				}
-				return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link));
-			},
-			stat: function (path, dontFollow) {
-				var lookup = FS.lookupPath(path, { follow: !dontFollow });
-				var node = lookup.node;
-				if (!node) {
-					throw new FS.ErrnoError(44);
-				}
-				if (!node.node_ops.getattr) {
-					throw new FS.ErrnoError(63);
-				}
-				return node.node_ops.getattr(node);
-			},
-			lstat: function (path) {
-				return FS.stat(path, true);
-			},
-			chmod: function (path, mode, dontFollow) {
-				var node;
-				if (typeof path === 'string') {
-					var lookup = FS.lookupPath(path, { follow: !dontFollow });
-					node = lookup.node;
-				} else {
-					node = path;
-				}
-				if (!node.node_ops.setattr) {
-					throw new FS.ErrnoError(63);
-				}
-				node.node_ops.setattr(node, { mode: (mode & 4095) | (node.mode & ~4095), timestamp: Date.now() });
-			},
-			lchmod: function (path, mode) {
-				FS.chmod(path, mode, true);
-			},
-			fchmod: function (fd, mode) {
-				var stream = FS.getStream(fd);
-				if (!stream) {
-					throw new FS.ErrnoError(8);
-				}
-				FS.chmod(stream.node, mode);
-			},
-			chown: function (path, uid, gid, dontFollow) {
-				var node;
-				if (typeof path === 'string') {
-					var lookup = FS.lookupPath(path, { follow: !dontFollow });
-					node = lookup.node;
-				} else {
-					node = path;
-				}
-				if (!node.node_ops.setattr) {
-					throw new FS.ErrnoError(63);
-				}
-				node.node_ops.setattr(node, { timestamp: Date.now() });
-			},
-			lchown: function (path, uid, gid) {
-				FS.chown(path, uid, gid, true);
-			},
-			fchown: function (fd, uid, gid) {
-				var stream = FS.getStream(fd);
-				if (!stream) {
-					throw new FS.ErrnoError(8);
-				}
-				FS.chown(stream.node, uid, gid);
-			},
-			truncate: function (path, len) {
-				if (len < 0) {
-					throw new FS.ErrnoError(28);
-				}
-				var node;
-				if (typeof path === 'string') {
-					var lookup = FS.lookupPath(path, { follow: true });
-					node = lookup.node;
-				} else {
-					node = path;
-				}
-				if (!node.node_ops.setattr) {
-					throw new FS.ErrnoError(63);
-				}
-				if (FS.isDir(node.mode)) {
-					throw new FS.ErrnoError(31);
-				}
-				if (!FS.isFile(node.mode)) {
-					throw new FS.ErrnoError(28);
-				}
-				var errCode = FS.nodePermissions(node, 'w');
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				node.node_ops.setattr(node, { size: len, timestamp: Date.now() });
-			},
-			ftruncate: function (fd, len) {
-				var stream = FS.getStream(fd);
-				if (!stream) {
-					throw new FS.ErrnoError(8);
-				}
-				if ((stream.flags & 2097155) === 0) {
-					throw new FS.ErrnoError(28);
-				}
-				FS.truncate(stream.node, len);
-			},
-			utime: function (path, atime, mtime) {
-				var lookup = FS.lookupPath(path, { follow: true });
-				var node = lookup.node;
-				node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) });
-			},
-			open: function (path, flags, mode, fd_start, fd_end) {
-				if (path === '') {
-					throw new FS.ErrnoError(44);
-				}
-				flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
-				mode = typeof mode === 'undefined' ? 438 : mode;
-				if (flags & 64) {
-					mode = (mode & 4095) | 32768;
-				} else {
-					mode = 0;
-				}
-				var node;
-				if (typeof path === 'object') {
-					node = path;
-				} else {
-					path = PATH.normalize(path);
-					try {
-						var lookup = FS.lookupPath(path, { follow: !(flags & 131072) });
-						node = lookup.node;
-					} catch (e) {}
-				}
-				var created = false;
-				if (flags & 64) {
-					if (node) {
-						if (flags & 128) {
-							throw new FS.ErrnoError(20);
-						}
-					} else {
-						node = FS.mknod(path, mode, 0);
-						created = true;
-					}
-				}
-				if (!node) {
-					throw new FS.ErrnoError(44);
-				}
-				if (FS.isChrdev(node.mode)) {
-					flags &= ~512;
-				}
-				if (flags & 65536 && !FS.isDir(node.mode)) {
-					throw new FS.ErrnoError(54);
-				}
-				if (!created) {
-					var errCode = FS.mayOpen(node, flags);
-					if (errCode) {
-						throw new FS.ErrnoError(errCode);
-					}
-				}
-				if (flags & 512) {
-					FS.truncate(node, 0);
-				}
-				flags &= ~(128 | 512 | 131072);
-				var stream = FS.createStream(
-					{
-						node: node,
-						path: FS.getPath(node),
-						id: node.id,
-						flags: flags,
-						mode: node.mode,
-						seekable: true,
-						position: 0,
-						stream_ops: node.stream_ops,
-						node_ops: node.node_ops,
-						ungotten: [],
-						error: false
-					},
-					fd_start,
-					fd_end
-				);
-				if (stream.stream_ops.open) {
-					stream.stream_ops.open(stream);
-				}
-				if (Module['logReadFiles'] && !(flags & 1)) {
-					if (!FS.readFiles) FS.readFiles = {};
-					if (!(path in FS.readFiles)) {
-						FS.readFiles[path] = 1;
-					}
-				}
-				return stream;
-			},
-			close: function (stream) {
-				if (FS.isClosed(stream)) {
-					throw new FS.ErrnoError(8);
-				}
-				if (stream.getdents) stream.getdents = null;
-				try {
-					if (stream.stream_ops.close) {
-						stream.stream_ops.close(stream);
-					}
-				} catch (e) {
-					throw e;
-				} finally {
-					FS.closeStream(stream.fd);
-				}
-				stream.fd = null;
-			},
-			isClosed: function (stream) {
-				return stream.fd === null;
-			},
-			llseek: function (stream, offset, whence) {
-				if (FS.isClosed(stream)) {
-					throw new FS.ErrnoError(8);
-				}
-				if (!stream.seekable || !stream.stream_ops.llseek) {
-					throw new FS.ErrnoError(70);
-				}
-				if (whence != 0 && whence != 1 && whence != 2) {
-					throw new FS.ErrnoError(28);
-				}
-				stream.position = stream.stream_ops.llseek(stream, offset, whence);
-				stream.ungotten = [];
-				return stream.position;
-			},
-			read: function (stream, buffer, offset, length, position) {
-				if (length < 0 || position < 0) {
-					throw new FS.ErrnoError(28);
-				}
-				if (FS.isClosed(stream)) {
-					throw new FS.ErrnoError(8);
-				}
-				if ((stream.flags & 2097155) === 1) {
-					throw new FS.ErrnoError(8);
-				}
-				if (FS.isDir(stream.node.mode)) {
-					throw new FS.ErrnoError(31);
-				}
-				if (!stream.stream_ops.read) {
-					throw new FS.ErrnoError(28);
-				}
-				var seeking = typeof position !== 'undefined';
-				if (!seeking) {
-					position = stream.position;
-				} else if (!stream.seekable) {
-					throw new FS.ErrnoError(70);
-				}
-				var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
-				if (!seeking) stream.position += bytesRead;
-				return bytesRead;
-			},
-			write: function (stream, buffer, offset, length, position, canOwn) {
-				if (length < 0 || position < 0) {
-					throw new FS.ErrnoError(28);
-				}
-				if (FS.isClosed(stream)) {
-					throw new FS.ErrnoError(8);
-				}
-				if ((stream.flags & 2097155) === 0) {
-					throw new FS.ErrnoError(8);
-				}
-				if (FS.isDir(stream.node.mode)) {
-					throw new FS.ErrnoError(31);
-				}
-				if (!stream.stream_ops.write) {
-					throw new FS.ErrnoError(28);
-				}
-				if (stream.seekable && stream.flags & 1024) {
-					FS.llseek(stream, 0, 2);
-				}
-				var seeking = typeof position !== 'undefined';
-				if (!seeking) {
-					position = stream.position;
-				} else if (!stream.seekable) {
-					throw new FS.ErrnoError(70);
-				}
-				var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
-				if (!seeking) stream.position += bytesWritten;
-				return bytesWritten;
-			},
-			allocate: function (stream, offset, length) {
-				if (FS.isClosed(stream)) {
-					throw new FS.ErrnoError(8);
-				}
-				if (offset < 0 || length <= 0) {
-					throw new FS.ErrnoError(28);
-				}
-				if ((stream.flags & 2097155) === 0) {
-					throw new FS.ErrnoError(8);
-				}
-				if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
-					throw new FS.ErrnoError(43);
-				}
-				if (!stream.stream_ops.allocate) {
-					throw new FS.ErrnoError(138);
-				}
-				stream.stream_ops.allocate(stream, offset, length);
-			},
-			mmap: function (stream, address, length, position, prot, flags) {
-				if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) {
-					throw new FS.ErrnoError(2);
-				}
-				if ((stream.flags & 2097155) === 1) {
-					throw new FS.ErrnoError(2);
-				}
-				if (!stream.stream_ops.mmap) {
-					throw new FS.ErrnoError(43);
-				}
-				return stream.stream_ops.mmap(stream, address, length, position, prot, flags);
-			},
-			msync: function (stream, buffer, offset, length, mmapFlags) {
-				if (!stream || !stream.stream_ops.msync) {
-					return 0;
-				}
-				return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags);
-			},
-			munmap: function (stream) {
-				return 0;
-			},
-			ioctl: function (stream, cmd, arg) {
-				if (!stream.stream_ops.ioctl) {
-					throw new FS.ErrnoError(59);
-				}
-				return stream.stream_ops.ioctl(stream, cmd, arg);
-			},
-			readFile: function (path, opts) {
-				opts = opts || {};
-				opts.flags = opts.flags || 0;
-				opts.encoding = opts.encoding || 'binary';
-				if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
-					throw new Error('Invalid encoding type "' + opts.encoding + '"');
-				}
-				var ret;
-				var stream = FS.open(path, opts.flags);
-				var stat = FS.stat(path);
-				var length = stat.size;
-				var buf = new Uint8Array(length);
-				FS.read(stream, buf, 0, length, 0);
-				if (opts.encoding === 'utf8') {
-					ret = UTF8ArrayToString(buf, 0);
-				} else if (opts.encoding === 'binary') {
-					ret = buf;
-				}
-				FS.close(stream);
-				return ret;
-			},
-			writeFile: function (path, data, opts) {
-				opts = opts || {};
-				opts.flags = opts.flags || 577;
-				var stream = FS.open(path, opts.flags, opts.mode);
-				if (typeof data === 'string') {
-					var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
-					var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
-					FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);
-				} else if (ArrayBuffer.isView(data)) {
-					FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);
-				} else {
-					throw new Error('Unsupported data type');
-				}
-				FS.close(stream);
-			},
-			cwd: function () {
-				return FS.currentPath;
-			},
-			chdir: function (path) {
-				var lookup = FS.lookupPath(path, { follow: true });
-				if (lookup.node === null) {
-					throw new FS.ErrnoError(44);
-				}
-				if (!FS.isDir(lookup.node.mode)) {
-					throw new FS.ErrnoError(54);
-				}
-				var errCode = FS.nodePermissions(lookup.node, 'x');
-				if (errCode) {
-					throw new FS.ErrnoError(errCode);
-				}
-				FS.currentPath = lookup.path;
-			},
-			createDefaultDirectories: function () {
-				FS.mkdir('/tmp');
-				FS.mkdir('/home');
-				FS.mkdir('/home/web_user');
-			},
-			createDefaultDevices: function () {
-				FS.mkdir('/dev');
-				FS.registerDevice(FS.makedev(1, 3), {
-					read: function () {
-						return 0;
-					},
-					write: function (stream, buffer, offset, length, pos) {
-						return length;
-					}
-				});
-				FS.mkdev('/dev/null', FS.makedev(1, 3));
-				TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
-				TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
-				FS.mkdev('/dev/tty', FS.makedev(5, 0));
-				FS.mkdev('/dev/tty1', FS.makedev(6, 0));
-				var random_device = getRandomDevice();
-				FS.createDevice('/dev', 'random', random_device);
-				FS.createDevice('/dev', 'urandom', random_device);
-				FS.mkdir('/dev/shm');
-				FS.mkdir('/dev/shm/tmp');
-			},
-			createSpecialDirectories: function () {
-				FS.mkdir('/proc');
-				var proc_self = FS.mkdir('/proc/self');
-				FS.mkdir('/proc/self/fd');
-				FS.mount(
-					{
-						mount: function () {
-							var node = FS.createNode(proc_self, 'fd', 16384 | 511, 73);
-							node.node_ops = {
-								lookup: function (parent, name) {
-									var fd = +name;
-									var stream = FS.getStream(fd);
-									if (!stream) throw new FS.ErrnoError(8);
-									var ret = {
-										parent: null,
-										mount: { mountpoint: 'fake' },
-										node_ops: {
-											readlink: function () {
-												return stream.path;
-											}
-										}
-									};
-									ret.parent = ret;
-									return ret;
-								}
-							};
-							return node;
-						}
-					},
-					{},
-					'/proc/self/fd'
-				);
-			},
-			createStandardStreams: function () {
-				if (Module['stdin']) {
-					FS.createDevice('/dev', 'stdin', Module['stdin']);
-				} else {
-					FS.symlink('/dev/tty', '/dev/stdin');
-				}
-				if (Module['stdout']) {
-					FS.createDevice('/dev', 'stdout', null, Module['stdout']);
-				} else {
-					FS.symlink('/dev/tty', '/dev/stdout');
-				}
-				if (Module['stderr']) {
-					FS.createDevice('/dev', 'stderr', null, Module['stderr']);
-				} else {
-					FS.symlink('/dev/tty1', '/dev/stderr');
-				}
-				var stdin = FS.open('/dev/stdin', 0);
-				var stdout = FS.open('/dev/stdout', 1);
-				var stderr = FS.open('/dev/stderr', 1);
-			},
-			ensureErrnoError: function () {
-				if (FS.ErrnoError) return;
-				FS.ErrnoError = function ErrnoError(errno, node) {
-					this.node = node;
-					this.setErrno = function (errno) {
-						this.errno = errno;
-					};
-					this.setErrno(errno);
-					this.message = 'FS error';
-				};
-				FS.ErrnoError.prototype = new Error();
-				FS.ErrnoError.prototype.constructor = FS.ErrnoError;
-				[44].forEach(function (code) {
-					FS.genericErrors[code] = new FS.ErrnoError(code);
-					FS.genericErrors[code].stack = '<generic error, no stack>';
-				});
-			},
-			staticInit: function () {
-				FS.ensureErrnoError();
-				FS.nameTable = new Array(4096);
-				FS.mount(MEMFS, {}, '/');
-				FS.createDefaultDirectories();
-				FS.createDefaultDevices();
-				FS.createSpecialDirectories();
-				FS.filesystems = { MEMFS: MEMFS };
-			},
-			init: function (input, output, error) {
-				FS.init.initialized = true;
-				FS.ensureErrnoError();
-				Module['stdin'] = input || Module['stdin'];
-				Module['stdout'] = output || Module['stdout'];
-				Module['stderr'] = error || Module['stderr'];
-				FS.createStandardStreams();
-			},
-			quit: function () {
-				FS.init.initialized = false;
-				var fflush = Module['_fflush'];
-				if (fflush) fflush(0);
-				for (var i = 0; i < FS.streams.length; i++) {
-					var stream = FS.streams[i];
-					if (!stream) {
-						continue;
-					}
-					FS.close(stream);
-				}
-			},
-			getMode: function (canRead, canWrite) {
-				var mode = 0;
-				if (canRead) mode |= 292 | 73;
-				if (canWrite) mode |= 146;
-				return mode;
-			},
-			findObject: function (path, dontResolveLastLink) {
-				var ret = FS.analyzePath(path, dontResolveLastLink);
-				if (ret.exists) {
-					return ret.object;
-				} else {
-					return null;
-				}
-			},
-			analyzePath: function (path, dontResolveLastLink) {
-				try {
-					var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
-					path = lookup.path;
-				} catch (e) {}
-				var ret = {
-					isRoot: false,
-					exists: false,
-					error: 0,
-					name: null,
-					path: null,
-					object: null,
-					parentExists: false,
-					parentPath: null,
-					parentObject: null
-				};
-				try {
-					var lookup = FS.lookupPath(path, { parent: true });
-					ret.parentExists = true;
-					ret.parentPath = lookup.path;
-					ret.parentObject = lookup.node;
-					ret.name = PATH.basename(path);
-					lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
-					ret.exists = true;
-					ret.path = lookup.path;
-					ret.object = lookup.node;
-					ret.name = lookup.node.name;
-					ret.isRoot = lookup.path === '/';
-				} catch (e) {
-					ret.error = e.errno;
-				}
-				return ret;
-			},
-			createPath: function (parent, path, canRead, canWrite) {
-				parent = typeof parent === 'string' ? parent : FS.getPath(parent);
-				var parts = path.split('/').reverse();
-				while (parts.length) {
-					var part = parts.pop();
-					if (!part) continue;
-					var current = PATH.join2(parent, part);
-					try {
-						FS.mkdir(current);
-					} catch (e) {}
-					parent = current;
-				}
-				return current;
-			},
-			createFile: function (parent, name, properties, canRead, canWrite) {
-				var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
-				var mode = FS.getMode(canRead, canWrite);
-				return FS.create(path, mode);
-			},
-			createDataFile: function (parent, name, data, canRead, canWrite, canOwn) {
-				var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
-				var mode = FS.getMode(canRead, canWrite);
-				var node = FS.create(path, mode);
-				if (data) {
-					if (typeof data === 'string') {
-						var arr = new Array(data.length);
-						for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
-						data = arr;
-					}
-					FS.chmod(node, mode | 146);
-					var stream = FS.open(node, 577);
-					FS.write(stream, data, 0, data.length, 0, canOwn);
-					FS.close(stream);
-					FS.chmod(node, mode);
-				}
-				return node;
-			},
-			createDevice: function (parent, name, input, output) {
-				var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
-				var mode = FS.getMode(!!input, !!output);
-				if (!FS.createDevice.major) FS.createDevice.major = 64;
-				var dev = FS.makedev(FS.createDevice.major++, 0);
-				FS.registerDevice(dev, {
-					open: function (stream) {
-						stream.seekable = false;
-					},
-					close: function (stream) {
-						if (output && output.buffer && output.buffer.length) {
-							output(10);
-						}
-					},
-					read: function (stream, buffer, offset, length, pos) {
-						var bytesRead = 0;
-						for (var i = 0; i < length; i++) {
-							var result;
-							try {
-								result = input();
-							} catch (e) {
-								throw new FS.ErrnoError(29);
-							}
-							if (result === undefined && bytesRead === 0) {
-								throw new FS.ErrnoError(6);
-							}
-							if (result === null || result === undefined) break;
-							bytesRead++;
-							buffer[offset + i] = result;
-						}
-						if (bytesRead) {
-							stream.node.timestamp = Date.now();
-						}
-						return bytesRead;
-					},
-					write: function (stream, buffer, offset, length, pos) {
-						for (var i = 0; i < length; i++) {
-							try {
-								output(buffer[offset + i]);
-							} catch (e) {
-								throw new FS.ErrnoError(29);
-							}
-						}
-						if (length) {
-							stream.node.timestamp = Date.now();
-						}
-						return i;
-					}
-				});
-				return FS.mkdev(path, mode, dev);
-			},
-			forceLoadFile: function (obj) {
-				if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
-				if (typeof XMLHttpRequest !== 'undefined') {
-					throw new Error(
-						'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.'
-					);
-				} else if (read_) {
-					try {
-						obj.contents = intArrayFromString(read_(obj.url), true);
-						obj.usedBytes = obj.contents.length;
-					} catch (e) {
-						throw new FS.ErrnoError(29);
-					}
-				} else {
-					throw new Error('Cannot load without read() or XMLHttpRequest.');
-				}
-			},
-			createLazyFile: function (parent, name, url, canRead, canWrite) {
-				function LazyUint8Array() {
-					this.lengthKnown = false;
-					this.chunks = [];
-				}
-				LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
-					if (idx > this.length - 1 || idx < 0) {
-						return undefined;
-					}
-					var chunkOffset = idx % this.chunkSize;
-					var chunkNum = (idx / this.chunkSize) | 0;
-					return this.getter(chunkNum)[chunkOffset];
-				};
-				LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
-					this.getter = getter;
-				};
-				LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
-					var xhr = new XMLHttpRequest();
-					xhr.open('HEAD', url, false);
-					xhr.send(null);
-					if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))
-						throw new Error("Couldn't load " + url + '. Status: ' + xhr.status);
-					var datalength = Number(xhr.getResponseHeader('Content-length'));
-					var header;
-					var hasByteServing = (header = xhr.getResponseHeader('Accept-Ranges')) && header === 'bytes';
-					var usesGzip = (header = xhr.getResponseHeader('Content-Encoding')) && header === 'gzip';
-					var chunkSize = 1024 * 1024;
-					if (!hasByteServing) chunkSize = datalength;
-					var doXHR = function (from, to) {
-						if (from > to) throw new Error('invalid range (' + from + ', ' + to + ') or no bytes requested!');
-						if (to > datalength - 1) throw new Error('only ' + datalength + ' bytes available! programmer error!');
-						var xhr = new XMLHttpRequest();
-						xhr.open('GET', url, false);
-						if (datalength !== chunkSize) xhr.setRequestHeader('Range', 'bytes=' + from + '-' + to);
-						if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
-						if (xhr.overrideMimeType) {
-							xhr.overrideMimeType('text/plain; charset=x-user-defined');
-						}
-						xhr.send(null);
-						if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))
-							throw new Error("Couldn't load " + url + '. Status: ' + xhr.status);
-						if (xhr.response !== undefined) {
-							return new Uint8Array(xhr.response || []);
-						} else {
-							return intArrayFromString(xhr.responseText || '', true);
-						}
-					};
-					var lazyArray = this;
-					lazyArray.setDataGetter(function (chunkNum) {
-						var start = chunkNum * chunkSize;
-						var end = (chunkNum + 1) * chunkSize - 1;
-						end = Math.min(end, datalength - 1);
-						if (typeof lazyArray.chunks[chunkNum] === 'undefined') {
-							lazyArray.chunks[chunkNum] = doXHR(start, end);
-						}
-						if (typeof lazyArray.chunks[chunkNum] === 'undefined') throw new Error('doXHR failed!');
-						return lazyArray.chunks[chunkNum];
-					});
-					if (usesGzip || !datalength) {
-						chunkSize = datalength = 1;
-						datalength = this.getter(0).length;
-						chunkSize = datalength;
-						out('LazyFiles on gzip forces download of the whole file when length is accessed');
-					}
-					this._length = datalength;
-					this._chunkSize = chunkSize;
-					this.lengthKnown = true;
-				};
-				if (typeof XMLHttpRequest !== 'undefined') {
-					if (!ENVIRONMENT_IS_WORKER)
-						throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
-					var lazyArray = new LazyUint8Array();
-					Object.defineProperties(lazyArray, {
-						length: {
-							get: function () {
-								if (!this.lengthKnown) {
-									this.cacheLength();
-								}
-								return this._length;
-							}
-						},
-						chunkSize: {
-							get: function () {
-								if (!this.lengthKnown) {
-									this.cacheLength();
-								}
-								return this._chunkSize;
-							}
-						}
-					});
-					var properties = { isDevice: false, contents: lazyArray };
-				} else {
-					var properties = { isDevice: false, url: url };
-				}
-				var node = FS.createFile(parent, name, properties, canRead, canWrite);
-				if (properties.contents) {
-					node.contents = properties.contents;
-				} else if (properties.url) {
-					node.contents = null;
-					node.url = properties.url;
-				}
-				Object.defineProperties(node, {
-					usedBytes: {
-						get: function () {
-							return this.contents.length;
-						}
-					}
-				});
-				var stream_ops = {};
-				var keys = Object.keys(node.stream_ops);
-				keys.forEach(function (key) {
-					var fn = node.stream_ops[key];
-					stream_ops[key] = function forceLoadLazyFile() {
-						FS.forceLoadFile(node);
-						return fn.apply(null, arguments);
-					};
-				});
-				stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
-					FS.forceLoadFile(node);
-					var contents = stream.node.contents;
-					if (position >= contents.length) return 0;
-					var size = Math.min(contents.length - position, length);
-					if (contents.slice) {
-						for (var i = 0; i < size; i++) {
-							buffer[offset + i] = contents[position + i];
-						}
-					} else {
-						for (var i = 0; i < size; i++) {
-							buffer[offset + i] = contents.get(position + i);
-						}
-					}
-					return size;
-				};
-				node.stream_ops = stream_ops;
-				return node;
-			},
-			createPreloadedFile: function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
-				Browser.init();
-				var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
-				var dep = getUniqueRunDependency('cp ' + fullname);
-				function processData(byteArray) {
-					function finish(byteArray) {
-						if (preFinish) preFinish();
-						if (!dontCreateFile) {
-							FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
-						}
-						if (onload) onload();
-						removeRunDependency(dep);
-					}
-					var handled = false;
-					Module['preloadPlugins'].forEach(function (plugin) {
-						if (handled) return;
-						if (plugin['canHandle'](fullname)) {
-							plugin['handle'](byteArray, fullname, finish, function () {
-								if (onerror) onerror();
-								removeRunDependency(dep);
-							});
-							handled = true;
-						}
-					});
-					if (!handled) finish(byteArray);
-				}
-				addRunDependency(dep);
-				if (typeof url == 'string') {
-					asyncLoad(
-						url,
-						function (byteArray) {
-							processData(byteArray);
-						},
-						onerror
-					);
-				} else {
-					processData(url);
-				}
-			},
-			indexedDB: function () {
-				return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
-			},
-			DB_NAME: function () {
-				return 'EM_FS_' + window.location.pathname;
-			},
-			DB_VERSION: 20,
-			DB_STORE_NAME: 'FILE_DATA',
-			saveFilesToDB: function (paths, onload, onerror) {
-				onload = onload || function () {};
-				onerror = onerror || function () {};
-				var indexedDB = FS.indexedDB();
-				try {
-					var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
-				} catch (e) {
-					return onerror(e);
-				}
-				openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
-					out('creating db');
-					var db = openRequest.result;
-					db.createObjectStore(FS.DB_STORE_NAME);
-				};
-				openRequest.onsuccess = function openRequest_onsuccess() {
-					var db = openRequest.result;
-					var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
-					var files = transaction.objectStore(FS.DB_STORE_NAME);
-					var ok = 0,
-						fail = 0,
-						total = paths.length;
-					function finish() {
-						if (fail == 0) onload();
-						else onerror();
-					}
-					paths.forEach(function (path) {
-						var putRequest = files.put(FS.analyzePath(path).object.contents, path);
-						putRequest.onsuccess = function putRequest_onsuccess() {
-							ok++;
-							if (ok + fail == total) finish();
-						};
-						putRequest.onerror = function putRequest_onerror() {
-							fail++;
-							if (ok + fail == total) finish();
-						};
-					});
-					transaction.onerror = onerror;
-				};
-				openRequest.onerror = onerror;
-			},
-			loadFilesFromDB: function (paths, onload, onerror) {
-				onload = onload || function () {};
-				onerror = onerror || function () {};
-				var indexedDB = FS.indexedDB();
-				try {
-					var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
-				} catch (e) {
-					return onerror(e);
-				}
-				openRequest.onupgradeneeded = onerror;
-				openRequest.onsuccess = function openRequest_onsuccess() {
-					var db = openRequest.result;
-					try {
-						var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
-					} catch (e) {
-						onerror(e);
-						return;
-					}
-					var files = transaction.objectStore(FS.DB_STORE_NAME);
-					var ok = 0,
-						fail = 0,
-						total = paths.length;
-					function finish() {
-						if (fail == 0) onload();
-						else onerror();
-					}
-					paths.forEach(function (path) {
-						var getRequest = files.get(path);
-						getRequest.onsuccess = function getRequest_onsuccess() {
-							if (FS.analyzePath(path).exists) {
-								FS.unlink(path);
-							}
-							FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
-							ok++;
-							if (ok + fail == total) finish();
-						};
-						getRequest.onerror = function getRequest_onerror() {
-							fail++;
-							if (ok + fail == total) finish();
-						};
-					});
-					transaction.onerror = onerror;
-				};
-				openRequest.onerror = onerror;
-			}
-		};
-		var SYSCALLS = {
-			mappings: {},
-			DEFAULT_POLLMASK: 5,
-			calculateAt: function (dirfd, path, allowEmpty) {
-				if (path[0] === '/') {
-					return path;
-				}
-				var dir;
-				if (dirfd === -100) {
-					dir = FS.cwd();
-				} else {
-					var dirstream = FS.getStream(dirfd);
-					if (!dirstream) throw new FS.ErrnoError(8);
-					dir = dirstream.path;
-				}
-				if (path.length == 0) {
-					if (!allowEmpty) {
-						throw new FS.ErrnoError(44);
-					}
-					return dir;
-				}
-				return PATH.join2(dir, path);
-			},
-			doStat: function (func, path, buf) {
-				try {
-					var stat = func(path);
-				} catch (e) {
-					if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
-						return -54;
-					}
-					throw e;
-				}
-				HEAP32[buf >> 2] = stat.dev;
-				HEAP32[(buf + 4) >> 2] = 0;
-				HEAP32[(buf + 8) >> 2] = stat.ino;
-				HEAP32[(buf + 12) >> 2] = stat.mode;
-				HEAP32[(buf + 16) >> 2] = stat.nlink;
-				HEAP32[(buf + 20) >> 2] = stat.uid;
-				HEAP32[(buf + 24) >> 2] = stat.gid;
-				HEAP32[(buf + 28) >> 2] = stat.rdev;
-				HEAP32[(buf + 32) >> 2] = 0;
-				(tempI64 = [
-					stat.size >>> 0,
-					((tempDouble = stat.size),
-					+Math.abs(tempDouble) >= 1
-						? tempDouble > 0
-							? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0
-							: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0
-						: 0)
-				]),
-					(HEAP32[(buf + 40) >> 2] = tempI64[0]),
-					(HEAP32[(buf + 44) >> 2] = tempI64[1]);
-				HEAP32[(buf + 48) >> 2] = 4096;
-				HEAP32[(buf + 52) >> 2] = stat.blocks;
-				HEAP32[(buf + 56) >> 2] = (stat.atime.getTime() / 1e3) | 0;
-				HEAP32[(buf + 60) >> 2] = 0;
-				HEAP32[(buf + 64) >> 2] = (stat.mtime.getTime() / 1e3) | 0;
-				HEAP32[(buf + 68) >> 2] = 0;
-				HEAP32[(buf + 72) >> 2] = (stat.ctime.getTime() / 1e3) | 0;
-				HEAP32[(buf + 76) >> 2] = 0;
-				(tempI64 = [
-					stat.ino >>> 0,
-					((tempDouble = stat.ino),
-					+Math.abs(tempDouble) >= 1
-						? tempDouble > 0
-							? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0
-							: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0
-						: 0)
-				]),
-					(HEAP32[(buf + 80) >> 2] = tempI64[0]),
-					(HEAP32[(buf + 84) >> 2] = tempI64[1]);
-				return 0;
-			},
-			doMsync: function (addr, stream, len, flags, offset) {
-				var buffer = HEAPU8.slice(addr, addr + len);
-				FS.msync(stream, buffer, offset, len, flags);
-			},
-			doMkdir: function (path, mode) {
-				path = PATH.normalize(path);
-				if (path[path.length - 1] === '/') path = path.substr(0, path.length - 1);
-				FS.mkdir(path, mode, 0);
-				return 0;
-			},
-			doMknod: function (path, mode, dev) {
-				switch (mode & 61440) {
-					case 32768:
-					case 8192:
-					case 24576:
-					case 4096:
-					case 49152:
-						break;
-					default:
-						return -28;
-				}
-				FS.mknod(path, mode, dev);
-				return 0;
-			},
-			doReadlink: function (path, buf, bufsize) {
-				if (bufsize <= 0) return -28;
-				var ret = FS.readlink(path);
-				var len = Math.min(bufsize, lengthBytesUTF8(ret));
-				var endChar = HEAP8[buf + len];
-				stringToUTF8(ret, buf, bufsize + 1);
-				HEAP8[buf + len] = endChar;
-				return len;
-			},
-			doAccess: function (path, amode) {
-				if (amode & ~7) {
-					return -28;
-				}
-				var node;
-				var lookup = FS.lookupPath(path, { follow: true });
-				node = lookup.node;
-				if (!node) {
-					return -44;
-				}
-				var perms = '';
-				if (amode & 4) perms += 'r';
-				if (amode & 2) perms += 'w';
-				if (amode & 1) perms += 'x';
-				if (perms && FS.nodePermissions(node, perms)) {
-					return -2;
-				}
-				return 0;
-			},
-			doDup: function (path, flags, suggestFD) {
-				var suggest = FS.getStream(suggestFD);
-				if (suggest) FS.close(suggest);
-				return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
-			},
-			doReadv: function (stream, iov, iovcnt, offset) {
-				var ret = 0;
-				for (var i = 0; i < iovcnt; i++) {
-					var ptr = HEAP32[(iov + i * 8) >> 2];
-					var len = HEAP32[(iov + (i * 8 + 4)) >> 2];
-					var curr = FS.read(stream, HEAP8, ptr, len, offset);
-					if (curr < 0) return -1;
-					ret += curr;
-					if (curr < len) break;
-				}
-				return ret;
-			},
-			doWritev: function (stream, iov, iovcnt, offset) {
-				var ret = 0;
-				for (var i = 0; i < iovcnt; i++) {
-					var ptr = HEAP32[(iov + i * 8) >> 2];
-					var len = HEAP32[(iov + (i * 8 + 4)) >> 2];
-					var curr = FS.write(stream, HEAP8, ptr, len, offset);
-					if (curr < 0) return -1;
-					ret += curr;
-				}
-				return ret;
-			},
-			varargs: undefined,
-			get: function () {
-				SYSCALLS.varargs += 4;
-				var ret = HEAP32[(SYSCALLS.varargs - 4) >> 2];
-				return ret;
-			},
-			getStr: function (ptr) {
-				var ret = UTF8ToString(ptr);
-				return ret;
-			},
-			getStreamFromFD: function (fd) {
-				var stream = FS.getStream(fd);
-				if (!stream) throw new FS.ErrnoError(8);
-				return stream;
-			},
-			get64: function (low, high) {
-				return low;
-			}
-		};
-		function _environ_get(__environ, environ_buf) {
-			var bufSize = 0;
-			getEnvStrings().forEach(function (string, i) {
-				var ptr = environ_buf + bufSize;
-				HEAP32[(__environ + i * 4) >> 2] = ptr;
-				writeAsciiToMemory(string, ptr);
-				bufSize += string.length + 1;
-			});
-			return 0;
-		}
-		function _environ_sizes_get(penviron_count, penviron_buf_size) {
-			var strings = getEnvStrings();
-			HEAP32[penviron_count >> 2] = strings.length;
-			var bufSize = 0;
-			strings.forEach(function (string) {
-				bufSize += string.length + 1;
-			});
-			HEAP32[penviron_buf_size >> 2] = bufSize;
-			return 0;
-		}
-		function _fd_close(fd) {
-			try {
-				var stream = SYSCALLS.getStreamFromFD(fd);
-				FS.close(stream);
-				return 0;
-			} catch (e) {
-				if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-				return e.errno;
-			}
-		}
-		function _fd_read(fd, iov, iovcnt, pnum) {
-			try {
-				var stream = SYSCALLS.getStreamFromFD(fd);
-				var num = SYSCALLS.doReadv(stream, iov, iovcnt);
-				HEAP32[pnum >> 2] = num;
-				return 0;
-			} catch (e) {
-				if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-				return e.errno;
-			}
-		}
-		function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
-			try {
-				var stream = SYSCALLS.getStreamFromFD(fd);
-				var HIGH_OFFSET = 4294967296;
-				var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0);
-				var DOUBLE_LIMIT = 9007199254740992;
-				if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) {
-					return -61;
-				}
-				FS.llseek(stream, offset, whence);
-				(tempI64 = [
-					stream.position >>> 0,
-					((tempDouble = stream.position),
-					+Math.abs(tempDouble) >= 1
-						? tempDouble > 0
-							? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0
-							: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0
-						: 0)
-				]),
-					(HEAP32[newOffset >> 2] = tempI64[0]),
-					(HEAP32[(newOffset + 4) >> 2] = tempI64[1]);
-				if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null;
-				return 0;
-			} catch (e) {
-				if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-				return e.errno;
-			}
-		}
-		function _fd_write(fd, iov, iovcnt, pnum) {
-			try {
-				var stream = SYSCALLS.getStreamFromFD(fd);
-				var num = SYSCALLS.doWritev(stream, iov, iovcnt);
-				HEAP32[pnum >> 2] = num;
-				return 0;
-			} catch (e) {
-				if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-				return e.errno;
-			}
-		}
-		function _setTempRet0(val) {
-			setTempRet0(val);
-		}
-		function __isLeapYear(year) {
-			return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
-		}
-		function __arraySum(array, index) {
-			var sum = 0;
-			for (var i = 0; i <= index; sum += array[i++]) {}
-			return sum;
-		}
-		var __MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
-		var __MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
-		function __addDays(date, days) {
-			var newDate = new Date(date.getTime());
-			while (days > 0) {
-				var leap = __isLeapYear(newDate.getFullYear());
-				var currentMonth = newDate.getMonth();
-				var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];
-				if (days > daysInCurrentMonth - newDate.getDate()) {
-					days -= daysInCurrentMonth - newDate.getDate() + 1;
-					newDate.setDate(1);
-					if (currentMonth < 11) {
-						newDate.setMonth(currentMonth + 1);
-					} else {
-						newDate.setMonth(0);
-						newDate.setFullYear(newDate.getFullYear() + 1);
-					}
-				} else {
-					newDate.setDate(newDate.getDate() + days);
-					return newDate;
-				}
-			}
-			return newDate;
-		}
-		function _strftime(s, maxsize, format, tm) {
-			var tm_zone = HEAP32[(tm + 40) >> 2];
-			var date = {
-				tm_sec: HEAP32[tm >> 2],
-				tm_min: HEAP32[(tm + 4) >> 2],
-				tm_hour: HEAP32[(tm + 8) >> 2],
-				tm_mday: HEAP32[(tm + 12) >> 2],
-				tm_mon: HEAP32[(tm + 16) >> 2],
-				tm_year: HEAP32[(tm + 20) >> 2],
-				tm_wday: HEAP32[(tm + 24) >> 2],
-				tm_yday: HEAP32[(tm + 28) >> 2],
-				tm_isdst: HEAP32[(tm + 32) >> 2],
-				tm_gmtoff: HEAP32[(tm + 36) >> 2],
-				tm_zone: tm_zone ? UTF8ToString(tm_zone) : ''
-			};
-			var pattern = UTF8ToString(format);
-			var EXPANSION_RULES_1 = {
-				'%c': '%a %b %d %H:%M:%S %Y',
-				'%D': '%m/%d/%y',
-				'%F': '%Y-%m-%d',
-				'%h': '%b',
-				'%r': '%I:%M:%S %p',
-				'%R': '%H:%M',
-				'%T': '%H:%M:%S',
-				'%x': '%m/%d/%y',
-				'%X': '%H:%M:%S',
-				'%Ec': '%c',
-				'%EC': '%C',
-				'%Ex': '%m/%d/%y',
-				'%EX': '%H:%M:%S',
-				'%Ey': '%y',
-				'%EY': '%Y',
-				'%Od': '%d',
-				'%Oe': '%e',
-				'%OH': '%H',
-				'%OI': '%I',
-				'%Om': '%m',
-				'%OM': '%M',
-				'%OS': '%S',
-				'%Ou': '%u',
-				'%OU': '%U',
-				'%OV': '%V',
-				'%Ow': '%w',
-				'%OW': '%W',
-				'%Oy': '%y'
-			};
-			for (var rule in EXPANSION_RULES_1) {
-				pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]);
-			}
-			var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
-			var MONTHS = [
-				'January',
-				'February',
-				'March',
-				'April',
-				'May',
-				'June',
-				'July',
-				'August',
-				'September',
-				'October',
-				'November',
-				'December'
-			];
-			function leadingSomething(value, digits, character) {
-				var str = typeof value === 'number' ? value.toString() : value || '';
-				while (str.length < digits) {
-					str = character[0] + str;
-				}
-				return str;
-			}
-			function leadingNulls(value, digits) {
-				return leadingSomething(value, digits, '0');
-			}
-			function compareByDay(date1, date2) {
-				function sgn(value) {
-					return value < 0 ? -1 : value > 0 ? 1 : 0;
-				}
-				var compare;
-				if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) {
-					if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) {
-						compare = sgn(date1.getDate() - date2.getDate());
-					}
-				}
-				return compare;
-			}
-			function getFirstWeekStartDate(janFourth) {
-				switch (janFourth.getDay()) {
-					case 0:
-						return new Date(janFourth.getFullYear() - 1, 11, 29);
-					case 1:
-						return janFourth;
-					case 2:
-						return new Date(janFourth.getFullYear(), 0, 3);
-					case 3:
-						return new Date(janFourth.getFullYear(), 0, 2);
-					case 4:
-						return new Date(janFourth.getFullYear(), 0, 1);
-					case 5:
-						return new Date(janFourth.getFullYear() - 1, 11, 31);
-					case 6:
-						return new Date(janFourth.getFullYear() - 1, 11, 30);
-				}
-			}
-			function getWeekBasedYear(date) {
-				var thisDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday);
-				var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
-				var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4);
-				var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
-				var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
-				if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
-					if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
-						return thisDate.getFullYear() + 1;
-					} else {
-						return thisDate.getFullYear();
-					}
-				} else {
-					return thisDate.getFullYear() - 1;
-				}
-			}
-			var EXPANSION_RULES_2 = {
-				'%a': function (date) {
-					return WEEKDAYS[date.tm_wday].substring(0, 3);
-				},
-				'%A': function (date) {
-					return WEEKDAYS[date.tm_wday];
-				},
-				'%b': function (date) {
-					return MONTHS[date.tm_mon].substring(0, 3);
-				},
-				'%B': function (date) {
-					return MONTHS[date.tm_mon];
-				},
-				'%C': function (date) {
-					var year = date.tm_year + 1900;
-					return leadingNulls((year / 100) | 0, 2);
-				},
-				'%d': function (date) {
-					return leadingNulls(date.tm_mday, 2);
-				},
-				'%e': function (date) {
-					return leadingSomething(date.tm_mday, 2, ' ');
-				},
-				'%g': function (date) {
-					return getWeekBasedYear(date).toString().substring(2);
-				},
-				'%G': function (date) {
-					return getWeekBasedYear(date);
-				},
-				'%H': function (date) {
-					return leadingNulls(date.tm_hour, 2);
-				},
-				'%I': function (date) {
-					var twelveHour = date.tm_hour;
-					if (twelveHour == 0) twelveHour = 12;
-					else if (twelveHour > 12) twelveHour -= 12;
-					return leadingNulls(twelveHour, 2);
-				},
-				'%j': function (date) {
-					return leadingNulls(
-						date.tm_mday + __arraySum(__isLeapYear(date.tm_year + 1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon - 1),
-						3
-					);
-				},
-				'%m': function (date) {
-					return leadingNulls(date.tm_mon + 1, 2);
-				},
-				'%M': function (date) {
-					return leadingNulls(date.tm_min, 2);
-				},
-				'%n': function () {
-					return '\n';
-				},
-				'%p': function (date) {
-					if (date.tm_hour >= 0 && date.tm_hour < 12) {
-						return 'AM';
-					} else {
-						return 'PM';
-					}
-				},
-				'%S': function (date) {
-					return leadingNulls(date.tm_sec, 2);
-				},
-				'%t': function () {
-					return '\t';
-				},
-				'%u': function (date) {
-					return date.tm_wday || 7;
-				},
-				'%U': function (date) {
-					var janFirst = new Date(date.tm_year + 1900, 0, 1);
-					var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7 - janFirst.getDay());
-					var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday);
-					if (compareByDay(firstSunday, endDate) < 0) {
-						var februaryFirstUntilEndMonth =
-							__arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
-						var firstSundayUntilEndJanuary = 31 - firstSunday.getDate();
-						var days = firstSundayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
-						return leadingNulls(Math.ceil(days / 7), 2);
-					}
-					return compareByDay(firstSunday, janFirst) === 0 ? '01' : '00';
-				},
-				'%V': function (date) {
-					var janFourthThisYear = new Date(date.tm_year + 1900, 0, 4);
-					var janFourthNextYear = new Date(date.tm_year + 1901, 0, 4);
-					var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
-					var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
-					var endDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday);
-					if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
-						return '53';
-					}
-					if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
-						return '01';
-					}
-					var daysDifference;
-					if (firstWeekStartThisYear.getFullYear() < date.tm_year + 1900) {
-						daysDifference = date.tm_yday + 32 - firstWeekStartThisYear.getDate();
-					} else {
-						daysDifference = date.tm_yday + 1 - firstWeekStartThisYear.getDate();
-					}
-					return leadingNulls(Math.ceil(daysDifference / 7), 2);
-				},
-				'%w': function (date) {
-					return date.tm_wday;
-				},
-				'%W': function (date) {
-					var janFirst = new Date(date.tm_year, 0, 1);
-					var firstMonday =
-						janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1);
-					var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday);
-					if (compareByDay(firstMonday, endDate) < 0) {
-						var februaryFirstUntilEndMonth =
-							__arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
-						var firstMondayUntilEndJanuary = 31 - firstMonday.getDate();
-						var days = firstMondayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
-						return leadingNulls(Math.ceil(days / 7), 2);
-					}
-					return compareByDay(firstMonday, janFirst) === 0 ? '01' : '00';
-				},
-				'%y': function (date) {
-					return (date.tm_year + 1900).toString().substring(2);
-				},
-				'%Y': function (date) {
-					return date.tm_year + 1900;
-				},
-				'%z': function (date) {
-					var off = date.tm_gmtoff;
-					var ahead = off >= 0;
-					off = Math.abs(off) / 60;
-					off = (off / 60) * 100 + (off % 60);
-					return (ahead ? '+' : '-') + String('0000' + off).slice(-4);
-				},
-				'%Z': function (date) {
-					return date.tm_zone;
-				},
-				'%%': function () {
-					return '%';
-				}
-			};
-			for (var rule in EXPANSION_RULES_2) {
-				if (pattern.includes(rule)) {
-					pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date));
-				}
-			}
-			var bytes = intArrayFromString(pattern, false);
-			if (bytes.length > maxsize) {
-				return 0;
-			}
-			writeArrayToMemory(bytes, s);
-			return bytes.length - 1;
-		}
-		function _strftime_l(s, maxsize, format, tm) {
-			return _strftime(s, maxsize, format, tm);
-		}
-		InternalError = Module['InternalError'] = extendError(Error, 'InternalError');
-		embind_init_charCodes();
-		BindingError = Module['BindingError'] = extendError(Error, 'BindingError');
-		init_ClassHandle();
-		init_RegisteredPointer();
-		init_embind();
-		UnboundTypeError = Module['UnboundTypeError'] = extendError(Error, 'UnboundTypeError');
-		init_emval();
-		var FSNode = function (parent, name, mode, rdev) {
-			if (!parent) {
-				parent = this;
-			}
-			this.parent = parent;
-			this.mount = parent.mount;
-			this.mounted = null;
-			this.id = FS.nextInode++;
-			this.name = name;
-			this.mode = mode;
-			this.node_ops = {};
-			this.stream_ops = {};
-			this.rdev = rdev;
-		};
-		var readMode = 292 | 73;
-		var writeMode = 146;
-		Object.defineProperties(FSNode.prototype, {
-			read: {
-				get: function () {
-					return (this.mode & readMode) === readMode;
-				},
-				set: function (val) {
-					val ? (this.mode |= readMode) : (this.mode &= ~readMode);
-				}
-			},
-			write: {
-				get: function () {
-					return (this.mode & writeMode) === writeMode;
-				},
-				set: function (val) {
-					val ? (this.mode |= writeMode) : (this.mode &= ~writeMode);
-				}
-			},
-			isFolder: {
-				get: function () {
-					return FS.isDir(this.mode);
-				}
-			},
-			isDevice: {
-				get: function () {
-					return FS.isChrdev(this.mode);
-				}
-			}
-		});
-		FS.FSNode = FSNode;
-		FS.staticInit();
-		function intArrayFromString(stringy, dontAddNull, length) {
-			var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
-			var u8array = new Array(len);
-			var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
-			if (dontAddNull) u8array.length = numBytesWritten;
-			return u8array;
-		}
-		var asmLibraryArg = {
-			d: ___cxa_allocate_exception,
-			e: ___cxa_throw,
-			n: __embind_finalize_value_array,
-			p: __embind_finalize_value_object,
-			y: __embind_register_bigint,
-			I: __embind_register_bool,
-			h: __embind_register_class,
-			g: __embind_register_class_constructor,
-			c: __embind_register_class_function,
-			r: __embind_register_class_property,
-			H: __embind_register_emval,
-			q: __embind_register_enum,
-			i: __embind_register_enum_value,
-			v: __embind_register_float,
-			a: __embind_register_function,
-			k: __embind_register_integer,
-			j: __embind_register_memory_view,
-			w: __embind_register_std_string,
-			t: __embind_register_std_wstring,
-			o: __embind_register_value_array,
-			b: __embind_register_value_array_element,
-			m: __embind_register_value_object,
-			f: __embind_register_value_object_field,
-			J: __embind_register_void,
-			K: __emval_decref,
-			L: __emval_incref,
-			l: __emval_take_value,
-			u: _abort,
-			A: _emscripten_memcpy_big,
-			s: _emscripten_resize_heap,
-			C: _environ_get,
-			D: _environ_sizes_get,
-			G: _fd_close,
-			E: _fd_read,
-			x: _fd_seek,
-			F: _fd_write,
-			z: _setTempRet0,
-			B: _strftime_l
-		};
-		var asm = createWasm();
-		var ___wasm_call_ctors = (Module['___wasm_call_ctors'] = function () {
-			return (___wasm_call_ctors = Module['___wasm_call_ctors'] = Module['asm']['N']).apply(null, arguments);
-		});
-		var _malloc = (Module['_malloc'] = function () {
-			return (_malloc = Module['_malloc'] = Module['asm']['P']).apply(null, arguments);
-		});
-		var _free = (Module['_free'] = function () {
-			return (_free = Module['_free'] = Module['asm']['Q']).apply(null, arguments);
-		});
-		var ___getTypeName = (Module['___getTypeName'] = function () {
-			return (___getTypeName = Module['___getTypeName'] = Module['asm']['R']).apply(null, arguments);
-		});
-		var ___embind_register_native_and_builtin_types = (Module['___embind_register_native_and_builtin_types'] = function () {
-			return (___embind_register_native_and_builtin_types = Module['___embind_register_native_and_builtin_types'] =
-				Module['asm']['S']).apply(null, arguments);
-		});
-		var stackSave = (Module['stackSave'] = function () {
-			return (stackSave = Module['stackSave'] = Module['asm']['T']).apply(null, arguments);
-		});
-		var stackRestore = (Module['stackRestore'] = function () {
-			return (stackRestore = Module['stackRestore'] = Module['asm']['U']).apply(null, arguments);
-		});
-		var stackAlloc = (Module['stackAlloc'] = function () {
-			return (stackAlloc = Module['stackAlloc'] = Module['asm']['V']).apply(null, arguments);
-		});
-		var dynCall_jiji = (Module['dynCall_jiji'] = function () {
-			return (dynCall_jiji = Module['dynCall_jiji'] = Module['asm']['W']).apply(null, arguments);
-		});
-		var dynCall_iiiiij = (Module['dynCall_iiiiij'] = function () {
-			return (dynCall_iiiiij = Module['dynCall_iiiiij'] = Module['asm']['X']).apply(null, arguments);
-		});
-		var dynCall_iiiiijj = (Module['dynCall_iiiiijj'] = function () {
-			return (dynCall_iiiiijj = Module['dynCall_iiiiijj'] = Module['asm']['Y']).apply(null, arguments);
-		});
-		var dynCall_iiiiiijj = (Module['dynCall_iiiiiijj'] = function () {
-			return (dynCall_iiiiiijj = Module['dynCall_iiiiiijj'] = Module['asm']['Z']).apply(null, arguments);
-		});
-		var dynCall_viijii = (Module['dynCall_viijii'] = function () {
-			return (dynCall_viijii = Module['dynCall_viijii'] = Module['asm']['_']).apply(null, arguments);
-		});
-		Module['ccall'] = ccall;
-		var calledRun;
-		dependenciesFulfilled = function runCaller() {
-			if (!calledRun) run();
-			if (!calledRun) dependenciesFulfilled = runCaller;
-		};
-		function run(args) {
-			args = args || arguments_;
-			if (runDependencies > 0) {
-				return;
-			}
-			preRun();
-			if (runDependencies > 0) {
-				return;
-			}
-			function doRun() {
-				if (calledRun) return;
-				calledRun = true;
-				Module['calledRun'] = true;
-				if (ABORT) return;
-				initRuntime();
-				readyPromiseResolve(Module);
-				if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
-				postRun();
-			}
-			if (Module['setStatus']) {
-				Module['setStatus']('Running...');
-				setTimeout(function () {
-					setTimeout(function () {
-						Module['setStatus']('');
-					}, 1);
-					doRun();
-				}, 1);
-			} else {
-				doRun();
-			}
-		}
-		Module['run'] = run;
-		if (Module['preInit']) {
-			if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
-			while (Module['preInit'].length > 0) {
-				Module['preInit'].pop()();
-			}
-		}
-		run();
-		return Module.ready;
-	};
-})();
-export default Module;

BIN
docs/site/static/assets/3d/process.wasm


BIN
docs/site/static/assets/3d/scene.splinecode


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 55106
docs/site/static/assets/3d/viewer.js


BIN
docs/site/static/assets/images/3D-design-dark.png


BIN
docs/site/static/assets/images/3D-design.png


BIN
docs/site/static/assets/images/3D-fast-dark.png


BIN
docs/site/static/assets/images/3D-fast.png


BIN
docs/site/static/assets/images/3D-simple-dark.png


BIN
docs/site/static/assets/images/3D-simple.png


BIN
docs/site/static/assets/images/3D-thin-dark.png


BIN
docs/site/static/assets/images/3D-thin.png


BIN
docs/site/static/assets/images/home/avatar_1.jpg


BIN
docs/site/static/assets/images/home/d.jpeg


BIN
docs/site/static/assets/images/home/dota_小牛.png


BIN
docs/site/static/assets/images/home/dota_火枪.png


BIN
docs/site/static/assets/images/home/f.jpeg


BIN
docs/site/static/assets/images/home/s.jpeg


BIN
docs/site/static/assets/images/home/t.jpeg


BIN
docs/site/static/assets/images/home/wall_1.jpg


BIN
docs/site/static/assets/images/home/wall_2.jpg


BIN
docs/site/static/assets/images/home/wall_3.jpg


BIN
docs/site/static/assets/images/home/wall_4.jpg


+ 7 - 1
docs/site/vite.config.ts

@@ -2,9 +2,15 @@ import { sveltekit } from '@sveltejs/kit/vite';
 import { defineConfig } from 'vite';
 import tailwindcss from '@tailwindcss/vite';
 import md from 'rollup-plugin-md-ts';
+import svgSprite from 'rollup-plugin-stdf-icon';
 
 export default defineConfig({
-	plugins: [sveltekit(), tailwindcss(), md({ marked: {}, include: ['../mds/**/*.md', '../../packages/**/*.md'] })],
+	plugins: [
+		sveltekit(),
+		tailwindcss(),
+		md({ marked: {}, include: ['../mds/**/*.md', '../../packages/**/*.md'] }),
+		svgSprite([{ inFile: 'src/lib/symbol', outFile: 'static/fonts', fileName: 'symbol' }])
+	],
 	server: { hmr: true, host: '0.0.0.0', port: 5555 },
 	build: { assetsDir: 'build' }
 });

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff