diff options
27 files changed, 419 insertions, 2243 deletions
diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..dbef169 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 rokcso + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/content/_index.md b/content/_index.md index 3789b88..43d6935 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,5 +1,8 @@ --- title: "映屿" --- +关于技术、互联网、书籍、生活琐事以及那些一闪而过的念头。 + +### 最近更新 {{< recent-posts >}} diff --git a/content/about.md b/content/about.md index 9c83e5d..7e39f69 100644 --- a/content/about.md +++ b/content/about.md @@ -6,58 +6,41 @@ showMeta: false --- ## 常见问题 -<div class="faq"> +### 这个网站用了什么技术? -<details> -<summary>为什么不开评论区?</summary> +我在本地用 Emacs 写作,使用 Hugo 生成 HTML 文件,推送到[源码仓库](https://git.verdant.ee/blog.git/),静态页面部署在 Github Pages 上。 -本站从 2026 年 2 月 25 日 起关闭了评论区,不是因为垃圾评论,也不是因为恶意评论,只是因为我不擅长回应评论,虽然留下评论的人不多,但每次遇到评论,即使是一行简单的夸奖,我都会坐在屏幕前抓耳挠腮半小时来编辑回复。 +### 为什么不开评论区? -相比评论,邮件就对我个人显得友善一些,并且由于编写一封邮件的体感上像写一篇文章,就会让双方更加认真对待交流,频率也会比评论低,社交层面的压力也减少了许多,因此如果有想对我说的话,就请 [写信给我](mailto:im@verdant.ee) 吧。 +我讨厌以「互访」为目的的没话找话,这让我有很大的回复压力,我并不擅长和没那么熟的人聊闲天,所以留下了邮箱地址,有任何想对我说的欢迎发送纯文本邮件。 -并且我更希望在 Emacs 中做事,而不是在网页编辑回复,这会更顺手点。 +## 没人问但我也要回答的问题:为什么你的网站这么简陋? -如果想要社交、查看我最近的动态或期待更轻松的交流,请关注我的 [Fediverse](https://akk.glowisle.me/verdant) 账号。 +并不简陋,对阅读完全没有影响。尝试用你手头最老的设备打开,网页依然能正常且流畅地显示。本站没有任何 JavaScript,只有这几行 CSS: -另外,*少引入一个脚本,也能加快一点网站的加载速度嘛。* +```css +body { + font-family: monospace; + line-height: 1.7; + max-width: 720px; + margin: 40px auto; + padding: 0 20px; + color: #000; + background: #fff; +} -</details> +pre { + border: 1px dashed #555; + padding: 12px; + overflow-x: auto; +} -<details> -<summary>这个网站使用了什么技术?</summary> +img { + max-width: 100%; +} +``` -我使用 Emacs 在本地以 Markdown 格式写作,静态页面由 Hugo 构建,完成后推送到 Github Pages 仓库和[代码仓库](https://github.com/yingyu5658/glowisle),图片资源存储在 Cloudflare R2 OSS。 - -</details> - -<details> -<summary>这个网站都有什么?</summary> - -我也说不太清楚,写过书评,也写过散文随笔,还写过一些技术类文章。有矫情的,也有幼稚的,总之是大量的黑历史。 - -</details> - -<details> -<summary>加个微信 / QQ?</summary> - -虽然我有一个微信号和好几个 QQ 号,你也能在某个博客组织群聊找到我,但我很少会添加好友。如果你倾向用即时通讯交流,可以用 XMPP(`verdant@xmpp.earth`) 或 Matrix(`@verdantio:matrix.org`) 来联系我。不过还是更推荐邮件,这个我最常看,回复也更即时。 - -</details> - -</div> - -## 关于我 - -很难描述我到底是一个什么样的人,在[这里](https://verdant.ee)有一些关于我的信息,如果想更加了解我,就先看一看我写的东西吧。带有「黑历史」标签的文章观点和内容已经过时,请谨慎阅读。~~*并且不要认为现在的我还是那样的啊!*~~ - -## 一些其他的东西 - -- [我的主页](http://verdant.ee/) -- [在 Fediverse 上关注我](https://akk.glowisle.me/verdant/) -- [Github](https://github.com/yingyu5658) -- [RSS](/rss) - -## 鸣谢与声明 +## 鸣谢 & 声明 - 本站样式基于 [Hugo Bear Neo](https://github.com/rokcso/hugo-bearneo/) 主题修改 - 音乐卡片来自 [極客死亡計劃](https://src.eltr.ac/eltrac/geedeapro) diff --git a/content/posts/为什么我用邮件代替评论区.md b/content/posts/为什么我用邮件代替评论区.md index a6ccb36..d9e77e4 100644 --- a/content/posts/为什么我用邮件代替评论区.md +++ b/content/posts/为什么我用邮件代替评论区.md @@ -13,9 +13,7 @@ draft: true --- 又是一篇关于评论区的文章,好好说一下为什么我关闭了评论区而留下邮箱地址。 -几个月前,我探索过 Webmentions 作为评论区的代替方案,但由于懒得维护就移除了。你可以看到这个网站十分的简陋,我正在努力精简一切不必要的元素,只留下一些真正服务于文字的东西。不过,移除了某些和文章关联有点牵强的东西,比如 Webmentions,那只是我的洁癖而已。 - -在使用 Waline 评论系统的时候,我也曾经大刀阔斧地砍去了巨量的样式,移除了头像、表情、网站链接。 +几个月前,我探索过 Webmentions 作为评论区的代替方案,但由于懒得维护就移除了。你可以看到这个网站十分的简陋,我正在努力精简一切不必要的元素,只留下一些真正服务于文字的东西。不过,移除 Webmentions,只是我的洁癖而已,我不希望我的站点有太多 Javascript。在使用 Waline 评论系统的时候,我也曾经大刀阔斧地砍去了巨量的样式,移除了头像、表情、网站链接。 是的,网站链接。当时我特地移除了网站链接。我曾经在研究网站的评论系统的时候,看到了这篇文章:[《如何有效的博客互访、互评!》](https://laozhang.org/archives/3525.html),这篇文章说了五个点:有效订阅他人博客、为他人留下“网址”、为他人留下“网址”、走心的评论、用心的回评。 @@ -29,32 +27,28 @@ draft: true > 当你的博客文章展示在大家面前的时候,更想的就是想和博友们**交流交流自己所写的观点**,这个时候那就必须要用到的是“评论”! -既然评论的目的是交流观点,作者就更应该在意「你想说什么」,而不是「你是谁」,并且后文又提出了「做好评论邮件通知」的做法,是为了下一轮交流而服务的,因此如果是为了表达观点的话,网站链接完全是不必要的。而作者表明了自己的态度:如果你的网站评论区没有填写网站链接的地方,我就会直接走人。 +既然评论的目的是交流观点,作者就更应该在意「你想说什么」,而不是「你是谁」,并且后文又提出了「做好评论邮件通知」的做法,是为了下一轮交流而服务的,已经解决了后续的回复问题,不需要互访,因此如果是为了表达观点的话,网站链接完全是不必要的。而作者表明了自己的态度:如果你的网站评论区没有填写网站链接的地方,我就会直接走人。 那么请允许我提出一个显然已经有了答案的问题:**评论的意义是什么?** 上文所述,作者的行为模式是这样的:如果**没有**网站链接可填,就直接关掉。相反,从逻辑上可以推测,如果有网站链接,那他就有可能留下评论。不过从作者的原话也可以得出:有无链接可填是是否留下评论的决定性因素,这个条件直接影响他是否评论。虽然不能非黑即白地认为,他留下评论的目的不是为了交流观点,只是为了留下链接,但也可推出「留下链接的重要性大于交流观点的重要性」的结论。 因此,这篇文章就前后矛盾了,在前文中提到的交流观点的目的,就不成立了。结合下一节「4. 走心的评论」中,作者自身已经承认:「说真的,有一部分人(这部分人也**包含我** ^^)进行博客**评论时就是过个场**,有时评论内容和博客内容都扯不上边」,就可以得出结论,这样的行为是为互访而互访,为链接而互访。 -作者如何互访、如何看待评论,与我关系不大,但说「把网址输入框屏蔽掉不可取」且「遇到这样的博客直接关掉走人」,态度如此固执挑剔,就让我生出了一种「爱看不看」的想法,当然,看不看也是别人的自由。 - -评论评论,评价讨论。如果只是为了把你的链接贴到评论区而不生产一些真正有价值的评价和讨论,那也就没有必要评论了。 +评论的意思是:评价和讨论。如果只是为了把你的链接贴到评论区而不生产一些真正有价值的评价和讨论,那也就没有必要评论了。 在发现这篇文章之前,我就怀疑:「是不是有人评论就是奔着链接来的?」,看完这篇 -文章,我证实了这种想法。秉持着「爱看不看」的理念,我彻底关闭了博客的评论区。目的就在于防止为了评论而评论的评论出现。我不希望我的博客变成社交媒体,我也不喜欢看社交媒体一样的博客。 +文章,我证实了这种想法。秉持着「爱看不看」的理念,我彻底关闭了博客的评论区。目的就在于防止为了评论而评论的评论出现。我不希望我的博客变成社交媒体,我也不喜欢看社交媒体一样的博客。每次遇到这种评论,我都会有很大的回复压力。 恕我直言,我不喜欢没话找话,我也不会因为别人的没话找话而没话找话。以我自己的标准,如果我没有什么真正想说的,我不会轻易留下评论;如果说了,基本也有一个明确的主题。这段时间我都很少跑去别人评论区底下留言,我更倾向于:  -曾经有一段时间,不知道为什么我的网站流量突然多了起来,基本每天都有新评论,让我回复起来很有压力,纯粹是因为那些评论不是在自说自话,就是在附和观点,然后留下他们网站的链接。有一段时间,我的评论区上方甚至写了一行字,大概是:「我没有回复你的评论是因为你说得很对,或我无话可说,并不代表我对你的评论有意见」。天呐,我竟然为这种没话找话而浪费网页中珍贵的像素点来声明! +有一段时间,不知道为什么我的网站流量突然多了起来,基本每天都有新评论,让我回复起来很有压力,那些评论不是在自说自话,就是在附和观点,然后留下他们网站的链接。有一段时间,我的评论区上方甚至写了一行字,大概是:「我没有回复你的评论是因为你说得很对,或我无话可说,并不代表我对你的评论有意见」。天呐,我竟然为这种没话找话而浪费网页中珍贵的像素点来声明! -我最讨厌人情世故,我最讨厌潜规则,我最讨厌功利性的社交,因此我不会因为你给我的网站评论而去专门互访你,我们不是一路人,So, Fuck off! +我最讨厌人情世故,我最讨厌潜规则,我最讨厌功利性的社交,我也不会因为你给我的网站评论而去专门互访你,我们不是一路人,So, Fuck off! 我特地移除评论区而留下邮箱,就是为了让只奔着链接、互访、评论区热闹的人别来我网站。事实证明,这招非常有效,因为没有了网站链接,这群人也没有什么真正想说的,也就不再来了。 -也许有人会说:「邮件不是很麻烦吗?」 - -是的,邮件就是很麻烦,相比其他交流手段,就是很缓慢,甚至会被认为过时。但这正是我的目的所在。 +也许有人会说:「邮件不是很麻烦吗?」是的,邮件就是很麻烦,相比其他交流手段,就是很缓慢,甚至会被认为过时,但这正是邮件的优点。 晚一点出生的人,可能都没发过几封邮件,最多拿来收验证码,觉得这是上世纪的老古董,但邮件在代替博客评论区的应用场景中,绝对是最佳选择,甚至在大部分交流需求中,都很不错。 @@ -62,18 +56,14 @@ draft: true 纯文本意味着,它可以与 GNU/Linux 工具链完美集成,可以在 `mutt`, `GNU Emacs` 等一系列强大的邮件客户端中管理邮件,甚至可以应用自动化脚本、打分机制来更好地管理,并且它极其轻量,在十几年前的电脑上都能流畅工作,和加载一大堆 Javascript 的网页,以及捆绑各种依赖库的臃肿的其他通讯软件比起来,没有理由不选择邮件。 -更重要的是:可以纯键盘操作。这就是我个人的习惯了,如果能用键盘,我绝对不会动鼠标。在自己喜欢的邮件客户端中收发邮件是很令人享受的事,并且也有助于写出条理清晰的文字。 +更重要的是:可以纯键盘操作。我个人的习惯是宁愿敲一百行命令,记住一千个快捷键,也不要动鼠标在网页里点十下。并且在自己喜欢的邮件客户端中收发邮件是很令人享受的事,我会在 Emacs 中管理邮件,这帮助我写出有头有尾、条理清晰的文字。 -邮件的优势之二就是麻烦。这是邮件的最大优势。写一封邮件,你需要想一个标题,要组织措辞和分段,要把事情说明白……这很像写一篇文章不是吗?这麻烦有两个效果: +麻烦也是邮件的一大优势。写一封邮件,需要想一个标题,要组织措辞和分段,要把事情说明白……这很像写一篇文章不是吗? -一、筛选需求低的人。虽然写邮件比较麻烦,但如果你连坐下来用文字跟我好好描述一下你所想的耐心都没有,也就说明和我交流并不是必要的,这对双方来说都节省了时间和精力,尤其是当付出时间和精力得不到什么结果的时候(是的,我就是在说功利性互访)。 - -二、避开「没话找话」,虽然邮箱可以用自己的域名邮箱,但我相信不会有人为了让别人看一眼自己的网站而用自己的域名邮箱发一封邮件开没话找话,因此如果准备写一封邮件,大多有明确的主题与目的。这对于促成真正的观点探讨有非常积极的作用。 +如果你懒得坐下来好好写一点字,把你想说的东西说清楚,那也许就说明你原本打算要说的东西并没有那么必要,这对双方来说都节省了时间和精力。同时,也能避开没话找话。虽然邮箱可以用自己的域名邮箱,但我相信不会有人为了让别人看一眼自己的网站而用自己的域名邮箱发一封邮件开没话找话,因此如果准备写一封邮件,大多有明确的主题与目的。这对于促成真正的观点探讨有非常积极的作用。 自从关闭评论区后,我陆陆续续收到了很多邮件,有做法跟我一样的朋友,也有看了文章后,提出质疑和批评的朋友,这可比挂在文章底部的评论区有意义多了。 -相对严肃的交流很重要,轻松的互动也不可少,但它应该发生在专门的地方,因此我经常在 Fediverse 上转发我的文章。面对帖子下的评论,在社交媒体中就应该像社交媒体那样互动:点赞、转发。一个点赞,就像不同语气的「卧槽」在不同语境下有不同的含义,如果不够用,也可以回应表情,不过对方的服务端是否支持就另说了。这里是那些互访评论区原本应该在的位置。当然,这里还是没有填写网站链接的地方![^1] +相对严肃的交流很重要,轻松的互动也不可少,但它应该发生在专门的地方,因此我经常在 Fediverse 上转发我的文章。面对帖子下的评论,在社交媒体中就应该像社交媒体那样互动:点赞、转发。一个点赞,就像不同语气的「卧槽」在不同语境下有不同的含义,如果不够用,也可以回应表情,不过对方的服务端是否支持就另说了。这里是那些互访评论区原本应该在的位置。当然,这里还是没有填写网站链接的地方! 想社交,请去社交媒体,博客是思考、写作、表达观点的地方。 - -[^1]: 虽然在自建实例中会显示网址,但谁在意呢。 diff --git a/content/posts/参加Libreplanet2026.md b/content/posts/参加Libreplanet2026.md new file mode 100644 index 0000000..ea5f793 --- /dev/null +++ b/content/posts/参加Libreplanet2026.md @@ -0,0 +1,40 @@ +--- +title: '参加 Librelocal 2026' +date: '2026-05-02T09:44:52+08:00' +slug: +categories: +- 随笔 +tags: +- LibreLocal +- FSF +- 自由软件 +draft: true +--- +Hi 各位,好久不见,整个四月份完全没有更新博客,每天上学忙得不行,到了周末也没什么想写的,一般也都在 Fedi 上发帖,毕竟打开客户端就编辑文字发送非常方便,这确实影响了我写博客文章的频率,最好还是减少使用社交媒体。正在找回写作的感觉。 + +回到正题,往年的活动貌似没有邮件通知,但这次 [LibreLocal](https://www.fsf.org/events/meetup-2026-05-01-beijing-pekin-china) 好像发了邮件,我之前接收各种邮件通知的邮箱已经不用了,如果不是在 Fedi 上看到有人讨论,我大概是不会知道。~~所以减少社交媒体也有坏处吧。~~考虑了很久要不要去,一方面是因为五一假期后,上一天课就要二模考试[^1],我最好在家复习;另一方面是我自认为比较社恐。经过长久的思想挣扎后,还是决定去玩。 + +非常遗憾的是,从下午两点到晚上八点,只有两张照片在我的手机里,一张是大家写自己的邮箱和 GPG 指纹的白板,另一张也是那块白板。光顾着聊天,忘了这回事了…… + +在去北京的路上,我正在刷 Fedi ,在 Timeline 上看到 [Eltrac](https://www.eltr.ac/) 的一条回复,`@` 的那个人的 ID 非常眼熟,猛地一惊:*我去, Goodspeed [^2]!* 没想到在这里偶遇了,互联网真是个村…… + +这次带上了我的 ThinkPad X220,因为我在家用那台电脑比较少,所以没存私钥和一些配置文件没存过去,在大家互相 GPG 签名的时候只能默默拍下写着指纹的白板照片,然后回到家在台式机上导入。不过,那台机器还是派上了点用场的,当时 [YZY](https://github.com/YZYMC) 正在一台 ThinkPad X230 上测试最近刚爆出来的 Copy Fail,那台机器上没有配置过代理,想下载 Github 仓库中的脚本很困难,我就尝试用我的电脑下载好,然后用 `scp` 传给 X230,由于那台机器没开 22 端口,`scp` 传不过去,就在 X230 上`export https_proxy` 为我电脑的 IP 和代理端口,共享代理才把脚本下载下来了。~~虽然事后想起了有镜像站这种东西。~~ 这个漏洞恐怖如斯,轻轻松松就获取了 root ,大家一定要更新内核。 + +[SouthFox](https://southfox.me) 也参加了这次活动,最初就坐在我身后的凳子上,电脑上贴着 Emacs 和 Vim 的图标贴纸,这只狐狸展示了[自己的 Emacs 配置](https://git.southfox.me/southfox/.doom.d/)。在见到这份配置之前,我对 org-mode 的文学编程一直没太大兴趣,只是知道它可以运行 org-mode 中嵌入的代码。SouthFox 的配置使用了 org-mode 的文学编程特性,把所有配置都写在了一个 org 文件中,然后通过 `tangle` 关键字 *缠绕* 到 .el 文件中。 + +这太优雅太清晰了!所以我也学习了一下这种方法,把我的配置文件重构了,参见 [2fb7267](https://github.com/yingyu5658/.emacs.d/commit/2fb72671c096779830912dbe84ba704ce695d879)。南狐的书影音记录也都是通过强大的 org-mode 实现的,包括数据的过滤、输出。*我被狠狠传教了*,之后一定会探索更多 org-mode 的用法。Only Emacs can do, 赞美 Emacs! + +有一位非常虔诚的自由软件信徒,这位老哥的手机和电脑上**没有任何一个专有软件**。也就意味着,他不使用微信,不使用支付宝。我非常敬佩他,对于微信上的社交,他的态度就是:「如果一定要用微信联系,那就别联系了,我们不是一路人」。除了社交以外,在中国从扫码点餐、支付、打车、缴纳水电费,都要用到微信,离开了微信举步维艰。他能侃侃而谈 GPG 密钥、加密算法,也有鲜明的技术倾向,比如批评 Rust 没有动态链接,写出来的东西很庞大。并且也很倾向于用纯 C 写程序,减少 C++。完全符合我心目中黑客的形象。 + +晚上大家一起去旁边的餐厅吃了饭。感谢 Goodspeed 请客! + +, at Beijing](https://images.verdant.ee/01KQJ3ERTRDK0A2WJ971BWG12Z.jpeg) + +最后,在这里向大家推荐参加活动的朋友们的项目: +- [BookMarkFS](https://www.nongnu.org/bookmarkfs/):将浏览器书签当作文件系统,提供方便的管理接口。作者:[CismonX](https://cismon.net/) +- [GAMUX](https://www.linuxgame.cn/):收集支持 GNU/Linux 的游戏,为 Linux 用户的娱乐性而奋斗! + +另外,本站域名已迁移到 `blog.verdant.ee`,建议修改订阅链接到新域名。 + +[^1]: 有的读者朋友以为我是高中生,实际上我要在今年九月份才能成为高中生。 +[^2]: 本次 LibreLocal 2026 Beijing 的主办者 diff --git a/content/posts/张雪峰配被称作老师吗?.md b/content/posts/张雪峰配被称作老师吗?.md new file mode 100644 index 0000000..2e47228 --- /dev/null +++ b/content/posts/张雪峰配被称作老师吗?.md @@ -0,0 +1,22 @@ +--- +title: '张雪峰配被称作老师吗?' +date: '2026-04-26T22:59:46+08:00' +slug: +categories: +- 随笔 +tags: +- 教育 +- 张雪峰 +- 互联网 +draft: true +--- +好久不见,最近上学非常忙,表达欲直线下降。但张雪峰的逝世,以及网络舆论的反应,让我非常想写一篇文章讨论一下这位有鲜明个人特色的教育从业者。 + +想必每一位中国家长和学生,都知道张雪峰是谁,他因犀利、直白近乎残酷的言语在直播间为学生提供专业建议著名。先说说我自己对这人的看法。 + +我最早刷到他的视频,应该是在小学的时候。当时我看到这个人在直播间里皱着眉一副高高在上又有点凶狠的样子,时而谈笑风生,时而破口大骂,有一种全世界没有人比他更懂专业选择的感觉,这个人在我心底就已经留下了不好的印象。这是主观上我对他的印象。 + +张雪峰的观点是极度功利主义的,他给公众揭露了这样一个现实:「普通人上学内卷的目的就是为了给你的老板卖一个好价钱。」这样的说法是对的吗?在改革开放的大背景下,生产关系确实如此。包括「不要报考新闻学专业」等著名争议点,他能指出某些显著问题,并尝试帮助学生功利最大化。但网络上反对他的声音,一半来源于此,一半来源于土木和计算机专业的风波。 + +相当一大批人都受到张雪峰的指点,去就读某一个专业的时候,必然会形成饱和现象。俗称:你不干有的是人干。某个专业出现大量的高学历人才,就造成了专业学历的贬值;当实际劳动力的远远高于需求数量,就让企业有理由降低薪资和地位录取员工。无论对就业市场,还是应届对毕业生们的冲击都是相当大的。所以只能继续卷,无限循环下去。张雪峰的解决办法就是一个字:卷。但并不能依次为理由批判甚至攻击张雪峰,内卷的问题很难解决,未来 50 年,甚至在人类实现所谓的共产主义之前,都不可能被解决。因为竞争不会消失,社会资源不可能以公平的形式分配,这也是张雪峰很明显的一个倾向 —— 社会达尔文主义。 + diff --git a/content/posts/我怀念那个缤纷、混乱、野蛮生长的互联网时代.md b/content/posts/我怀念那个缤纷、混乱、野蛮生长的互联网时代.md new file mode 100644 index 0000000..a2c46e2 --- /dev/null +++ b/content/posts/我怀念那个缤纷、混乱、野蛮生长的互联网时代.md @@ -0,0 +1,65 @@ +--- +title: '' +date: '2026-05-03T21:31:18+08:00' +slug: +categories: +- 随笔 +tags: +- 互联网 +- 杂谈 +draft: true +comments: true +summary: 中文互联网要死了。 +--- +## Internet 的回忆 + +我算赶上了那个时代的尾巴,也就是2011 - 2015年。要说起互联网,现在大家的印象可能是那个万恶的行业,提起来就是什么 Web App, Java, 云原生、抖音、快手、BiliBili。到处充斥着广告、臃肿的 Javascript 和 Electron 程序、绑定手机号、上传身份证。如果我换一个词来表达,它可能对我来说有一种特殊的感觉,那个词就是 Internet。 + +Internet 在我心目中和「互联网」有什么不同?我小时候对 Internet 的形象认知,就是那个小小的地球图标。可能是拟物风格,也可能是像素风格,是只能用几种单调的高饱和度的颜色,在 64 * 64 的像素网格中绘制的风格。有时候那个小地球的右下角,或者是左下角,会有一个小红叉,那就意味着我无法连接到世界。或许在中文里,我应该使用「因特网」。因特网这个古老的词汇,给人一种「你是 GG 还是 MM」的感觉。但它是中文语境中,最能还原我当初对「互联网」的印象的。 + +在我那时候的印象中,电脑等于网络,网络等于电脑,电脑是什么样?在一张凌乱摆放着各种物品,比如相机、磁带、读卡器,甚至牙签和吃完的糖纸的桌子上,靠墙放着一块屏幕,那块屏幕侧着看就变黑了。两旁放着能出声音的塑料盒子,每次拨它的电源,都会有「嘭」的一声。桌子下方放着一个黑色的大箱子,箱子上面有一个小按钮,按起来手感还不错,随后就能听到风扇转动的声音,还有那个箱子振动的声音,屏幕上就有看不懂的字跳动了。 + +之后,屏幕上有蓝天、白云、草地。挪动鼠标,把指针放在左下角的「开始」上,左键点击,整个世界仿佛都展示在我眼前了。然而「整个世界中」,并不是所有东西都那么好玩,有的点一下,电脑就会发出惊悚的警报音,有的东西甚至能让电脑卡住,所以每一步都要小心翼翼,避免把电脑弄坏,毕竟这么高深的玩意儿,家里没有几个人能修好。 + +这大概就是我童年的某一时期对「电脑」这么个东西的理解了。是的,那时候电脑上的操作系统还是 Windows XP。好古老的东西!那时候不知道为什么,还会有一个拒绝访问的 Q 盘。这种未知原因的错误、没有按照预期执行,总是给那时的我一种莫名的恐惧感。 + +除了 Windows XP,我也~~有幸~~体验过 Windows 7,Windows 10, Windows 11。小孩相比大一些的人来说,缺少抽象能力,比如小孩看到了月亮,很难表达出这是圆形,而能率先表达出「这很像脸盆」。就是在用形象感知世界。这是纯粹的主观感受,记忆也更深刻。 + +还记得 Windows 7 的开机动画吗?几个不同颜色的发光小球从屏幕边缘聚集到一起,合成 Windows 7 的徽标,还有空灵的音效。这是我那时候对 Windows 7 的认识,并且不知道为什么,那个操作系统里各种地方的小图标,总是给人一种静谧、孤独的感觉,你可能不知道我到底在说什么,但我的感觉就是这样。 + +也许是因为网页对我的吸引力不如探索系统的每一个角落,那时候我几乎把系统的各个能点开的菜单和窗口都看了个遍。 + +很不幸,在 XP 时代,我记得那台电脑的浏览器是:*360 安全浏览器*。~~甚至连IE都不用吗!~~ 一打开,不是满页一刀 999 的 2345 网址导航,就是什么 360 导航,或者好 123 之类的,还有一个桔梗网,很讨厌。 + +而在 Win 7 时代,用的浏览器是遨游5,那时候我才会一点上网。最喜欢的网站,应该是[魔方小站](http://www.rubik.com.cn/)。通过这里的教程,我学会了三阶、二阶、金字塔、镜面以及一大堆诡异的异形魔方。 + +早期的互联网,缤纷、混乱、野蛮生长。最野蛮生长的,莫过于 [https://www.yyyyyyy.info/](https://www.yyyyyyy.info/) 这个站点。不过它现在貌似已经不再维护了,打开调试,发现代码中有一行注释: + +```html +<!-- 2007–2025: The End --> +``` + + +感兴趣的话,可以去存档网站看看之前他的原貌。这才是真正的野蛮生长,每次刷新都会有各种各样不同的混乱的图片和文本。诸如此类的有个性的站点,都被搜索引擎的 SEO 指标埋没了。早期充满怪诞感的互联网,在今日已经很难找到往日的踪迹了。不仅难以找到有趣的站点,就连想在互联网上搜寻点东西都很困难,中文互联网正在消失。 + +## 资本与技术掌握在少数人手中的结果 + +中文互联网变成如今这样,罪魁祸首多在「互联网」平台。最不可忽视的原因之一就是平台垄断,走向封闭。 + +过去想要在网上搜寻点东西,会使用搜索引擎。百度也好,Google 也罢,输入关键词,就能找到成千上万的网页。这其中,有百度贴吧,有天涯论坛,有各大小 BBS 、个人博客。 + +而现状的中文互联网,最显著的病症是「登录查看」「下载 APP 查看」。要理解这会导致什么问题,就要结合过去搜索引擎获取信息的模式看。当每一个平台都不再使用网页,都做了自家的 APP,就会导致生态越发封闭。搜索引擎就不能爬取到有效的信息,因此中文用户在试图使用搜索引擎时举步维艰。 + +还记得你上次用中文搜索技术问题的解决方法,是在什么时候、用什么搜索引擎、得到了什么结果吗?如果你使用的是 Bing ,我猜是 CSDN 的文章占据排名前列;如果你使用的是百度,那么就会得到百家号、百度知道的过时信息,以及 CSDN 文章。中文用户就应该接受这些低质量、过时、无营养的信息吗? + +中文互联网几乎被几家巨头科技公司所垄断,例如腾讯、字节。这些巨头通过资本和技术优势,垄断了优质的内容,把用户牢牢圈养在它们所谓的生态中。并且随着短视频的兴起,更多的内容生产者为了谋利求生,也纷纷转向这类形式,传统的图文网页数量和质量进一步遭到打击。 + +互联网本不该这样。抛开互联网的正在消失的互联性不谈,下载 APP 也会为用户带来很多坏处。这些邪恶的专有软件侵犯用户的隐私和主权,例如拼多多层被曝光使用系统提权漏洞,完整控制用户手机,用于定向获取用户数据、自动启动、防卸载等。[^1]表面看上去人畜无害的,甚至带来许多便利的 APP,实际上是无良的流氓软件、恶意软件。 + + + + +那么,真的无路可走了吗?俗话说,天无绝人之路。即使作为用户,我们能抗争的方式有很多。 + + +[^1]: https://github.com/davinci01010/pinduoduo_backdoor_x diff --git a/content/posts/水土不服的自由、开源、独立.md b/content/posts/水土不服的自由、开源、独立.md new file mode 100644 index 0000000..994616d --- /dev/null +++ b/content/posts/水土不服的自由、开源、独立.md @@ -0,0 +1,93 @@ +--- +title: '个人数据主权与自由开放为什么在中国水土不服' +date: '2026-04-12T21:11:37+08:00' +slug: +categories: +- 随笔 +tags: +- 自由软件 +- 自由主义 +- 开源软件 +- 网络审查 +draft: true +--- + +## 我们谈论的自由与开源是什么? + +### 自由软件运动 + +自由软件的主张 + +意识形态信徒、理想化、激进地对抗 + +并且绝大部分用户并不想控制他们的软件,只是想单纯使用 + + +### 开源软件社区 + +实用主义、协作、共同进步 + +在中国语境下的开源往往被剥离了黑客文化和自由主义精神,变成了大厂抢占生态话语权与开发者刷简历的工具 + +### Indieweb + +共性:自由主义精神、强调开放、互联、言论自由、个人主权优先 + +## 自由主义理想与互联网审查现实的冲突 + +### 中文互联网封闭的生态 + +Unix 哲学与国内超级 APP (微信)的对比、转入自家生态、不在搜索引擎出现、noindex、登录查看 + + +### 为什么自由主义难成气候 + +维稳逻辑、缺乏群众基础:欧美互联网经历了漫长的 Web 1.0 开始的远古开放时期,而中国接入互联网直接是微信、微博,这就导致中国人没有对开放协议的习惯与拥护 + +民族复兴叙事下的自由主义常常被解读为西方价值观入侵 + +开放互联触碰审查红线 + +### 独立的阻碍 + +学习成本、维护成本、经济成本、基础设施成本(运营商、电力、备案) + +技术困难:服务器维护 + +发现难题:独立博客难以被发现、流量低、传播慢 + +家用宽带 80/443 端口的封禁、严格的 ICP 备案和公安联网备案制度。这些硬性规定实际上在物理和网络层面上扼杀了“家庭自托管”(Home-lab)普及的可能性。当购买一台国内 VPS 就意味着必须接受实名审查时,“自由”在起步阶段就被阉割了。 + +### 如何让更多人掌握数据主权和自由 + +用脚投票(正在发生的抵抗运动):远离大公司的社交媒体。原因:不可控、不自由 + + + +技术上:让技术更简单、低门槛:帮助没有技术基础的人 + +不备案,因为仍然要被审查、使用境外服务器 + + +--- + +## 参考资料(不在正文中出现,是学习参考资料,用于丰富理论知识、补充论据) + +### 数据主权 + +刘晗:何谓数据主权?——全球数字规则博弈中的弹性主权视角 +https://www.aisixiang.com/data/170443.html + +廖凡:数字主权与全球数字治理 +https://law.ucass.edu.cn/info/1985/7542.htm + +数据主权 - 维基百科 +https://zh.wikipedia.org/zh-cn/%E6%95%B0%E6%8D%AE%E4%B8%BB%E6%9D%83 + +### 自由主义 + +中国自由主义的困境及其可能性 +https://matters.town/a/udk9o1v5n7fh + +网络独立宣言 - 维基百科 +https://zh.wikipedia.org/zh-cn/%E7%BD%91%E7%BB%9C%E7%8B%AC%E7%AB%8B%E5%AE%A3%E8%A8%80 @@ -30,24 +30,17 @@ unsafe = true startLevel = 2 # 起始级别 endLevel = 3 # 结束级别 ordered = false # 是否使用有序列表 - -[markup.goldmark.extensions] - [markup.goldmark.extensions.extras] - [markup.goldmark.extensions.extras.mark] - enable = true - + [markup.highlight] -guessSyntax = true -noClasses = true -style = "evergarden" -tabWidth = 4 + codeFences = false + guessSyntax = false + style = "emacs" + noClasses = true [taxonomies] category = "categories" tag = "tags" - - [languages] [languages.zh-cn] languageName = "中文" @@ -104,7 +97,7 @@ tabWidth = 4 groupByYear = true toc = true showPostCount = true - favicon = "/favicon.png" + favicon = "/favicon.ico" hideMadeWithLine = true imageZoom = true @@ -113,7 +106,20 @@ tabWidth = 4 email = "im@verdant.ee" [params.footer] - content = "© 2024 - 2026 | Made with ❤️ by [Verdant](https://verdant.ee)." + content = "© 2024 - 2026 [Verdant](https://verdant.ee). Build with Hugo." [security.goTemplates] allowActionJSTmpl = true + +disableHugoGeneratorInject = true + +[minify] + disableXML = false + minifyOutput = true + [minify.tdewolff.html] + keepComments = false + keepSpecialComments = true + keepDefaultAttrVals = true + keepDocumentTags = true + keepEndTags = true + keepQuotes = false diff --git a/layouts/_default/#baseof.html# b/layouts/_default/#baseof.html# new file mode 100644 index 0000000..a6224e8 --- /dev/null +++ b/layouts/_default/#baseof.html# @@ -0,0 +1,29 @@ +<!doctype html> +<html lang="{{ with .Site.LanguageCode }}{{ . }}{{ else }}en-US{{ end }}"> + <head> + <!-- <link rel="stylesheet" href="/css/style.css" /> --> + <link rel="stylesheet" href="/css/style.css" /> + <meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" /> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + {{- partial "favicon.html" . -}} + <title>{{ .Title }}</title> + + {{- partial "seo_tags.html" . -}} + <meta name="referrer" content="no-referrer-when-downgrade" /> + <link rel="alternate" type="application/rss+xml" href="/atom.xml" title="{{ .Site.Title }}"> + + {{ with .OutputFormats.Get "rss" -}} {{ printf ` + <link rel="%s" type="%s" href="%s" title="%s" /> + ` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }} {{ end -}} + + {{- partial "custom_head.html" . -}} + </head> + + <body> + <main>{{- block "main" . }}{{- end }}</main> + <footer>{{- partial "footer.html" . -}}</footer> + + {{- partial "custom_body.html" . -}} + </body> +</html> diff --git a/layouts/_default/.#baseof.html b/layouts/_default/.#baseof.html new file mode 120000 index 0000000..c37d2f8 --- /dev/null +++ b/layouts/_default/.#baseof.html @@ -0,0 +1 @@ +verdant@glowisle.178751:1780072799
\ No newline at end of file diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index dd29a6b..54fa756 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -11,7 +11,9 @@ {{- partial "seo_tags.html" . -}} <meta name="referrer" content="no-referrer-when-downgrade" /> + <link rel="alternate" type="application/rss+xml" href="/atom.xml" title="{{ .Site.Title }}"> + {{ with .OutputFormats.Get "rss" -}} {{ printf ` <link rel="%s" type="%s" href="%s" title="%s" /> ` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }} {{ end -}} diff --git a/layouts/_default/list.html b/layouts/_default/list.html index 8c1db86..3992a01 100644 --- a/layouts/_default/list.html +++ b/layouts/_default/list.html @@ -1,50 +1,6 @@ {{ define "main" }} <content> - {{ if .Site.Params.postSearch }} - <input - id="search-input" - type="text" - placeholder="Search..." - style="margin-top: 16px" - /> - <script> - // 等待 DOM 完全加载后执行 - document.addEventListener('DOMContentLoaded', function () { - // 缓存 DOM 元素 - const searchInput = document.getElementById('search-input'); - const posts = document.querySelectorAll('.blog-posts li'); - const years = document.querySelectorAll('.blog-posts h3'); - // 更新搜索结果 - function updateSearchResults(searchTerm) { - let visiblePosts = 0; - const displayedYears = new Set(); - posts.forEach(function (post) { - const title = post.querySelector('a').textContent.toLowerCase(); - const year = post.querySelector('time').getAttribute('datetime').split('-')[0]; - if (title.includes(searchTerm)) { - post.style.display = ''; - visiblePosts++; - displayedYears.add(year); - } else { - post.style.display = 'none'; - } - }); - - {{ if .Site.Params.groupByYear }} - years.forEach(function (y) { - const year = y.textContent; - y.style.display = displayedYears.has(year) ? '' : 'none'; - }); - {{ end }} - } - - searchInput.addEventListener('input', function () { - updateSearchResults(this.value.toLowerCase().trim()); - }); - }); - </script> - {{ end }} <ul class="blog-posts"> {{ $currentYear := 0 }} {{ range .Pages }} {{ if and (not .Params.hidden) (not (in .Params.categories "往昔")) }} diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 9ec00f3..3006c56 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -1,355 +1,40 @@ {{ define "main" }} -<header> -<a href="{{ "" | relURL }}" class="title"> - <p class="site-title">{{ .Site.Title }}</p> -</a> -<nav>{{- partial "nav.html" . -}}</nav> +<header class="post-header"> + <span class="site-title"><a href="{{ "" | relURL }}">{{ .Site.Title }}</a></span> + <nav>{{- partial "nav.html" . -}}</nav> </header> - -<style> -/* 底部声明区 */ -.h-entry ~ .info, -.h-entry ~ div:last-of-type { - margin-top: 2rem; - padding-top: 1rem; - font-size: 0.85rem; - line-height: 1.6; - color: var(--summary-text-color); - font-family: var(--font-secondary); -} - -.h-entry ~ .info p, -.h-entry ~ div:last-of-type p { - margin: 0.4rem 0; -} - -</style> +<hr> <article class="h-entry"> -<h1 class="post-title"> - <a href="{{ .RelPermalink }}" class="item-link">{{ .Title }}</a> -</h1> - -<div class="post-meta"> - <div class="post-meta-item post-date"> - <time class="dt-published" datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}"> - {{ .Date.Format "January 02, 2006" }} - </time> + <header class="entry-meta"> + <h1 class="p-name post-title">{{ .Title }}</h1> + <div class="meta-line"> + <time class="dt-published" datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}"> + {{ .Date.Format "2006-01-02" }} + </time> + + {{ with .Params.categories }} + <span class="meta-categories"> + [{{ range $index, $cat := . }}{{ if $index }} · {{ end }}<a href="/categories/{{ $cat | urlize }}/" class="p-category">{{ $cat }}</a>{{ end }}] + </span> + {{ end }} + </div> + </header> + + <div class="e-content entry-body"> + {{ .Content }} </div> - - <div class="post-meta-item post-category"> - - {{ range .Params.categories }} - {{ $url := printf "/categories/%s/" (. | urlize) }} -• - <a href="{{ $url }}" class="category-link">{{ . }}</a> - {{ end }} - </div> -</div> - - - <div class="e-content">{{ .Content }}</div> </article> -<a class="u-url" href="{{ .Permalink }}" style="display: none">Permalink</a> <hr> -{{ partial "post_meta.html" . }} - -{{ $upvoteEnabled := default .Site.Params.upvote .Params.upvote }} -{{ if $upvoteEnabled }} -<div class="upvote-container"> -<small class="upvote"> - <button class="upvote-btn" id="upvote-btn"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="css-i6dzq1"> - <polyline points="17 11 12 6 7 11"></polyline> - <polyline points="17 18 12 13 7 18"></polyline> - </svg> - <span class="upvote-count" id="upvote-count">0</span> - </button> -</small> -</div> - -<script> - let hasUpvoted = false; - let upvoteBtn; - let upvoteCount; - - // 页面加载时获取点赞数量 - document.addEventListener('DOMContentLoaded', function() { - const slug = '{{ .Slug }}'; - upvoteBtn = document.getElementById('upvote-btn'); - upvoteCount = document.getElementById('upvote-count'); - getCount(slug); - - // 处理点赞按钮的点击事件 - upvoteBtn.addEventListener('click', handleUpvote); - }); - - // 点赞方法 - async function handleUpvote() { - if (hasUpvoted) { - console.log('You have already upvoted this post!'); - return; - } - const slug = '{{ .Slug }}'; - - // 禁用按钮以防止重复点击 - upvoteBtn.disabled = true; - // 给按钮添加 upvoted 类以赋以点击过的样式 - upvoteBtn.classList.add('upvoted'); - // 更新 upvote-count 的值 +1 - upvoteCount.innerText = parseInt(upvoteCount.innerText) + 1; - - try { - const response = await fetch('{{ .Site.Params.upvoteURL }}upvote', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ postId: slug, diff: 1 }), - }); - - if (response.ok) { - console.log('Upvote successful!'); - hasUpvoted = true; - await getCount(slug, 3); - } else { - console.log('Upvote failed!'); - } - } catch (error) { - console.error('Error: ', error); - } finally { - upvoteBtn.disabled = false; - } - } - - // 获取 Upvote 数量的方法,支持设置重试次数,默认不重试 - async function getCount(slug, retryCount = 0) { - try { - const response = await fetch('{{ .Site.Params.upvoteURL }}count?post=' + slug, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); - - const data = await response.json(); - - if (data.code === 0) { - const count = data.data.count; - upvoteCount.innerText = count; - hasUpvoted = data.data.hasUpvoted; - if (hasUpvoted) { - upvoteBtn.classList.add('upvoted'); - } else { - upvoteBtn.classList.remove('upvoted'); - } - } else { - console.error('Failed to get upvote count: ', data.msg); - } - } catch (error) { - console.error('Error: ', error); - if (retryCount > 0) { - setTimeout(() => { - getCount(slug, retryCount - 1); - }, 1000); - } - } - } -</script> -{{ end }} - - - -<!-- Place the TOC at the end to ensure the article content loads first. --> -<!-- {{ $tocEnabled := default .Site.Params.toc .Params.toc }} {{ if $tocEnabled }} --> -<!-- <div class="toc">{{ partial "toc.html" . }}</div> --> -<!-- {{ end }} --> - -<!-- {{ if .Params.comments | default true }} --> -<!-- <div class="comments-and-webmentions"> --> -<!-- <details> --> -<!-- <summary> --> -<!-- <p style="display: inline">评论 与 Webmentions</p> --> -<!-- </summary> --> -<!-- <div id="giscus-container"></div> --> - -<!-- <div class="wm"> --> -<!-- <div id="webmentions"></div> --> -<!-- <script --> -<!-- src="/js/webmention.min.js" --> -<!-- data-id="webmentions" --> -<!-- data-page-url="https://www.glowisle.me{{ .RelPermalink }}" --> -<!-- data-max-webmentions="50" --> -<!-- data-wordcount="30" --> -<!-- data-sort-by="published" --> -<!-- data-sort-dir="up" --> -<!-- async --> -<!-- ></script> --> - -<!-- <p> --> -<!-- 若想回复本文,请在你的博客或社媒发布含有本文链接的帖子,然后在下方表单提交链接。 --> -<!-- </p> --> -<!-- <div class="wm-guide-content"> --> -<!-- <div class="webmention-form"> --> -<!-- <form --> -<!-- id="webmention-submit-form" --> -<!-- action="https://webmention.io/www.glowisle.me/webmention" --> -<!-- method="post" --> -<!-- > --> -<!-- <\!-- 自动填充的目标文章链接 -\-> --> -<!-- <input --> -<!-- type="hidden" --> -<!-- name="target" --> -<!-- value="https://www.glowisle.me{{ .RelPermalink }}" --> -<!-- /> --> -<!-- <div> --> -<!-- <label for="webmention-source">你的文章链接:</label> --> -<!-- <input --> -<!-- type="url" --> -<!-- id="webmention-source" --> -<!-- name="source" --> -<!-- required --> -<!-- pattern="https?://.+" --> -<!-- /> --> -<!-- <button type="submit" id="webmention-submit-btn">提交</button> --> -<!-- </div> --> -<!-- <div id="webmention-form-feedback"></div> --> -<!-- </form> --> -<!-- <p> --> -<!-- 也可以<a href="mailto:i@glowisle.me?subject=回复《{{ .Title }}》">发送邮件</a>评论。 --> -<!-- </p> --> -<!-- <a href="https://indieweb.org/webmention" --> -<!-- >关于 Webmention 的更多信息</a --> -<!-- > --> -<!-- 以及 --> -<!-- <a href="https://www.glowisle.me/posts/tear-hypocrisy-apart/" --> -<!-- >为什么要这么做?</a --> -<!-- > --> -<!-- </div> --> - -<!-- <script> --> -<!-- function getInitialTheme() { --> -<!-- // 1. 优先检查 localStorage 中的用户偏好 --> -<!-- if ( --> -<!-- typeof localStorage !== "undefined" && --> -<!-- localStorage.getItem("theme") --> -<!-- ) { --> -<!-- return localStorage.getItem("theme"); --> -<!-- } --> -<!-- // 2. 检查系统偏好 --> -<!-- if (window.matchMedia("(prefers-color-scheme: dark)").matches) { --> -<!-- return "dark"; --> -<!-- } --> -<!-- // 3. 默认值 --> -<!-- return "light"; --> -<!-- } --> - -<!-- const currentTheme = getInitialTheme(); --> -<!-- const giscusTheme = currentTheme === "dark" ? "dark" : "light"; --> - -<!-- const giscusScript = document.createElement("script"); --> -<!-- giscusScript.src = "https://giscus.app/client.js"; --> -<!-- giscusScript.setAttribute( --> -<!-- "data-repo", --> -<!-- "yingyu5658/yingyu5658.github.io", --> -<!-- ); --> -<!-- giscusScript.setAttribute("data-repo-id", "R_kgDOOBetsA"); --> -<!-- giscusScript.setAttribute("data-category", "Announcements"); --> -<!-- giscusScript.setAttribute("data-category-id", "DIC_kwDOOBetsM4CoF_Z"); --> -<!-- giscusScript.setAttribute("data-mapping", "title"); --> -<!-- giscusScript.setAttribute("data-strict", "0"); --> -<!-- giscusScript.setAttribute("data-reactions-enabled", "0"); --> -<!-- giscusScript.setAttribute("data-emit-metadata", "0"); --> -<!-- giscusScript.setAttribute("data-input-position", "bottom"); --> -<!-- giscusScript.setAttribute("data-theme", giscusTheme); --> -<!-- giscusScript.setAttribute("data-lang", "zh-CN"); --> -<!-- giscusScript.crossOrigin = "anonymous"; --> -<!-- giscusScript.async = true; --> - -<!-- document.getElementById("giscus-container").appendChild(giscusScript); --> - -<!-- document.addEventListener("DOMContentLoaded", function () { --> -<!-- const form = document.getElementById("webmention-submit-form"); --> -<!-- const submitBtn = document.getElementById("webmention-submit-btn"); --> -<!-- const feedbackEl = document.getElementById( --> -<!-- "webmention-form-feedback", --> -<!-- ); --> - -<!-- if (!form) return; --> - -<!-- form.addEventListener("submit", async function (e) { --> -<!-- e.preventDefault(); --> - -<!-- // 禁用提交按钮防止重复提交 --> -<!-- const originalBtnText = submitBtn.textContent; --> -<!-- submitBtn.disabled = true; --> -<!-- submitBtn.textContent = "发送中..."; --> - -<!-- // 清除之前的反馈信息 --> -<!-- feedbackEl.textContent = ""; --> - -<!-- try { --> -<!-- // 使用 FormData 收集表单数据 --> -<!-- const formData = new FormData(form); --> - -<!-- // 发送 POST 请求 --> -<!-- const response = await fetch(form.action, { --> -<!-- method: "POST", --> -<!-- headers: { --> -<!-- Accept: "application/json", --> -<!-- }, --> -<!-- body: new URLSearchParams(formData), --> -<!-- }); --> - -<!-- const result = await response.json(); --> - -<!-- if (response.ok) { --> -<!-- // 成功响应 --> -<!-- feedbackEl.textContent = --> -<!-- "✅ 提交成功!Webmention 正在处理中。"; --> -<!-- form.reset(); --> -<!-- } else { --> -<!-- // 错误响应 --> -<!-- let errorMsg = "提交失败:"; --> -<!-- if (result.error || result.summary) { --> -<!-- errorMsg += result.error || result.summary; --> -<!-- } --> -<!-- feedbackEl.textContent = errorMsg; --> -<!-- } --> -<!-- } catch (error) { --> -<!-- // 网络错误 --> -<!-- feedbackEl.textContent = --> -<!-- "❌ 提交过程中出现网络错误,请稍后重试。"; --> -<!-- } finally { --> -<!-- // 恢复提交按钮状态 --> -<!-- submitBtn.disabled = false; --> -<!-- submitBtn.textContent = originalBtnText; --> -<!-- } --> -<!-- }); --> -<!-- }); --> -<!-- </script> --> - -<!-- {{ end }} --> -<!-- </div> --> -<!-- </div> --> -<!-- </details> --> +<footer class="post-footer"> + <div class="post-declaration"> + <p>条目共享:遵循 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="license noopener">CC BY-NC-SA 4.0</a> 协议。</p> + <p>交流通道:向 <a href="mailto:im@verdant.ee?subject=回复《{{ .Title }}》">im@verdant.ee</a> 发送一封 <a href="https://useplaintext.email/">纯文本邮件</a>。</p> + </div> +</footer> - {{ if not .Params.comments }} - {{ with .Params.reason }} - <div class="reason"> - <p>评论区已关闭。</p> - <strong>{{ . | markdownify }}</strong> - </div> - {{ end }} - {{ end }} - <div class="info"> - <p>文章内容遵循 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a> 标准共享。</p> - <p>有想对我说的?向<a href="mailto:im@verdant.ee?subject=回复《{{ .Title }}》"> im@verdant.ee </a>发送一封<a href="https://useplaintext.email/ -">纯文本邮件</a>吧。</p> - </div> -</div> {{ end }} diff --git a/layouts/archives/single.html b/layouts/archives/single.html index 60ec3e4..dc089ff 100644 --- a/layouts/archives/single.html +++ b/layouts/archives/single.html @@ -15,52 +15,6 @@ </small> {{ end }} - {{ if .Site.Params.postSearch }} - <input id="search-input" type="text" placeholder="Search..." style="margin-top: 16px" /> - <script> - // 等待 DOM 完全加载后执行 - document.addEventListener('DOMContentLoaded', function () { - // 缓存 DOM 元素 - const searchInput = document.getElementById('search-input'); - const posts = document.querySelectorAll('.blog-posts li'); - const years = document.querySelectorAll('.blog-posts h3'); - - // 更新搜索结果 - function updateSearchResults(searchTerm) { - let visiblePosts = 0; - const displayedYears = new Set(); - posts.forEach(function (post) { - const title = post.querySelector('a').textContent.toLowerCase(); - const year = post.querySelector('time').getAttribute('datetime').split('-')[0]; - if (title.includes(searchTerm)) { - post.style.display = ''; - visiblePosts++; - displayedYears.add(year); - } else { - post.style.display = 'none'; - } - }); - - {{ if .Site.Params.groupByYear }} - years.forEach(function (y) { - const year = y.textContent; - y.style.display = displayedYears.has(year) ? '' : 'none'; - }); - {{ end }} - - {{ if .Site.Params.showPostCount }} - const countText = `There ${visiblePosts <= 1 ? `is ${visiblePosts} piece.` : `are ${visiblePosts} pieces.`}`; - document.getElementById('post-count').innerHTML = countText; - {{ end }} - } - - searchInput.addEventListener('input', function () { - updateSearchResults(this.value.toLowerCase().trim()); - }); - }); - </script> - {{ end }} - {{ $allPosts := where .Site.RegularPages "Type" "eq" "posts" }} {{ $excludePosts := where $allPosts "Params.categories" "intersect" (slice "1") }} {{ $postPages := ($allPosts | complement $excludePosts) }} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index c5fe20b..a40be26 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,40 +1,3 @@ <div class="copyright"> {{ .Site.Params.footer.content | markdownify }} - <div class="footer-item"> - | <button id="toggle-theme-btn">Dark/Light</button> - - </div> - </div> -<script> - console.log("Loaded") - const modes = { - Dark: "dark", - Light: "light", - } - - function getCurrentMode() { - let mode = localStorage.getItem("theme"); - return mode === null ? null : mode; - } - - const toggleColorSchemeBtn = document.getElementById("toggle-theme-btn"); - const body = document.body; - const currentMode = getCurrentMode() - - if (currentMode === modes.Dark) { - body.classList.toggle("dark-mode") - } - - - toggleColorSchemeBtn.addEventListener("click", () => { - body.classList.toggle("dark-mode"); - - if (body.classList.contains("dark-mode")) { - localStorage.setItem("theme", modes.Dark); - } else { - localStorage.setItem("theme", modes.Light); - } - }) - -</script> diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html index 6eb8a7b..ad2f6d1 100644 --- a/layouts/partials/nav.html +++ b/layouts/partials/nav.html @@ -1,5 +1,5 @@ {{ range .Site.Menus.main }} -<a href="{{ .URL }}">{{ .Name}}</a> +[<a href="{{ .URL }}">{{ .Name }}</a>] {{ end }} {{ with .Site.GetPage "/blog" }} <a href="{{ "blog/" | relURL }}">Blog</a> diff --git a/layouts/partials/seo_tags.html b/layouts/partials/seo_tags.html index 06e90cd..4f594fd 100644 --- a/layouts/partials/seo_tags.html +++ b/layouts/partials/seo_tags.html @@ -3,6 +3,12 @@ <meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ if .IsPage }}{{ .Summary }}{{ else }}{{ with .Site.Params.Description }}{{ . }}{{ end }}{{ end }}{{ end }}" /> <meta name="keywords" content="{{ if .IsPage }}{{ range $index, $tag := .Params.tags }}{{ $tag }},{{ end }}{{ else }}{{ range $plural, $terms := .Site.Taxonomies }}{{ range $term, $val := $terms }}{{ printf "%s," $term }}{{ end }}{{ end }}{{ end }}" /> +<meta property="og:site_name" content="{{ .Site.Title }}"> + <meta property="og:title" content="{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }}{{ end }}"> + <meta property="og:url" content="{{ .Permalink }}"> + <meta property="og:description" content="{{ if .Description }}{{ .Description }}{{ else }}{{ .Site.Params.Description }}{{ end }}"> + <meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}"> + <link rel="canonical" href="{{ .Permalink }}"> <!-- Open Graph / Facebook --> diff --git a/layouts/shortcodes/recent-posts.html b/layouts/shortcodes/recent-posts.html index e720d33..45e1958 100644 --- a/layouts/shortcodes/recent-posts.html +++ b/layouts/shortcodes/recent-posts.html @@ -1,113 +1,25 @@ -<!-- 1: 展示标题摘要;2:标题列表 --> {{ $mode := 2 }} - {{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }} -{{ $recent := first 20 $pages.ByDate.Reverse }} - -{{ if eq $mode 1 }} - -<style> - .recent-list { - list-style: none; - margin: 0; - padding: 0; - } - - .recent-list li { - margin-bottom: 8px; - } - - .recent-date { - font-family: monospace; - margin-right: 10px; - white-space: nowrap; - } - - .recent-title { - word-wrap: break-word; - } - - .recent-empty { - text-align: center; - font-style: italic; - } - - @media (max-width: 720px) { - .recent-list li { - display: flex; - flex-wrap: wrap; - } - - .recent-date { - width: auto; - margin-right: 0.5em; - } - } - - .recent-posts { - margin-top: .8rem; - } - - .recent-posts h2 { - margin-top: 1rem; - margin-bottom: 1rem; - - } -</style> +{{ $recent := first 10 $pages.ByDate.Reverse }} <div class="recent-posts"> - {{ if $recent }} - <ul class="recent-list"> - {{ range $recent }} - <div class="recent-item"> - <li> - <span class="recent-date">{{ .Date.Format "2006-01-02" }}</span> - <a href="{{ .RelPermalink }}" class="recent-title">{{ .Title }}</a> - </li> - - <summary> - {{ .Summary }} - </summary> - - </div> - {{ end }} - </ul> - {{ else }} - <div class="recent-empty">暂无文章</div> - {{ end }} + {{ if $recent }} + <ul class="posts-list {{ if eq $mode 1 }}with-summary{{ else }}title-only{{ end }}"> + {{ range $recent }} + <li> + <time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "2006-01-02" }}</time> + + <span class="post-link-wrapper"> + <a href="{{ .RelPermalink }}" class="post-title">{{ .Title }}</a> + </span> + + {{ if eq $mode 1 }} + <p class="post-summary">{{ .Summary | plainify | truncate 150 }}</p> + {{ end }} + </li> + {{ end }} + </ul> + {{ else }} + <p class="posts-empty">暂无随笔 / No posts found.</p> + {{ end }} </div> -{{ end }} - - - -{{ if eq $mode 2 }} -<style> - .recent-date { - display: inline-block; - margin-right: 0.4rem; - } - - .recent-item-2 { - margin-bottom: .5rem; - } - - .recent-title { - border-bottom: none !important; - } - -</style> - - -<div class="recent-posts"> - {{ range $recent }} - <div class="recent-item-2"> - <span class="recent-date">{{ .Date.Format "2006-01-02" }}</span> - <a href="{{ .RelPermalink }}" class="recent-title">{{ .Title }}</a> - <br> - </div> - {{ end }} -</div> - - - -{{ end }} diff --git a/static/css/style.css b/static/css/style.css index 1f9ca26..9faf41b 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1,893 +1,19 @@ -:root { - --btn-bg: #f0f0f0; - --btn-border: #cccccc; - --btn-color: #333333; - --btn-bg-hover: #e0e0e0; - --btn-border-hover: #aaaaaa; - - --width-max: 75ch; - --font-secondary: "Georgia", "Noto Serif", "Times New Roman", serif; - --font-size-primary: 1.08rem; - --font-size-secondary: 1.05rem; - - --font-size-h1: calc(var(--font-size-primary) * 1.953125); /* ≈2.11rem ≈33.8px */ - --font-size-h2: calc(var(--font-size-primary) * 1.5625); /* ≈1.69rem ≈27.0px */ - --font-size-h3: calc(var(--font-size-primary) * 1.25); /* ≈1.35rem ≈21.6px */ - --font-size-h4: calc(var(--font-size-primary) * 1.0); /* ≈1.08rem ≈17.3px */ - --font-size-h5: calc(var(--font-size-primary) * 0.875); /* ≈0.945rem ≈15.1px */ - --font-size-h6: calc(var(--font-size-primary) * 0.75); - - /* --body-bg-color: #fbf8f2; */ - /* --body-bg-color: #fff; */ - --body-bg-color: white; - --bold-text-color: #1e1e1e; - --body-text-color: #2b2b2b; - - - --link-color: #03539e; - --link-visited-color: #5e4684; - - --table-border-color: #e6dfd1; - --table-th-bg-color: #f3efe6; - --img-border-color: #e6dfd1; - --code-bg-color: #f4efe4; - --code-text-color: #362c21; - --blockquote-border-color: #c0b6a4; - --blockquote-text-color: #5e5a52; - - --upvoted-color: #c47062; - --caption-text-color: #7d7870; - --summary-text-color: #6b6660; - --toc-text-color: #d7cebc; - --toc-hover-color: #b7aa8f; - --music-bg-hover-light: #ede4d4; - --music-bg-light: rgba(237, 228, 212, 0.5); - --music-text-secondary: #7d7870; - - --music-shadow: - 0 10px 15px -3px rgba(80, 70, 50, 0.08), - 0 4px 6px -2px rgba(80, 70, 50, 0.04); - - /* ── 标题 & 图标 ── */ - --title-color: #4d4840; - --svg-size: 0.85em; -} - -h1 { font-size: var(--font-size-h1); font-weight: 700; line-height: 1.2; margin: 0.67em 0; } -h2 { font-size: var(--font-size-h2); font-weight: 600; line-height: 1.25; margin: 0.83em 0; } -h3 { font-size: var(--font-size-h3); font-weight: 600; line-height: 1.3; margin: 1em 0; } -h4 { font-size: var(--font-size-h4); font-weight: 600; line-height: 1.4; margin: 1.33em 0; } -h5 { font-size: var(--font-size-h5); font-weight: 500; line-height: 1.5; margin: 1.67em 0; text-transform: uppercase; } -h6 { font-size: var(--font-size-h6); font-weight: 500; line-height: 1.5; margin: 2em 0; color: #666; } - -p, li { - font-size: var(--font-size-primary); - line-height: 2; -} - -p, details { - margin: 0; -} - -p, details { - margin: 1em 0; -} - -/* .recent-title { */ -/* border: none; */ -/* font-weight: bold; */ -/* } */ - -.grouped { - margin-right: 0.5rem; -} - -.recent-date { - display: block; -} - -summary, summary p { - color: var(--summary-text-color); -} - -:is(article, .summary) p:not(.music-card *) { - margin-top: 1.6rem; - line-height: 1.8; - letter-spacing: 0.05em; - margin-bottom: 1.5rem; -} - -gnu { - display: none; -} - -h1, -h2 { - margin: 0; - padding: 0; -} - -.site-title { - margin: 15px 0 15px 0; - font-size: 2.15em; - font-weight: 700; -} - -.badge-88x31 { - display: flex; - flex-wrap: wrap; - gap: 5px; -} - -.badge-88x31 a { - flex: 0 0 auto; - line-height: 0; -} - -.badge-88x31 img { - display: block; -} - -.post-title a.item-link { - font-size: 1.25rem; - margin-bottom: 0; -} - -.e-content :is(h1, h2, h3, h4, h5, h6), -.summary :is(h1, h2, h3, h4, h5, h6) { - margin-top: 1.5em; -} - -.post-meta-item a, -.rss-icon a, -.post-title a, -a.title h1, -p { - color: var(--body-text-color); -} - body { - font-family: "Baskerville", "Georgia", "Songti SC", "SimSun", serif; - margin: auto; - padding: 20px; - max-width: var(--width-max); - text-align: left; - background-color: var(--body-bg-color); - word-wrap: break-word; - overflow-wrap: break-word; - line-height: 1.6; - color: var(--body-text-color); -} - -.post-title a { - margin: 16px 0; -} - -div.summary p { - line-height: 2; -} - -div.faq summary { - color: var(--body-text-color); - -} - -a { - text-decoration: none; - border-bottom: 1px dotted; - color: var(--body-text-color) !important; -} - -strong, -b { - color: var(--bold-text-color); -} - -i { - font-style: normal; -} - -/* hr { */ -/* border: 0; */ -/* border-top: 1px dashed; */ -/* } */ - - -hr { - border: 0; - border-top: 1px solid var(--table-border-color); - margin: 3rem 0 1rem 0; -} - -time { - font-size: 1rem; - color: var(--body-text-color); -} - -div.post-meta { - font-weight: 500; -} - -header { - margin-top: 30px; -} - -.title { - text-align: left; - text-decoration: none !important; -} - -.title:hover { - text-decoration: none; -} - -a.title h1 { - margin: 15px 0 15px 0; - font-size: 2.15em; -} - -div.title { - display: inline-block; -} - -.theme-toggler { - float: right; - margin-top: 1.3rem; - padding: 0; -} - -#toggle-theme-btn{ - margin-right: 1rem; - padding: 0; - background: var(--btn-bg-color); - border: 1px solid var(--btn-border-color); - color: var(--btn-color); - border-radius: 4px; - cursor: pointer; -} - -.title span { - font-weight: 400; -} - -nav a { - margin-right: 8px; - border: none; -} - -footer { - padding: 25px 0; - text-align: left; - font-size: var(--font-size-secondary); -} - -.recent-posts-item { - margin: 0 0 120px 0; -} - -.recent-item { - margin-bottom: 4rem; -} - -.recent-list { - padding-left: 2vw; -} - -.post-title a.item-link { - font-size: 1.8rem; - border: none; -} - -h1.post-title { - margin-top: 0; - margin-bottom: 0.7rem; -} - -.post-title { - display: inline-block; -} - -.post-date, -.post-date-shortcode { - font-size: 0.9em; - color: #666; - display: inline; - min-width: 80px; - flex-shrink: 0; - margin-left: auto; -} - -.recent-empty { - text-align: center; - font-style: italic; -} - -ul,blog-posts li span.grouped a { - border: none; + font-family: monospace; + line-height: 1.7; + max-width: 720px; + margin: 40px auto; + padding: 0 20px; + color: #000; + background: #fff; } -ul.blog-posts { - list-style-type: none; - padding: unset; -} - -ul.blog-posts li { - display: flex; - margin-bottom: 8px; -} - -ul.blog-posts li span { - flex: 0 0 130px; -} - -ul.blog-posts li span.grouped { - flex: 0 0 80px; -} - -.posts-list li { - margin-bottom: 12px; -} - -.post-meta { - margin-top: 20px; - margin-bottom: 5px; -} - -.recent-posts .post-meta { - margin-bottom: 3em; -} - -.post-meta-item { - margin-right: 0.3rem; - display: inline-block; -} - -.post-meta-item svg { - display: inline; - width: var(--svg-size); - height: var(--svg-size); -} - -.post-meta-item p { - margin: 0; +pre { + border: 1px dashed #555; + padding: 12px; + overflow-x: auto; } img { max-width: 100%; - display: block; - margin-left: auto; - margin-right: auto; - content-visibility: auto; -} - -img.missing { - display: none; -} - -img[src*="#minipic"] { - max-width: 50%; - margin-left: 0; - margin-right: auto; -} - -.image-caption { - margin: auto; -} - -.image-caption figcaption { - text-align: center; - font-style: italic; - font-size: 0.8em; - margin-top: 0.6em; - color: var(--caption-text-color); -} - -.booklist { - display: grid; - grid-template-columns: repeat(5, 1fr); - gap: 20px; -} - -.booklist-item { - transform: translateZ(0); - transition: - transform 0.25s, - box-shadow 0.25s; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); -} - -.booklist-item:hover { - transform: translateY(-5px) translateZ(20px); - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5); -} - -.booklist-item img { - height: 100%; -} - -.footer-item { - display: inline; - font-size: 16px; - float: right; - font-family: var(--font-primary); -} - -.social-icons { - margin: 15px 15px 5px 15px; - text-align: center; -} - -.social-icons a { - padding: 5px 5px; -} - -code { - font-family: var(--font-secondary); - background-color: var(--code-bg-color); - color: var(--code-text-color); - padding: 2px; - border-radius: 4px; -} - -pre code { - display: block; - padding: 16px; - white-space: pre-wrap; - overflow-x: auto; -} - -div.highlight pre { - border-radius: 4px; -} - -div.highlight code { - background-color: var(--code-bg-color); - color: var(--code-text-color); -} - -blockquote { - margin: 17px 0 0 0; - padding-left: 20px; - font-style: normal; -} - -blockquote p { - color: var(--blockquote-text-color); -} - -table { - width: 100%; - border-collapse: collapse; - border: 1px solid var(--table-border-color); - border-radius: 4px; - margin-top: 16px; -} - -th, -td { - border: 1px solid var(--table-border-color); - padding: 4px; -} - -th { - background-color: var(--table-th-bg-color); -} - -.wm { - border: 1px #d0d7de solid; - border-radius: 0.25em; - padding: 1.5vw; - padding-top: 0; - background-color: #fffaed; - margin-top: 1vh; -} - -.wm p { - margin-top: 1px; -} - -textarea { - width: 100%; - font-size: 16px; -} - -input { - font-size: 14px; -} - -div.footnotes hr::before { - content: "Footnotes"; - display: block; - font-size: 1.5em; - color: var(--bold-text-color); - margin-top: 16px; -} - -.music-card { - display: flex; - flex-direction: column; - gap: 0.5rem; - width: 100%; -} - -.music-card img { - border: none !important; -} - -.music-info { - display: flex; - align-items: center; - gap: 1.25rem; -} - -.music-cover { - width: 3.75rem; - height: 3.75rem; - border-radius: 0.5rem; - box-shadow: var(--music-shadow); - margin: 0 !important; - object-fit: cover; -} - -.music-title { - margin: 0; - font-size: 1rem; - font-weight: bold; - line-height: 1.2; -} - -.music-artist { - margin: 0; - font-size: 0.875rem; - color: var(--music-text-secondary); -} - -.music-links { - display: flex; - align-items: center; - gap: 0.5rem; -} - -.music-btn { - display: inline-flex; - align-items: center; - gap: 0.25rem; - padding: 0 0.75rem; - height: 2rem; - border-radius: 9999px; - text-decoration: none !important; - font-size: 0.75rem; - transition: background-color 0.3s ease; - background-color: var(--music-bg-light); - color: inherit; -} - -.music-btn:hover { - background-color: var(--music-bg-hover-light); -} - -.music-icon { - display: block; - width: 0.75rem; - height: 0.75rem; - margin: 0 !important; -} - -.music-btn-text { - display: inline; -} - -/* 容器基础样式 */ -#ms_toc { - border-left: 1px solid #ddd; /* 目录左侧的整体引导线 */ - padding: 0 0 0 1em; /* 只留左侧内边距,给缩进留空间 */ - margin-bottom: 2em; - font-size: 0.9em; - line-height: 1.6; /* 稍微增加行高,更有大纲感 */ -} - -#ms_toc strong { - display: block; - margin-bottom: 0.8em; - text-transform: uppercase; - font-size: 0.8em; - color: #666; /* 标题颜色稍微减淡,突出内容 */ - letter-spacing: 1px; -} - -/* 核心:列表缩进逻辑 */ -#ms_toc nav ul { - list-style: none; /* 彻底移除圆点 */ - padding-left: 0; - margin: 0; -} - -/* 所有的列表项 */ -#ms_toc nav li { - margin: 0.4em 0; -} - -/* 关键:通过层级选择器实现逐级缩进 */ -/* 第一级不需要额外缩进 */ -#ms_toc nav > ul > li { - padding-left: 0; -} - -/* 第二级及更深层级:每深入一级,增加 1.2em 的缩进 */ -#ms_toc nav ul ul { - padding-left: 1.2em; - margin-left: 0.2em; /* 与父级垂直线错开 */ -} - -/* 链接样式 */ -#ms_toc a { - text-decoration: none; - color: #555; /* 默认深灰色,更像大纲 */ - display: inline-block; - transition: color 0.2s ease; -} - -#ms_toc a:hover { - color: #0056b3; /* 悬停时变蓝 */ - text-decoration: underline; -} - -/* 响应式设计:大屏幕时侧靠 (Desktop) */ -@media (min-width: 1100px) { - #ms_toc_container { - position: fixed; - - /* 使用 calc 动态定位,确保在 600px 正文的右侧 */ - left: calc(50% + 350px); - top: 20%; /* 距离顶部 15%,比 20% 稍微靠上一点 */ - - width: 260px; - max-height: 75vh; /* 限制高度,防止遮挡底部 */ - overflow-y: auto; - z-index: 100; - margin: 0; - } - - #ms_toc { - margin-bottom: 0; - } -} - -/* 移动端或窄屏样式:回归到正文流中 */ -@media (max-width: 1099px) { - #ms_toc { - margin: 2em 0; /* 手机端上下留白 */ - width: auto; - position: static; - border-left: 2px solid #eee; - } -} - -button.upvote-btn { - padding: 0; - border: none; - background: none; - cursor: pointer; - display: flex; - flex-direction: column; - align-items: center; - color: var(--body-text-color); -} - -button.upvoted { - color: var(--upvoted-color); -} - -span.upvote-count { - margin-top: -4px; - font-size: smaller; -} - -ul li:has(input) { - list-style-type: none; - margin-left: -25.5px; -} - -button { -background: var(--btn-bg-color); - border: 1px solid var(--btn-border-color); - color: var(--btn-color, currentColor); - padding: 0.5rem 1rem; - border-radius: 0.25rem; - cursor: pointer; -} - -body.dark-mode { - - --btn-bg: #3a3a3a; - --btn-border: #555555; - --btn-color: #eeeeee; - --btn-bg-hover: #4a4a4a; - --btn-border-hover: #777777; - - - --body-text-color: #c8c8c8; - - --title-color: #aaa; - - --body-bg-color: #16161a; - --summary-text-color: #a8a8a8; - --bold-text-color: #ffffff; - --text-color-tertiary: #bbb; - - --link-color: #5cc2ff; - --link-visited-color: #9d7eff; - - --code-bg-color: #1a1a1a; - --code-text-color: #d4d4d4; - --blockquote-border-color: #555555; - --blockquote-text-color: #bbbbbb; - - --table-border-color: #444444; - --table-th-bg-color: #1f1f1f; - - --img-border-color: #444444; - --toc-text-color: #aaaaaa; - --toc-hover-color: #5cc2ff; - --summary-text-color: #878686; - --color-background: var(--body-bg-color) !important; - - a { - color: var(--link-color); - cursor: pointer; - } - - h3.recent-post-title a { - color: var(--body-text-color); - } - - .post-meta-item svg { - filter: invert(1) hue-rotate(180deg); - } - - strong { - /* font-weight: 650; */ - } - - .music-btn { - background-color: var(--music-bg-dark); - } - .music-btn:hover { - background-color: var(--music-bg-hover-dark); - } - - .category-link { - color: #dbdbdb; - } - - .wm { - background-color: #161b22; - border-color: #30363d; - color: var(--body-text-color); - padding: 10px; - } - - .wm input { - background-color: #010409; - border: #30363d 1px solid; - color: var(--body-text-color); - outline: none; - } - - #webmention-source:focus { - border-color: var(--color-accent-fg, #0969da); - box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.1); - } - - .wm button { - color: var(--body-text-color); - background-color: #161b22; - border: #30363d 1px solid; - } - - .post-summary { - color: var(--text-color-primary) !important; - } - - .post-item { - border-bottom: 1px solid #414141 !important; - } - - .pagination-link { - border: 1px solid #414141 !important; - } -} - -@media (min-width: 768px) { - .music-card { - flex-direction: row; - justify-content: space-between; - align-items: center; - } - - .music-btn { - padding: 1rem; - justify-content: center; - width: auto; - height: auto; - } - - .music-icon { - width: 1.25rem; - height: 1.25rem; - } - - .music-btn-text { - display: none; - } -} - -@media (max-width: 800px) { - img[src*="#minipic"] { - max-width: 100%; - margin-left: auto; - margin-right: auto; - } - - div.toc { - } -} - -@media (max-width: 720px) { - .post-date { - min-width: auto; - font-size: 0.85em; - } - - .item-link { - white-space: normal; - overflow: visible; - } -} - -@media (max-width: 700px) { - .booklist { - grid-template-columns: repeat(3, 1fr); - gap: 10px; - } -} - -@media (max-width: 400px) { - .booklist { - grid-template-columns: repeat(2, 1fr); - gap: 10px; - } -} - -.title h1, -.title p { - margin: 15px 0 !important; - font-size: 2.15em !important; - /* font-weight: 700 !important; */ - line-height: 1.2 !important; - display: block !important; - padding: 0 !important; -} - -.post-title { - font-size: 26.4px; - line-height: 1.4 !important; - display: block !important; - padding: 0 !important; -} - -.post-title a { - display: inline-block !important; - padding: 0 !important; -} - -nav { - margin-top: 0 !important; - margin-bottom: 20px !important; - line-height: 1.6 !important; -} - -header { - margin-top: 30px; - display: block; } diff --git a/static/css/style2.css b/static/css/style2.css new file mode 100644 index 0000000..b88278c --- /dev/null +++ b/static/css/style2.css @@ -0,0 +1,20 @@ +:root { + --page-max-width: 710px; +} + + + +body { + padding: 0; + padding-left: 1rem; +} + +main { + max-width: var(--page-max-width); + margin: auto; +} + +.copyright { + margin: auto; + max-width: var(--page-max-width); +} diff --git a/static/js/color-scheme-switcher.js b/static/js/color-scheme-switcher.js deleted file mode 100644 index 9166e29..0000000 --- a/static/js/color-scheme-switcher.js +++ /dev/null @@ -1,27 +0,0 @@ -console.log("Loaded") -const modes = { - Dark = "dark", - Light = "light", -} - -function getCurrentMode() { - return localStorage.getItem("theme"); -} - -const toggleColorSchemeBtn = document.getElementById("toggle-theme-btn"); -const body = document.body; -const currentMode = getCurrentMode() -if (currentMode === modes.Light) { - body.classList.toggle("dark-mode"); - -} - -toggleColorSchemeBtn.addEventListener("click", () => { - body.classList.toggle("dark-mode"); - - if (body.classList.contains("dark-mode")) { - localStorage.setItem("theme", modes.Dark); - } else { - localStorage.setItem("theme", modes.Light); - } -}) diff --git a/static/js/jquery.min.js b/static/js/jquery.min.js deleted file mode 100644 index 04dc4db..0000000 --- a/static/js/jquery.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k}); diff --git a/static/js/webmention.js b/static/js/webmention.js deleted file mode 100644 index d8cada8..0000000 --- a/static/js/webmention.js +++ /dev/null @@ -1,478 +0,0 @@ -/* webmention.js - -Simple thing for embedding webmentions from webmention.io into a page, client-side. - -(c)2018-2022 fluffy (http://beesbuzz.biz) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -GitHub repo (for latest released versions, issue tracking, etc.): - - https://github.com/PlaidWeb/webmention.js - -Basic usage: - -<script src="/path/to/webmention.js" data-param="val" ... async /> -<div id="webmentions"></div> - -Allowed parameters: - - page-url: - - The base URL to use for this page. Defaults to window.location - - add-urls: - - Additional URLs to check, separated by |s - - id: - - The HTML ID for the object to fill in with the webmention data. - Defaults to "webmentions" - - wordcount: - - The maximum number of words to render in reply mentions. - - max-webmentions: - - The maximum number of mentions to retrieve. Defaults to 30. - - prevent-spoofing: - - By default, Webmentions render using the mf2 'url' element, which plays - nicely with webmention bridges (such as brid.gy and telegraph) - but allows certain spoofing attacks. If you would like to prevent - spoofing, set this to a non-empty string (e.g. "true"). - - sort-by: - - What to order the responses by; defaults to 'published'. See - https://github.com/aaronpk/webmention.io#api - - sort-dir: - - The order to sort the responses by; defaults to 'up' (i.e. oldest - first). See https://github.com/aaronpk/webmention.io#api - - comments-are-reactions: - - If set to a non-empty string (e.g. "true"), will display comment-type responses - (replies/mentions/etc.) as being part of the reactions - (favorites/bookmarks/etc.) instead of in a separate comment list. - -A more detailed example: - -<!-- If you want to translate the UI --> -<script src="/path/to/umd/i18next.js"></script> -<script> - // Setup i18next as described in https://www.i18next.com/overview/getting-started#basic-sample -</script> -<!-- Otherwise, only using the following is fine --> -<script src="/path/to/webmention.min.js" - data-id="webmentionContainer" - data-wordcount="30" - data-prevent-spoofing="true" - data-comments-are-reactions="true" - /> - -*/ - -// Begin LibreJS code licensing -// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt - -(function () { - "use strict"; - - // Shim i18next - window.i18next = window.i18next || { - t: function t(/** @type {string} */ key) { - return key; - }, - }; - const t = window.i18next.t.bind(window.i18next); - - /** - * Read the configuration value. - * - * @param {string} key The configuration key. - * @param {string} dfl The default value. - * @returns {string} - */ - function getCfg(key, dfl) { - return document.currentScript.getAttribute("data-" + key) || dfl; - } - - const refurl = getCfg("page-url", window.location.href.replace(/#.*$/, "")); - const addurls = getCfg("add-urls", undefined); - const containerID = getCfg("id", "webmentions"); - /** @type {Number} */ - const textMaxWords = getCfg("wordcount"); - const maxWebmentions = getCfg("max-webmentions", 30); - const mentionSource = getCfg("prevent-spoofing") ? "wm-source" : "url"; - const sortBy = getCfg("sort-by", "published"); - const sortDir = getCfg("sort-dir", "up"); - /** @type {boolean} */ - const commentsAreReactions = getCfg("comments-are-reactions", false); - - /** - * @typedef MentionType - * @type {"in-reply-to"|"like-of"|"repost-of"|"bookmark-of"|"mention-of"|"rsvp"|"follow-of"} - */ - - /** - * Maps a reaction to a hover title. - * - * @type {Record<MentionType, string>} - */ - const reactTitle = { - "in-reply-to": t("replied"), - "like-of": t("liked"), - "repost-of": t("reposted"), - "bookmark-of": t("bookmarked"), - "mention-of": t("mentioned"), - rsvp: t("RSVPed"), - "follow-of": t("followed"), - }; - - /** - * Maps a reaction to an emoji. - * - * @type {Record<MentionType, string>} - */ - const reactEmoji = { - "in-reply-to": "💬", - "like-of": "❤️", - "repost-of": "🔄", - "bookmark-of": "⭐️", - "mention-of": "💬", - rsvp: "📅", - "follow-of": "🐜", - }; - - /** - * @typedef RSVPEmoji - * @type {"yes"|"no"|"interested"|"maybe"|null} - */ - - /** - * Maps a RSVP to an emoji. - * - * @type {Record<RSVPEmoji, string>} - */ - const rsvpEmoji = { - yes: "✅", - no: "❌", - interested: "💡", - maybe: "💭", - }; - - /** - * HTML escapes the string. - * - * @param {string} text The string to be escaped. - * @returns {string} - */ - function entities(text) { - return text.replace( - /[&<>"]/g, - (tag) => - ({ - "&": "&", - "<": "<", - ">": ">", - '"': """, - })[tag] || tag, - ); - } - - /** - * Creates the markup for an reaction image. - * - * @param {Reaction} r - * @param {boolean} isComment - * @returns {string} - */ - function reactImage(r, isComment) { - const who = entities(r.author?.name || r.url.split("/")[2]); - /** @type {string} */ - let response = reactTitle[r["wm-property"]] || t("reacted"); - if (!isComment && r.content && r.content.text) { - response += ": " + extractComment(r); - } - - let authorPhoto = ""; - if (r.author && r.author.photo) { - authorPhoto = ` - <img - src="${entities(r.author.photo)}" - loading="lazy" - decoding="async" - alt="${who}" - > - `; - } else { - authorPhoto = ` - <img - class="missing" - src="data:image/webp;base64,UklGRkoCAABXRUJQVlA4TD4CAAAvP8APAIV0WduUOLr/m/iqY6SokDJSMD5xYX23SQizRsVdZmIj/f6goYUbiOj/BED7MOPReuBNT3vBesSzIex+SeqMFFkjebFmzH3S7POxDSJ1yaCbCmMnS2R46cRMPyQLw4GBK4esdK60pYwsZakecUCl5zsHv/5cPH08nx9/7i6rEEVCg2hR8VSd30PxMZpVoJZQO6Dixgg6X5oKFCmlVHIDmmMFShWumAXgCuyqVN8hHff/k+9fj8+ei7BVjpxBmZCUJv+6DhWGZwWvs+UoLHFCKsPYpfJtIcEXBTopEEsKwedZUv4ku1FZErKULLyQwFGgnmTs2vBD5qu44xwnG9uyjgrFOd+KRVlXyQfwQlauydaU6AVI7OjKXLUEqNtxJBmQegNDZgV7lxxqYMOMrDyC1NdAGbdiH9Ij0skjG+oTyfO0lmjdgvoH8iIgreuBMRYLSH+R3sAztXgL+XfS7E2bmfo6gnS0TrpnzHT7kL+skj7PgHuBwv/zpN8LDLQg7zfJZLBubMKnyeh6ZGyfDEfc2LYpnlUtG7JqsSHq1WoASbUS4KVaLwB8be5mfsGMDwBcm5VxbuxWxx3nkFanB6lYqsqSkOGkKicoDvXsneR7BkKU7DtaEuT7+pxBGVwx+9gVyqf2pVA9sC2CsmjZ1RJqEJHS4Tj/pCcS0JoyBYOsB91Xjh3OFfQPQhvCAYyeLJlaOoFp0XNNuD0BC8exr8uPx7D1JWkwFdZIXmD3MOPReuDNzHjBesSzIbQD" - alt="${who}$" - > - `; - } - - let rsvp = ""; - if (r.rsvp && rsvpEmoji[r.rsvp]) { - rsvp = `<sub>${rsvpEmoji[r.rsvp]}</sub>`; - } - - return ` - <a - class="reaction" - rel="nofollow ugc" - title="${who} ${response}" - href="${r[mentionSource]}" - > - ${authorPhoto} - ${reactEmoji[r["wm-property"]] || "💥"} - ${rsvp} - </a> - `; - } - - /** - * Strip the protocol off a URL. - * - * @param {string} url The URL to strip protocol off. - * @returns {string} - */ - function stripurl(url) { - return url.substr(url.indexOf("//")); - } - - /** - * Deduplicate multiple mentions from the same source URL. - * - * @param {Array<Reaction>} mentions Mentions of the source URL. - * @return {Array<Reaction>} - */ - function dedupe(mentions) { - /** @type {Array<Reaction>} */ - const filtered = []; - /** @type {Record<string, boolean>} */ - const seen = {}; - - mentions.forEach(function (r) { - // Strip off the protocol (i.e. treat http and https the same) - const source = stripurl(r.url); - if (!seen[source]) { - filtered.push(r); - seen[source] = true; - } - }); - - return filtered; - } - - /** - * Extract comments from a reaction. - * - * @param {Reactions} c - * @returns string - */ - function extractComment(c) { - let text = entities(c.content.text); - - if (textMaxWords) { - let words = text.replace(/\s+/g, " ").split(" ", textMaxWords + 1); - if (words.length > textMaxWords) { - words[textMaxWords - 1] += "…"; - words = words.slice(0, textMaxWords); - text = words.join(" "); - } - } - - return text; - } - - /** - * Format comments as HTML. - * - * @param {Array<Reaction>} comments The comments to format. - * @returns string - */ - function formatComments(comments) { - const headline = `<h2>${t("Responses")}</h2>`; - const markup = comments - .map((c) => { - const image = reactImage(c, true); - - let source = entities(c.url.split("/")[2]); - if (c.author && c.author.name) { - source = entities(c.author.name); - } - const link = `<a class="source" rel="nofollow ugc" href="${c[mentionSource]}">${source}</a>`; - - let linkclass = "name"; - let linktext = `(${t("mention")})`; - if (c.name) { - linkclass = "name"; - linktext = entities(c.name); - } else if (c.content && c.content.text) { - linkclass = "text"; - linktext = extractComment(c); - } - - const type = `<span class="${linkclass}">${linktext}</span>`; - - return `<li>${image} ${link} ${type}</li>`; - }) - .join(""); - return ` - ${headline} - <ul class="comments">${markup}</ul> - `; - } - - /** - * @typedef {Object} Reaction - * @property {string} url - * @property {Object?} author - * @property {string?} author.name - * @property {string?} author.photo - * @property {Object?} content - * @property {string?} content.text - * @property {RSVPEmoji?} rsvp - * @property {MentionType?} wm-property - * @property {string?} wm-source - */ - - /** - * Formats a list of reactions as HTML. - * - * @param {Array<Reaction>} reacts List of reactions to format - * @returns string - */ - function formatReactions(reacts) { - const headline = `<h2>${t("Reactions")}</h2>`; - - const markup = reacts.map((r) => reactImage(r)).join(""); - - return ` - ${headline} - <ul class="reacts">${markup}</ul> - `; - } - - /** - * @typedef WebmentionResponse - * @type {Object} - * @property {Array<Reaction>} children - */ - - /** - * Register event listener. - */ - window.addEventListener("load", async function () { - const container = document.getElementById(containerID); - if (!container) { - // no container, so do nothing - return; - } - - const pages = [stripurl(refurl)]; - if (!!addurls) { - addurls.split("|").forEach(function (url) { - pages.push(stripurl(url)); - }); - } - - let apiURL = `https://webmention.io/api/mentions.jf2?per-page=${maxWebmentions}&sort-by=${sortBy}&sort-dir=${sortDir}`; - - pages.forEach(function (path) { - apiURL += `&target[]=${encodeURIComponent("http:" + path)}&target[]=${encodeURIComponent("https:" + path)}`; - }); - - /** @type {WebmentionResponse} */ - let json = {}; - try { - const response = await window.fetch(apiURL); - if (response.status >= 200 && response.status < 300) { - json = await response.json(); - } else { - console.error("Could not parse response"); - new Error(response.statusText); - } - } catch (error) { - // Purposefully not escalate further, i.e. no UI update - console.error("Request failed", error); - } - - /** @type {Array<Reaction>} */ - let comments = []; - /** @type {Array<Reaction>} */ - const collects = []; - - if (commentsAreReactions) { - comments = collects; - } - - /** @type {Record<MentionType, Array<Reaction>>} */ - const mapping = { - "in-reply-to": comments, - "like-of": collects, - "repost-of": collects, - "bookmark-of": collects, - "follow-of": collects, - "mention-of": comments, - rsvp: comments, - }; - - json.children.forEach(function (child) { - // Map each mention into its respective container - const store = mapping[child["wm-property"]]; - if (store) { - store.push(child); - } - }); - - // format the comment-type things - let formattedComments = ""; - if (comments.length > 0 && comments !== collects) { - formattedComments = formatComments(dedupe(comments)); - } - - // format the other reactions - let reactions = ""; - if (collects.length > 0) { - reactions = formatReactions(dedupe(collects)); - } - - let finalHtml = `${formattedComments}${reactions}`; - if (!finalHtml.trim()) { - finalHtml = '<p class="wm-empty">Nothing.</p>'; - } - - // 关键修正:将 finalHtml 变量的内容,赋值给容器的 innerHTML 属性 - container.innerHTML = finalHtml; - }); -})(); - -// End-of-file marker for LibreJS -// @license-end diff --git a/static/js/webmention.min.js b/static/js/webmention.min.js deleted file mode 100644 index 61f107d..0000000 --- a/static/js/webmention.min.js +++ /dev/null @@ -1,196 +0,0 @@ -// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt -!(function () { - "use strict"; - window.i18next = window.i18next || { - t: function t(e) { - return e; - }, - }; - let t = window.i18next.t.bind(window.i18next); - function e(t, e) { - return document.currentScript.getAttribute("data-" + t) || e; - } - let o = e("page-url", window.location.href.replace(/#.*$/, "")), - n = e("add-urls", void 0), - r = e("id", "webmentions"), - s = e("wordcount"), - l = e("max-webmentions", 30), - i = e("prevent-spoofing") ? "wm-source" : "url", - a = e("sort-by", "published"), - u = e("sort-dir", "up"), - p = e("comments-are-reactions", !1), - c = { - "in-reply-to": t("replied"), - "like-of": t("liked"), - "repost-of": t("reposted"), - "bookmark-of": t("bookmarked"), - "mention-of": t("mentioned"), - rsvp: t("RSVPed"), - "follow-of": t("followed"), - }, - f = { - "in-reply-to": "\uD83D\uDCAC", - "like-of": "❤️", - "repost-of": "\uD83D\uDD04", - "bookmark-of": "⭐️", - "mention-of": "\uD83D\uDCAC", - rsvp: "\uD83D\uDCC5", - "follow-of": "\uD83D\uDC1C", - }, - m = { - yes: "✅", - no: "❌", - interested: "\uD83D\uDCA1", - maybe: "\uD83D\uDCAD", - }; - function d(t) { - return t.replace( - /[&<>"]/g, - (t) => - ({ "&": "&", "<": "<", ">": ">", '"': """ })[ - t - ] || t, - ); - } - function h(e, o) { - let n = d(e.author?.name || e.url.split("/")[2]), - r = c[e["wm-property"]] || t("reacted"); - !o && e.content && e.content.text && (r += ": " + x(e)); - let s = ""; - s = - e.author && e.author.photo - ? ` - <img - src="${d(e.author.photo)}" - loading="lazy" - decoding="async" - alt="${n}" - > - ` - : ` - <img - class="missing" - src="data:image/webp;base64,UklGRkoCAABXRUJQVlA4TD4CAAAvP8APAIV0WduUOLr/m/iqY6SokDJSMD5xYX23SQizRsVdZmIj/f6goYUbiOj/BED7MOPReuBNT3vBesSzIex+SeqMFFkjebFmzH3S7POxDSJ1yaCbCmMnS2R46cRMPyQLw4GBK4esdK60pYwsZakecUCl5zsHv/5cPH08nx9/7i6rEEVCg2hR8VSd30PxMZpVoJZQO6Dixgg6X5oKFCmlVHIDmmMFShWumAXgCuyqVN8hHff/k+9fj8+ei7BVjpxBmZCUJv+6DhWGZwWvs+UoLHFCKsPYpfJtIcEXBTopEEsKwedZUv4ku1FZErKULLyQwFGgnmTs2vBD5qu44xwnG9uyjgrFOd+KRVlXyQfwQlauydaU6AVI7OjKXLUEqNtxJBmQegNDZgV7lxxqYMOMrDyC1NdAGbdiH9Ij0skjG+oTyfO0lmjdgvoH8iIgreuBMRYLSH+R3sAztXgL+XfS7E2bmfo6gnS0TrpnzHT7kL+skj7PgHuBwv/zpN8LDLQg7zfJZLBubMKnyeh6ZGyfDEfc2LYpnlUtG7JqsSHq1WoASbUS4KVaLwB8be5mfsGMDwBcm5VxbuxWxx3nkFanB6lYqsqSkOGkKicoDvXsneR7BkKU7DtaEuT7+pxBGVwx+9gVyqf2pVA9sC2CsmjZ1RJqEJHS4Tj/pCcS0JoyBYOsB91Xjh3OFfQPQhvCAYyeLJlaOoFp0XNNuD0BC8exr8uPx7D1JWkwFdZIXmD3MOPReuDNzHjBesSzIbQD" - alt="${n}$" - > - `; - let l = ""; - return ( - e.rsvp && m[e.rsvp] && (l = `<sub>${m[e.rsvp]}</sub>`), - ` - <a - class="reaction" - rel="nofollow ugc" - title="${n} ${r}" - href="${e[i]}" - > - ${s} - ${f[e["wm-property"]] || "\uD83D\uDCA5"} - ${l} - </a> - ` - ); - } - function g(t) { - return t.substr(t.indexOf("//")); - } - function w(t) { - let e = [], - o = {}; - return ( - t.forEach(function (t) { - let n = g(t.url); - o[n] || (e.push(t), (o[n] = !0)); - }), - e - ); - } - function x(t) { - let e = d(t.content.text); - if (s) { - let o = e.replace(/\s+/g, " ").split(" ", s + 1); - o.length > s && - ((o[s - 1] += "…"), (e = (o = o.slice(0, s)).join(" "))); - } - return e; - } - window.addEventListener("load", async function () { - let e = document.getElementById(r); - if (!e) return; - let s = [g(o)]; - n && - n.split("|").forEach(function (t) { - s.push(g(t)); - }); - let c = `https://webmention.io/api/mentions.jf2?per-page=${l}&sort-by=${a}&sort-dir=${u}`; - s.forEach(function (t) { - c += `&target[]=${encodeURIComponent("http:" + t)}&target[]=${encodeURIComponent("https:" + t)}`; - }); - let f = {}; - try { - let m = await window.fetch(c); - m.status >= 200 && m.status < 300 - ? (f = await m.json()) - : (console.error("Could not parse response"), - Error(m.statusText)); - } catch (y) { - console.error("Request failed", y); - } - let b = [], - k = []; - p && (b = k); - let B = { - "in-reply-to": b, - "like-of": k, - "repost-of": k, - "bookmark-of": k, - "follow-of": k, - "mention-of": b, - rsvp: b, - }; - f.children.forEach(function (t) { - let e = B[t["wm-property"]]; - e && e.push(t); - }); - let S = ""; - b.length > 0 && - b !== k && - (S = (function e(o) { - let n = `<h2>${t("Responses")}</h2>`, - r = o - .map((e) => { - let o = h(e, !0), - n = d(e.url.split("/")[2]); - e.author && e.author.name && (n = d(e.author.name)); - let r = `<a class="source" rel="nofollow ugc" href="${e[i]}">${n}</a>`, - s = "name", - l = `(${t("mention")})`; - e.name - ? ((s = "name"), (l = d(e.name))) - : e.content && - e.content.text && - ((s = "text"), (l = x(e))); - let a = `<span class="${s}">${l}</span>`; - return `<li>${o} ${r} ${a}</li>`; - }) - .join(""); - return ` - ${n} - <ul class="comments">${r}</ul> - `; - })(w(b))); - let D = ""; - k.length > 0 && - (D = (function e(o) { - let n = `<h2>${t("Reactions")}</h2>`, - r = o.map((t) => h(t)).join(""); - return ` - ${n} - <ul class="reacts">${r}</ul> - `; - })(w(k))); - let $ = `${S}${D}`; - ($.trim() || ($ = '<p class="wm-empty">暂无 Webmention 回应。</p>'), - (e.innerHTML = $)); - }); -})(); // @license-end diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..62bf11a --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +build: Sat May 30 02:25:07 PM CST 2026 |
