Repository: v2ray/v2ray.github.io Branch: master Commit: 40970b170d11 Files: 476 Total size: 9.3 MB Directory structure: gitextract_ndww95gq/ ├── .gitignore ├── CNAME ├── awesome/ │ ├── ads.html │ └── tools.html ├── chapter_00/ │ ├── 01_versions.html │ ├── 02_donate.html │ ├── command.html │ ├── faq.html │ ├── help.html │ ├── install.html │ ├── start.html │ └── workflow.html ├── chapter_02/ │ ├── 01_overview.html │ ├── 02_protocols.html │ ├── 03_routing.html │ ├── 04_dns.html │ ├── 05_transport.html │ ├── api.html │ ├── env.html │ ├── index.html │ ├── mux.html │ ├── policy.html │ ├── protocols/ │ │ ├── blackhole.html │ │ ├── dns.html │ │ ├── dokodemo.html │ │ ├── freedom.html │ │ ├── http.html │ │ ├── mtproto.html │ │ ├── shadowsocks.html │ │ ├── socks.html │ │ └── vmess.html │ ├── reverse.html │ ├── stats.html │ └── transport/ │ ├── domainsocket.html │ ├── h2.html │ ├── mkcp.html │ ├── quic.html │ ├── tcp.html │ └── websocket.html ├── core/ │ └── index.html ├── developer/ │ ├── index.html │ ├── intro/ │ │ ├── compile.html │ │ ├── design.html │ │ ├── guide.html │ │ ├── roadmap.html │ │ └── tools.html │ └── protocols/ │ ├── mkcp.html │ ├── muxcool.html │ └── vmess.html ├── en/ │ ├── awesome/ │ │ ├── ads.html │ │ └── tools.html │ ├── configuration/ │ │ ├── api.html │ │ ├── dns.html │ │ ├── env.html │ │ ├── index.html │ │ ├── mux.html │ │ ├── overview.html │ │ ├── policy.html │ │ ├── protocols/ │ │ │ ├── blackhole.html │ │ │ ├── dns.html │ │ │ ├── dokodemo.html │ │ │ ├── freedom.html │ │ │ ├── http.html │ │ │ ├── mtproto.html │ │ │ ├── shadowsocks.html │ │ │ ├── socks.html │ │ │ └── vmess.html │ │ ├── protocols.html │ │ ├── reverse.html │ │ ├── routing.html │ │ ├── stats.html │ │ ├── transport/ │ │ │ ├── domainsocket.html │ │ │ ├── h2.html │ │ │ ├── mkcp.html │ │ │ ├── quic.html │ │ │ ├── tcp.html │ │ │ └── websocket.html │ │ └── transport.html │ ├── developer/ │ │ └── tools.html │ ├── gitbook/ │ │ ├── fonts/ │ │ │ └── fontawesome/ │ │ │ └── FontAwesome.otf │ │ ├── gitbook-plugin-anchors/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-ga/ │ │ │ └── plugin.js │ │ ├── gitbook-plugin-hints/ │ │ │ └── plugin-hints.css │ │ ├── gitbook-plugin-mermaid-gb3/ │ │ │ ├── book/ │ │ │ │ └── plugin.js │ │ │ └── mermaid/ │ │ │ ├── mermaid.css │ │ │ └── mermaid.forest.css │ │ ├── gitbook-plugin-prism/ │ │ │ ├── prism-a11y-dark.css │ │ │ ├── prism-atom-dark.css │ │ │ ├── prism-base16-ateliersulphurpool.light.css │ │ │ ├── prism-cb.css │ │ │ ├── prism-darcula.css │ │ │ ├── prism-dracula.css │ │ │ ├── prism-duotone-dark.css │ │ │ ├── prism-duotone-earth.css │ │ │ ├── prism-duotone-forest.css │ │ │ ├── prism-duotone-light.css │ │ │ ├── prism-duotone-sea.css │ │ │ ├── prism-duotone-space.css │ │ │ ├── prism-ghcolors.css │ │ │ ├── prism-hopscotch.css │ │ │ ├── prism-material-dark.css │ │ │ ├── prism-material-light.css │ │ │ ├── prism-material-oceanic.css │ │ │ ├── prism-pojoaque.css │ │ │ ├── prism-shades-of-purple.css │ │ │ ├── prism-synthwave84.css │ │ │ ├── prism-vs.css │ │ │ └── prism-xonokai.css │ │ ├── gitbook.js │ │ ├── style.css │ │ └── theme.js │ ├── index.html │ ├── styles/ │ │ └── website.css │ └── welcome/ │ ├── command.html │ ├── donate.html │ ├── faq.html │ ├── help.html │ ├── install.html │ ├── start.html │ ├── versions.html │ └── workflow.html ├── ext/ │ └── index.html ├── fa/ │ ├── awesome/ │ │ ├── ads.html │ │ └── tools.html │ ├── configuration/ │ │ ├── api.html │ │ ├── dns.html │ │ ├── env.html │ │ ├── index.html │ │ ├── mux.html │ │ ├── overview.html │ │ ├── policy.html │ │ ├── protocols/ │ │ │ ├── blackhole.html │ │ │ ├── dns.html │ │ │ ├── dokodemo.html │ │ │ ├── freedom.html │ │ │ ├── http.html │ │ │ ├── mtproto.html │ │ │ ├── shadowsocks.html │ │ │ ├── socks.html │ │ │ └── vmess.html │ │ ├── protocols.html │ │ ├── reverse.html │ │ ├── routing.html │ │ ├── stats.html │ │ ├── transport/ │ │ │ ├── domainsocket.html │ │ │ ├── h2.html │ │ │ ├── mkcp.html │ │ │ ├── quic.html │ │ │ ├── tcp.html │ │ │ └── websocket.html │ │ └── transport.html │ ├── developer/ │ │ └── tools.html │ ├── gitbook/ │ │ ├── fonts/ │ │ │ └── fontawesome/ │ │ │ └── FontAwesome.otf │ │ ├── gitbook-plugin-anchors/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-ga/ │ │ │ └── plugin.js │ │ ├── gitbook-plugin-hints/ │ │ │ └── plugin-hints.css │ │ ├── gitbook-plugin-mermaid-gb3/ │ │ │ ├── book/ │ │ │ │ └── plugin.js │ │ │ └── mermaid/ │ │ │ ├── mermaid.css │ │ │ └── mermaid.forest.css │ │ ├── gitbook-plugin-prism/ │ │ │ ├── prism-a11y-dark.css │ │ │ ├── prism-atom-dark.css │ │ │ ├── prism-base16-ateliersulphurpool.light.css │ │ │ ├── prism-cb.css │ │ │ ├── prism-darcula.css │ │ │ ├── prism-dracula.css │ │ │ ├── prism-duotone-dark.css │ │ │ ├── prism-duotone-earth.css │ │ │ ├── prism-duotone-forest.css │ │ │ ├── prism-duotone-light.css │ │ │ ├── prism-duotone-sea.css │ │ │ ├── prism-duotone-space.css │ │ │ ├── prism-ghcolors.css │ │ │ ├── prism-hopscotch.css │ │ │ ├── prism-material-dark.css │ │ │ ├── prism-material-light.css │ │ │ ├── prism-material-oceanic.css │ │ │ ├── prism-pojoaque.css │ │ │ ├── prism-shades-of-purple.css │ │ │ ├── prism-synthwave84.css │ │ │ ├── prism-vs.css │ │ │ └── prism-xonokai.css │ │ ├── gitbook.js │ │ ├── style.css │ │ └── theme.js │ ├── index.html │ ├── styles/ │ │ └── website.css │ ├── ui_client/ │ │ ├── README.md │ │ ├── android.md │ │ ├── ios.md │ │ ├── osx.md │ │ ├── service.md │ │ └── windows.md │ └── welcome/ │ ├── command.html │ ├── donate.html │ ├── faq.html │ ├── help.html │ ├── install.html │ ├── license.md │ ├── pgp.md │ ├── start.html │ ├── tg.md │ ├── versions.html │ └── workflow.html ├── gitbook/ │ ├── fonts/ │ │ └── fontawesome/ │ │ └── FontAwesome.otf │ ├── gitbook-plugin-anchors/ │ │ └── plugin.css │ ├── gitbook-plugin-ga/ │ │ └── plugin.js │ ├── gitbook-plugin-hints/ │ │ └── plugin-hints.css │ ├── gitbook-plugin-mermaid-gb3/ │ │ ├── book/ │ │ │ └── plugin.js │ │ └── mermaid/ │ │ ├── mermaid.css │ │ └── mermaid.forest.css │ ├── gitbook-plugin-prism/ │ │ ├── prism-a11y-dark.css │ │ ├── prism-atom-dark.css │ │ ├── prism-base16-ateliersulphurpool.light.css │ │ ├── prism-cb.css │ │ ├── prism-darcula.css │ │ ├── prism-dracula.css │ │ ├── prism-duotone-dark.css │ │ ├── prism-duotone-earth.css │ │ ├── prism-duotone-forest.css │ │ ├── prism-duotone-light.css │ │ ├── prism-duotone-sea.css │ │ ├── prism-duotone-space.css │ │ ├── prism-ghcolors.css │ │ ├── prism-hopscotch.css │ │ ├── prism-material-dark.css │ │ ├── prism-material-light.css │ │ ├── prism-material-oceanic.css │ │ ├── prism-pojoaque.css │ │ ├── prism-shades-of-purple.css │ │ ├── prism-synthwave84.css │ │ ├── prism-vs.css │ │ └── prism-xonokai.css │ ├── gitbook.js │ ├── style.css │ └── theme.js ├── index.html ├── ko/ │ ├── awesome/ │ │ ├── ads.html │ │ └── tools.html │ ├── configuration/ │ │ ├── api.html │ │ ├── dns.html │ │ ├── env.html │ │ ├── index.html │ │ ├── mux.html │ │ ├── overview.html │ │ ├── policy.html │ │ ├── protocols/ │ │ │ ├── blackhole.html │ │ │ ├── dns.html │ │ │ ├── dokodemo.html │ │ │ ├── freedom.html │ │ │ ├── http.html │ │ │ ├── mtproto.html │ │ │ ├── shadowsocks.html │ │ │ ├── socks.html │ │ │ └── vmess.html │ │ ├── protocols.html │ │ ├── reverse.html │ │ ├── routing.html │ │ ├── stats.html │ │ ├── transport/ │ │ │ ├── domainsocket.html │ │ │ ├── h2.html │ │ │ ├── mkcp.html │ │ │ ├── quic.html │ │ │ ├── tcp.html │ │ │ └── websocket.html │ │ └── transport.html │ ├── developer/ │ │ └── tools.html │ ├── gitbook/ │ │ ├── fonts/ │ │ │ └── fontawesome/ │ │ │ └── FontAwesome.otf │ │ ├── gitbook-plugin-anchors/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-ga/ │ │ │ └── plugin.js │ │ ├── gitbook-plugin-hints/ │ │ │ └── plugin-hints.css │ │ ├── gitbook-plugin-mermaid-gb3/ │ │ │ ├── book/ │ │ │ │ └── plugin.js │ │ │ └── mermaid/ │ │ │ ├── mermaid.css │ │ │ └── mermaid.forest.css │ │ ├── gitbook-plugin-prism/ │ │ │ ├── prism-a11y-dark.css │ │ │ ├── prism-atom-dark.css │ │ │ ├── prism-base16-ateliersulphurpool.light.css │ │ │ ├── prism-cb.css │ │ │ ├── prism-darcula.css │ │ │ ├── prism-dracula.css │ │ │ ├── prism-duotone-dark.css │ │ │ ├── prism-duotone-earth.css │ │ │ ├── prism-duotone-forest.css │ │ │ ├── prism-duotone-light.css │ │ │ ├── prism-duotone-sea.css │ │ │ ├── prism-duotone-space.css │ │ │ ├── prism-ghcolors.css │ │ │ ├── prism-hopscotch.css │ │ │ ├── prism-material-dark.css │ │ │ ├── prism-material-light.css │ │ │ ├── prism-material-oceanic.css │ │ │ ├── prism-pojoaque.css │ │ │ ├── prism-shades-of-purple.css │ │ │ ├── prism-synthwave84.css │ │ │ ├── prism-vs.css │ │ │ └── prism-xonokai.css │ │ ├── gitbook.js │ │ ├── style.css │ │ └── theme.js │ ├── index.html │ ├── styles/ │ │ └── website.css │ ├── ui_client/ │ │ ├── README.md │ │ ├── android.md │ │ ├── ios.md │ │ ├── osx.md │ │ ├── service.md │ │ └── windows.md │ └── welcome/ │ ├── command.html │ ├── donate.html │ ├── faq.html │ ├── help.html │ ├── install.html │ ├── start.html │ ├── versions.html │ └── workflow.html ├── links/ │ └── chinasites/ │ └── index.html ├── robots.txt ├── ru/ │ ├── awesome/ │ │ ├── ads.html │ │ └── tools.html │ ├── configuration/ │ │ ├── api.html │ │ ├── dns.html │ │ ├── env.html │ │ ├── index.html │ │ ├── mux.html │ │ ├── overview.html │ │ ├── policy.html │ │ ├── protocols/ │ │ │ ├── blackhole.html │ │ │ ├── dns.html │ │ │ ├── dokodemo.html │ │ │ ├── freedom.html │ │ │ ├── http.html │ │ │ ├── mtproto.html │ │ │ ├── shadowsocks.html │ │ │ ├── socks.html │ │ │ └── vmess.html │ │ ├── protocols.html │ │ ├── reverse.html │ │ ├── routing.html │ │ ├── stats.html │ │ ├── transport/ │ │ │ ├── domainsocket.html │ │ │ ├── h2.html │ │ │ ├── mkcp.html │ │ │ ├── quic.html │ │ │ ├── tcp.html │ │ │ └── websocket.html │ │ └── transport.html │ ├── developer/ │ │ └── tools.html │ ├── gitbook/ │ │ ├── fonts/ │ │ │ └── fontawesome/ │ │ │ └── FontAwesome.otf │ │ ├── gitbook-plugin-anchors/ │ │ │ └── plugin.css │ │ ├── gitbook-plugin-ga/ │ │ │ └── plugin.js │ │ ├── gitbook-plugin-hints/ │ │ │ └── plugin-hints.css │ │ ├── gitbook-plugin-mermaid-gb3/ │ │ │ ├── book/ │ │ │ │ └── plugin.js │ │ │ └── mermaid/ │ │ │ ├── mermaid.css │ │ │ └── mermaid.forest.css │ │ ├── gitbook-plugin-prism/ │ │ │ ├── prism-a11y-dark.css │ │ │ ├── prism-atom-dark.css │ │ │ ├── prism-base16-ateliersulphurpool.light.css │ │ │ ├── prism-cb.css │ │ │ ├── prism-darcula.css │ │ │ ├── prism-dracula.css │ │ │ ├── prism-duotone-dark.css │ │ │ ├── prism-duotone-earth.css │ │ │ ├── prism-duotone-forest.css │ │ │ ├── prism-duotone-light.css │ │ │ ├── prism-duotone-sea.css │ │ │ ├── prism-duotone-space.css │ │ │ ├── prism-ghcolors.css │ │ │ ├── prism-hopscotch.css │ │ │ ├── prism-material-dark.css │ │ │ ├── prism-material-light.css │ │ │ ├── prism-material-oceanic.css │ │ │ ├── prism-pojoaque.css │ │ │ ├── prism-shades-of-purple.css │ │ │ ├── prism-synthwave84.css │ │ │ ├── prism-vs.css │ │ │ └── prism-xonokai.css │ │ ├── gitbook.js │ │ ├── style.css │ │ └── theme.js │ ├── index.html │ ├── styles/ │ │ └── website.css │ ├── ui_client/ │ │ ├── README.md │ │ ├── android.md │ │ ├── ios.md │ │ ├── osx.md │ │ ├── service.md │ │ └── windows.md │ └── welcome/ │ ├── command.html │ ├── donate.html │ ├── faq.html │ ├── help.html │ ├── install.html │ ├── license.md │ ├── pgp.md │ ├── start.html │ ├── tg.md │ ├── versions.html │ └── workflow.html ├── styles/ │ └── website.css └── vi/ ├── awesome/ │ ├── ads.html │ └── tools.html ├── configuration/ │ ├── api.html │ ├── dns.html │ ├── env.html │ ├── index.html │ ├── mux.html │ ├── overview.html │ ├── policy.html │ ├── protocols/ │ │ ├── blackhole.html │ │ ├── dns.html │ │ ├── dokodemo.html │ │ ├── freedom.html │ │ ├── http.html │ │ ├── mtproto.html │ │ ├── shadowsocks.html │ │ ├── socks.html │ │ └── vmess.html │ ├── protocols.html │ ├── reverse.html │ ├── routing.html │ ├── stats.html │ ├── transport/ │ │ ├── domainsocket.html │ │ ├── h2.html │ │ ├── mkcp.html │ │ ├── quic.html │ │ ├── tcp.html │ │ └── websocket.html │ └── transport.html ├── developer/ │ └── tools.html ├── gitbook/ │ ├── fonts/ │ │ └── fontawesome/ │ │ └── FontAwesome.otf │ ├── gitbook-plugin-anchors/ │ │ └── plugin.css │ ├── gitbook-plugin-ga/ │ │ └── plugin.js │ ├── gitbook-plugin-hints/ │ │ └── plugin-hints.css │ ├── gitbook-plugin-mermaid-gb3/ │ │ ├── book/ │ │ │ └── plugin.js │ │ └── mermaid/ │ │ ├── mermaid.css │ │ └── mermaid.forest.css │ ├── gitbook-plugin-prism/ │ │ ├── prism-a11y-dark.css │ │ ├── prism-atom-dark.css │ │ ├── prism-base16-ateliersulphurpool.light.css │ │ ├── prism-cb.css │ │ ├── prism-darcula.css │ │ ├── prism-dracula.css │ │ ├── prism-duotone-dark.css │ │ ├── prism-duotone-earth.css │ │ ├── prism-duotone-forest.css │ │ ├── prism-duotone-light.css │ │ ├── prism-duotone-sea.css │ │ ├── prism-duotone-space.css │ │ ├── prism-ghcolors.css │ │ ├── prism-hopscotch.css │ │ ├── prism-material-dark.css │ │ ├── prism-material-light.css │ │ ├── prism-material-oceanic.css │ │ ├── prism-pojoaque.css │ │ ├── prism-shades-of-purple.css │ │ ├── prism-synthwave84.css │ │ ├── prism-vs.css │ │ └── prism-xonokai.css │ ├── gitbook.js │ ├── style.css │ └── theme.js ├── index.html ├── styles/ │ └── website.css ├── ui_client/ │ ├── README.md │ ├── android.md │ ├── ios.md │ ├── osx.md │ ├── service.md │ └── windows.md └── welcome/ ├── command.html ├── donate.html ├── faq.html ├── help.html ├── install.html ├── start.html ├── versions.html └── workflow.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .git .cache ================================================ FILE: CNAME ================================================ www.v2ray.com ================================================ FILE: awesome/ads.html ================================================ 以及广告 · Project V 官方网站

一些推广

以下服务均由第三方提供,和 Project V 没有利益关系,但它们可能会帮助你更好地使用 Project V。

自建代理

Let's Encrypt

Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。

Vultr

Vultr 是一家提供日本、美国、欧洲等多个国家和地区机房的 VPS 主机商,价格低至 2.5 美元/月。Vultr 根据VPS使用小时来计费,使用多长时间就算多长时间,计费对应的款,并且支持支付宝(Alipay)付费。

BlueHost

BlueHost作为美国的老牌主机商,在国内也是非常受欢迎的美国主机之一。以稳定性强。速度快著称,在站长中的口碑和流行度也是非常之高。BlueHost主机商为了开拓国内市场,自2014年就推出了中文站,而且也极大的丰富了主机产品,可以满足大多数站长的建站需求。

ClouDNS

ClouDNS成立于2010年,公司位于保加利亚,提供免费和收费的 DNS 托管服务。

Bandwagon

老牌 VPS 销售商,价格低廉,性价比高。

VPN

BabyDriver

支持 V2Ray 的 VPN 服务。优惠码:bcb518

喵帕斯

V2Ray 小范围内测中。

蓝岸

基于 V2Ray 的网络加速服务。优惠码:v2ray

V2Net

提供專屬客戶端的V2Ray服務。9折促銷代碼: v2ray.com

NicoNode

支持 V2Ray 的网络加速改善服务。专属促销代码:V2RAYNOW

数字货币

LocalBitcoins

线下交易比特币

CoinCola

CoinCola 是香港场外交易平台,支持简体中文界面,买卖方几乎都是国人。网页和APP均操作流畅。订单使用支付宝、网银、微信支付,像淘宝购物一样买卖比特币。现支持BTC、ETH、BCH、USDT等货币。

币安

数字货币交易所

Coinex

数字货币交易所

CoinPayment

在线数字货币钱包

================================================ FILE: awesome/tools.html ================================================ 神一样的工具们 · Project V 官方网站

神一样的工具们

图形客户端

V2RayW

V2RayW 是一个基于 V2Ray 内核的 Windows 客户端。用户可以通过界面生成配置文件,并且可以手动更新 V2Ray 内核。下载:GitHub

V2RayN

V2RayN 是一个基于 V2Ray 内核的 Windows 客户端。下载:GitHub

Clash for Windows

下载:GitHub

V2RayX

V2RayX 是一个基于 V2Ray 内核的 Mac OS X 客户端。用户可以通过界面生成配置文件,并且可以手动更新 V2Ray 内核。V2RayX 还可以配置系统代理。下载:Github

V2RayU

V2rayU,基于v2ray核心的mac版客户端,界面友好,使用swift4.2编写,支持vmess,shadowsocks,socks5等服务协议,支持订阅, 支持二维码,剪贴板导入,手动配置,二维码分享等。下载:GitHub

V2RayC

下载:GitHub

ClashX

下载:GitHub

Qv2ray

Qv2ray:使用 Qt 编写的 v2ray 跨平台 GUI (MacOS, Windows, Linux)支持连接导入和编辑,中英文切换

下载:GitHub

官网:https://lhy0403.github.io/Qv2ray

Mellow

Mellow 是一个基于规则的全局透明代理工具,可以运行在 Windows、macOS 和 Linux 上,也可以配置成路由器透明代理或代理网关,支持 SOCKS、HTTP、Shadowsocks、VMess 等多种代理协议。

Download: Github

Kitsunebi

Kitsunebi 是一个基于 V2Ray 核心的移动平台应用 (iOS, Android)。它可以创建基于 VMess 或者 Shadowsocks 的 VPN 连接。Kitsunebi 支持导入和导出与 V2Ray 兼容的 JSON 配置。

由于使用 V2Ray 核心,Kitsunebi 几乎支持 V2Ray 的所有功能,比如 Mux 和 mKCP。

下载:iTunes | Play Store

i2Ray

i2Ray 是另一款基于 V2Ray 核心的iOS应用。界面简洁易用,适合新手用户使用。同时兼容Shadowrocket和Quantumult格式的规则导入。

下载:iTunes

Shadowrocket

Shadowrocket 是一个通用的 iOS VPN 应用,它支持众多协议,如 Shadowsocks、VMess、SSR 等。

下载:iTunes

Pepi(原名ShadowRay)

Pepi 是一个兼容 V2Ray 的 iOS 应用,它可以创建基于 VMess 的 VPN 连接,并与 V2Ray 服务器通信。

下载:iTunes

Quantumult

下载:iTunes

BifrostV

BifrostV 是一个基于 V2Ray 内核的 Android 应用,它支持 VMess、Shadowsocks、Socks 协议。

下载:Play Store | APK Pure

V2RayNG

V2RayNG 是一个基于 V2Ray 内核的 Android 应用,它可以创建基于 VMess 的 VPN 连接。

下载:Play Store | GitHub

在线工具/资源

VeekXT V2Ray配置生成

支持 4.x 版本的配置文件生成器 veekxt.com

V2Ray 配置生成器

静态 V2Ray 配置文件生成页面 GitHub

UUID Generator

VMess User ID 生成工具 uuidgenerator.net

vTemplate 项目仓库

一个 V2Ray 配置文件模板收集仓库 GitHub

================================================ FILE: chapter_00/01_versions.html ================================================ 版本历史 · Project V 官方网站

更新日志

本页列出了常规版本的功能升级记录,未列出的版本通常为 bug 修复。

2019.07.12 v4.20.0

  • 支持H2C(HTTP2不强制TLS)
  • 日志使用none级别时禁用所有显示
  • 修复Bazel 0.26+兼容
  • 一些代码优化

2019.06.03 v4.19.1

  • 路由支持自定义文件
  • 安装脚本支持小版本检测
  • 一些代码优化

2019.05.18 v4.18.2

  • 修复Windows下配置文件过大读取错误

2019.04.15 v4.18.1

  • 支持TLS1.3
  • 修复错误域名导致的崩溃
  • 修改GoCache目录的强制要求

2019.03.01 v4.18

  • 路由中的端口列表新增了混合格式。
  • 更新了路由中geosite的说明,和 DNS 服务器中静态域名列表的说明。
  • TLS 配置中添加了禁用系统 CA 的选项。
  • 路由中添加了流量属性检测,可用于检测 URL。

2019.02.22 v4.17

  • V2Ctl 中新增了 tlsping 工具。

2019.02.15 v4.16

使用相关:

  • DNS 传出代理支持修改目标 DNS 服务器的设定。

开发相关:

  • 'ext' 仓库已完全迁移到 'core'。#1541

2019.02.08 v4.15

  • DNS 传出代理。

2019.02.01 v4.14

  • DNS 支持了静态域名到域名的匹配。

2019.01.18 v4.13

  • 更新了 Quic 库,与之前的版本不兼容。
  • DNS 配置中新增了tag选项。

2019.01.11 v4.11

开发相关:

2018.12.07 v4.8

使用相关:

  • Bug 修复

开发相关:

2018.11.30 v4.7

  • Freedom 中新增了 UseIPv4 和 UseIPv6 模式。
  • 传输方式新增了 QUIC。

2018.11.23 v4.6

  • Freedom 的"UseIP"模式会根据出站所用的 IP 地址自动使用 IPv4 或 IPv6 目标地址。

2018.11.16 v4.4

  • 路由中新增了负载均衡配置。
  • 优化了内存使用效率。

2018.11.05 v4.1

  • 配置文件格式简化。主要是传入传出代理和路由部分。旧版格式仍然可用,但推荐尽快升级到最新格式。
  • 优化了 GeoIP 的性能,减少了内存占用,提升了匹配效率。

2018.11.02 v4.0

  • 反向代理
  • 新增了 ppc64 和 ppc64le 预编译包。

2018.10.12 v3.47

  • 升级了自动构建工具

2018.09.28 v3.44

  • Dokodemo-door 现已支持 Linux 的 TProxy。

2018.09.21 v3.43

  • DNS 查询支持了按域名选择服务器的功能。

2018.09.14 v3.40

  • 传输配置中新增了连接选项,可用于配置 VPN。
  • 传输配置中新增了 TCP Fast Open 选项。

2018.09.03 v3.38

  • mKCP 中新增了 WireGuard 伪装。
  • 修复了 mips/mips64 中 softfloat 版本的编译问题。

2018.08.31 v3.37

  • 优化了读取网络连接时的性能,见环境变量
  • VMess 在 ARM64 平台上将默认使用 AES-128-GCM 作为加密方式。
  • 使用 Go 1.11 编译。

2018.08.24 v3.36

  • 大幅提升了路由中子域名(domain:)匹配的效率。
  • 路由中支持了完整域名匹配。

2018.08.07 v3.34

  • 在大多数设备上有了更精确的内存控制

2018.07.27 v3.32

  • 现在可以探测 BitTorrent 流量了。
  • 路由配置中新增了protocol选项用于按流量类型进行路由选择。
  • 路由配置中新增了geosite:speedtest用于适配所有的 Speedtest.net 公用服务器。

2018.07.20 v3.31

2018.07.13 v3.30

  • 解决了一个可能会导致 mKCP 断流的问题。
  • 感谢来自俄罗斯的朋友,我们现在有俄语文档了。

2018.07.06 v3.29

  • 新增了 MTProto 代理协议。

2018.06.29 v3.27

  • DNS 支持了 EDNS client subnet。
  • DNS 的静态 IP 匹配现在支持子域名了。

2018.06.15 v3.26

  • 新增了 Dragonfly BSD 的预编译版本。

2018.06.01 v3.24

  • JSON 配置中新增了用户级别的缓存控制选项。
  • mKCP 新增了 DTLS 伪装。
  • TLS 现在默认只使用 TLS 1.3 推荐的加密套件。

2018.05.25 v3.23

  • JSON 配置文件中,端口支持从环境变量加载。
  • JSON 配置文件支持从指定文件加载 IP 和域名。

2018.04.20 v3.19

  • 入站代理的流量统计。

2018.04.13 v3.17

  • V2Ray 可直接加载来自 HTTP(s) 的配置文件。
  • V2Ray 的 TLS 可使用 CA 证书自动为任意域名签发新的证书。
  • HTTP/2 传输方式。

2018.04.06 v3.16

  • 统计信息。开启方式略麻烦,请仔细看文档。
  • Shadowsocks 入站协议现在可以只监听 UDP 端口而不监听 TCP 了。强烈建议不在同一端口上同时监听 TCP 和 UDP。

2018.03.02 v3.11

  • VMess Inbound 提供了一个选项,用于禁止客户端使用不安全的加密方式。
  • 提供了 ARMv7 编译版。
  • 提供了不要求 FPU 的 MIPS 编译版。

2018.02.23 v3.10

  • 日志格式修改,每条日志前添加了 Session ID,用于区分不同的代理请求。
  • 修复了一些问题。

2018.02.16 v3.9

  • 新年快乐!
  • 修复了一些问题。

2018.02.09 v3.7

  • 开发者预览:远程控制
  • 修复了一些问题。

2017.12.29 v3.5

  • Geoip 支持名为“Private”的私有地址列表。

2017.12.22 v3.4

  • Websocket 现在可以识别 X-Forwarded-For 并用做源地址。
  • 支持 s390x 平台。

2017.12.08 v3.1

  • 支持本地策略
  • 支持从环境变量指定的路径加载配置文件

2017.12.01 v3.0

  • 支持 Shadowsocks AEAD

2017.11.18 v2.50

  • v2ray 现在会尝试使用 v2ctl 进行配置文件解析,请确保这两个文件在同一目录下;
  • 路由中新增 IPOnDemand 策略进行同步 IP 解析;

2017.11.10 v2.47

  • geosite 的数据现在放在 geosite.dat 文件中了。
  • 一些修复。

2017.11.03 v2.46

  • 路由中添加 geosite:cn,等效于现有的chinasites,但更加灵活。
  • 路由中添加 geoip
    • 安装包中新增了geoip.dat文件,包含所有geoip信息,此文件必须和v2ray程序放置于同一路径下。由于安装脚本未及时更新,服务器端和部分客户端可能需要手动复制此文件。
  • 安装包中新增 v2ctl 程序,可使用命令v2ctl verify /path/to/v2ray来验证v2ray程序签名的有效性。

2017.10.27 v2.44

  • HTTP 代理中加入了 Basic Authentication 支持。
  • 修复了一些 bug。

2017.10.06 v2.40

  • 修复了导致内存泄漏的问题。

2017.09.29 v2.39

  • 当远程服务器关闭连接时,入站代理现在会尽快断开与客户端的连接。
  • 默认连接超时时间更改为 5 分钟。

2017.05.12 v2.27

  • 路由中新增了“域名”匹配选项。

2017.05.02 v2.26

  • 各种稳定性修复。

2017.04.28 v2.25

  • 可以简单地探测 HTTP 和 HTTPS 流量并根据其内容进行转发。

2017.04.21 v2.24

  • 修复了 Mux 的稳定性问题。
  • 提升了总体的内存使用效率。

2017.04.15 v2.23

  • 提升了 Mux 的性能。
  • Mux 中可以配置并发连接数了。
  • 提升了 HTTP 代理的性能。
  • 移除了 connectionReuse 的配置(由 Mux 替代)。

2017.04.08 v2.22

  • Mux.Cool 协议

2017.02.25 v2.20

  • 安装包中可执行文件附带了 gpg 签名。
  • Windows 安装包中带了新的 wv2ray.exe,运行时不会出现任何界面。

2017.02.18 v2.19

  • 服务器端强制开启防重放攻击(Anti replay attack)机制。
    • 不会影响任何现有客户端。
  • VMess AES-128-GCM / Chacha20-Poly1305 / None 加密方式升级。
    • 如正在使用其中任何一个加密方式,请同时升级客户端和服务器。
    • AES-128-CFB 不受影响。
  • 使用 Golang 1.8 编译,加入对 32 位 MIPS 的支持。

2017.02.11 v2.18

  • 清理了 WebSocket 相关的代码。
  • 移除了 allowPassive 设置。现在的行为相当于 allowPassive = true。
  • Bug 修复。

2017.02.04 v2.17

  • Bug 修复。

2017.01.28 v2.16

  • Freedom 中可以指定一个重定向地址,将所有数据发往这个地址。此选项可用于适配 Shadowsocks Obfs 或 KCPTun 等工具。
  • VMess 的“不加密”选项性能优化,与之前版本不兼容。
  • 新年快乐!

2017.01.16 v2.15

  • mKCP 和 WebSocket 现已适用于所有的出站(入站)协议。

2017.01.09 v2.14

  • Socks 5 出站协议。
  • mKCP 新增微信视频通话伪装。

2017.01.02 v2.13

  • 修复了一些问题。

2016.12.26 v2.12

  • 修复了一些问题。

2016.12.19 v2.11

  • JSON 配置文件可以写注释了。

2016.12.12 v2.10

  • VMess 中增加了 AES-GCM 和 Chacha20-Poly1305 加密方式;

2016.12.05 v2.9

  • 修复了与 Alpine Linux 的兼容性;

2016.11.28 v2.8

  • Shadowsocks 服务器端现接受 OTA 设置,可强制开启或关闭 OTA 验证;
  • 小修小补;

2016.11.21 v2.7

  • 现在可以给主入站出站连接设置标识了;
  • 一些小修小补;

2016.11.14 v2.6

  • 可将一个出站协议发出的数据转发至另一出站协议;
  • 路由可根据入站协议的标识来进行判断了;

2016.11.07 v2.5

  • 新增 Shadowsocks 出站协议;
  • 新增 TCP 连接中的 HTTP 头部伪装;

2016.10.24 v2.4

  • 每个入站出站协议可以配置各自的 TCP / mKCP / WebSocket 设置了;
  • 路由现可以跟据来源 IP 进行转发;

2016.10.17 v2.3

  • 重构了配置文件相关的代码,引入了基于 Protobuf 的新格式;
  • 增加了 OpenBSD 的二进程文件;
  • 小修小补;

2016.09.19 v2.2

2016.09.19 v2.1

  • mKCP 性能提升;

2016.08.20 v2.0

  • 一周年

2016.08.15 v1.24

  • mKCP 新增了 BT 数据包伪装。
  • 入站连接现在可以设置 allowPassive 来允许被动连接,如 IMAP。

2016.08.08 v1.23

  • 优化了 mKCP 数据包。此版本的 mKCP 与之前版本不兼容,请同时升级客户端和服务器。
  • mKCP 现在可以经过配置,伪装成视频通话的数据。

2016.08.01 v1.22

  • 修复了 mKCP 中一个内存泄漏问题;
  • 新增了 FreeBSD 的支持;

2016.07.25 v1.21

  • 提升了 ChaCha20 的性能(感谢 aead@);
  • 修复了一些问题;

2016.07.18 v1.20

  • KCP 中新增了 readBufferSize 和 writeBufferSize 选项;
  • 修复了一些问题;

2016.07.11 v1.19

  • 新增了 TLS 选项,平台支持的所有协议都可以开启 TLS;
  • 修复了 KCP 的性能问题;
  • 修复了一个可能导致 KCP 中 EOF 响应的问题;

2016.07.04 v1.18

  • 修复了 KCP 中连接多过的问题;
  • 降低了 KCP 对 CPU 的使用;
  • 修复了一些其它的问题;

2016.06.19 v1.17

2016.06.12 v1.16

  • TCP 连接重用默认开启;
  • Dokodemo-door 现在可以识别由 iptables 转发的数据了;
  • Blackhole 可配置自动发送 HTTP 形式的拒绝数据;

2016.06.05 v1.15

  • 增加了 TCP 连接重用选项,对于 HTTP 请求的性能有明显的提升;
  • 支持监听指定的 IP 地址而非全部;
  • 支持从指定的 IP 地址发出数据;
  • 修复了 HTTP 代理中一个可能会导致内存耗尽的问题;

2016.05.29 v1.14

  • 修复了 HTTP 代理中一个可能导致崩溃的问题;
  • 安装脚本中增加了一些功能;
  • DNS 中增加了静态路由功能;
  • 官方服务器地址变动;

2016.05.16 v1.13

  • 内置 DNS 服务,可搭配 chinasites 和 chinaip 进行更为精准的路由判断;
  • 修复了一个 UDP 转发时的问题;

2016.05.01 v1.12.1

  • 修复了 VMess 协议中的一个 bug。

2016.05.01 v1.12

  • 再次尝试修复内存使用问题;
  • 提升了 Shadowsocks 的性能;
  • loglevel 增加了新的选项“none”表示不记录任何 log;

2016.04.18 v1.11

  • 尝试修复内存使用问题。

2016.03.07 v1.10

  • 修复了动态端口刷新时的性能问题。

2016.02.29 v1.9.1

  • 修复了 Shadowsocks 中 OTA 的问题。

2016.02.29 v1.9

  • Shadowsocks 支持了 ChaCha20 加密方式;
  • 默认配置文件增加了更多的直连网站;
  • 动态端口中现已可以自动创建帐号,无需事先指定;

2016.02.22 v1.8

  • 更新了安装脚本 install-release.sh (感谢 netcookies@):
    • 现在可以自动停止 V2Ray 进程,并在更新完成后自动运行 V2Ray;
    • install-release.sh 接受 --proxy 参数并从指定的代理下载 V2Ray;
  • 使用 Go 1.6 编译,提升了 AES 加密的性能;
  • 一些小修小补;
  • 官方服务器 IP 更新,请重新下载安装包以获得最新的配置。

2016.02.08 v1.7

  • 提升了 UDP 转发的性能;
  • 提升了 Shadowsocks 的安全性;
  • 修复了一些问题;
  • 祝大家新年快乐!

2016.02.01 v1.6

2016.01.25 v1.5

  • 修复了一个 VMess 中的安全性问题,导致了 1.5 和之前版本不兼容,请同时升级你的客户端和服务器端;
  • 修复了一个路由不能正常工作的问题;
  • 动态端口
  • 略微提升了性能;

2016.01.18 v1.4

  • 更新了安装脚本,在 Debian / Ubuntu / CentOS 7 中可自动安装和更新 V2Ray;
  • 修复了一个 VMess 的内存使用问题;

2016.01.11 v1.3

  • Wiki 中更新了一些英语页面(感谢 chenxiaoqino);
  • Docker 配置文件(感谢 adoot);
  • HTTP 代理(感谢 adoot);
  • 路由中内置了常见的国内网站域名
  • VMess 配置中新增了 alterId 选项
  • 修复了若干小问题;

2015.12.14 v1.2

  • 简洁且高效的国内 IP 路由;
  • 错误日志可写入文件;
  • 路由中支持正则表达式方式的域名匹配;
  • 修复了一个 SOCKS 协议的兼容性 bug;

2015.12.07 v1.1

  • 修复了一个 VMess 协议的 bug,也导致了 1.1 和 1.0 的应用程序不兼容,配置文件不受影响;
  • 修复了一个 InboundDetourHandler 中的 bug;

2015.11.30 v1.0

V2Ray 1.0 正式版,包含以下功能:

  • Socks 4 / 5 代理协议;
  • 可以防止重放攻击的高速中继协议;
  • 静态路由功能,用户可选择性屏蔽或代理指定的 IP 段或域名;
================================================ FILE: chapter_00/02_donate.html ================================================ 捐助支持 · Project V 官方网站

资助 V2Ray 发展

V2Ray 是一个非营利项目,它的所有代码均公开,软件可以自由使用,不受限制。如果您喜爱本项目,可以通过下面的方式请作者喝一杯咖啡。

您的捐款是对 Project V 的无偿贡献,和 Project V 提供的技术和服务没有直接关联。对于每一份捐款,我们都会以邮件的方式确认。如果你不希望收到我们的邮件,请在捐款时留言注明。

对于单次捐赠的价值超过 $50,您可以从如下选项中指定一项:

  • 为期一个月的首页广告 (您的名字,或 Logo);
  • 按您的喜好修改我们的代码。限制:不可影响用户使用,不可影响文档。您的修改将保留一个月。

传统方式

Paypal

可以通过 Paypal 内部转帐 或者信用卡的方式捐赠。

由于 Paypal 收取非常高的手续费,小于 1 美元的捐赠会变得没有意义。

Patreon

Patreon 是一个定期投食的平台,即每月捐赠固定金额。一旦设定完毕,每个月都会收到我们的小礼物哦。

礼品卡

目前只支持美亚礼品卡,可在 Amazon 或者淘宝购买。请寄送至love@v2ray.com

极客方式

相比起传统方式,加密货币更适合跨境支付。加密货币通常都是匿名持有,其交易也很难被跟踪。

由于加密货币天生的匿名特性,如果有必要的话,请事先联系项目组表明捐赠者的身份。

比特币 Bitcoin

地址: 3GctrB7R5sMhJ73N4AKo56Bdf9RE3RJsuM

点此链接显示二维码

比特现金 Bitcoin Cash

地址: 15oATKUq5mEfuzasPnsJ58TjJU5SvDJK97

点此链接显示二维码

以太坊 Ethereum

地址: 0x112ee71189704fe04cabed4aa045f4461c8c8696

点此链接显示二维码。你也可以通过这个地址发送这些货币:OMG、REP、GNT、DGD

EOS

地址: EOS8Civdok4CBN3jCpsaGQijzesjKof1eyaRFuBU5mLMtWVkLsy8a

莱特币 Litecoin

地址: LVdeH2HkCgGRs8ZEpan7fkAEEPbiJ4McoR

门罗币 Monero

地址: 48kA4NyLRCWQvB7U2A77G66Z25uWbyzmoZSYjxJfrMR1J4dRFW6fWFLDn3wirAqP8ySnR4rnvoXWxfkNFhrK5ZxY1WyBqKg

瑞波币 Ripple

地址: r439fPk8DzCf4nSxkpfodEuE2cG4KVZQHq

不需要 Tag

其它

如果你想捐赠其它的加密货币,请联系我们: love@v2ray.com

================================================ FILE: chapter_00/command.html ================================================ 命令行参数 · Project V 官方网站

命令行参数

V2Ray

V2Ray 的程序文件的命令行参数如下:

v2ray [-version] [-test] [-config=config.json] [-format=json]

-version

只输出当前版本然后退出,不运行 V2Ray 主程序。

-test

测试配置文件有效性,如果有问题则输出错误信息,不运行 V2Ray 主程序。

-config

配置文件路径,可选的形式如下:

  • 本地路径,可以是一个绝对路径,或者相对路径。
  • "stdin:": 表示将从标准输入读取配置文件内容,调用者必须在输入完毕后关闭标准输入流。
  • http://https://(均为小写)开头: V2Ray 将尝试从这个远程地址加载配置文件。

-format

配置文件格式,可选的值有:

  • json: JSON 格式;
  • pbprotobuf: Protobuf 格式;

-config没有指定时,V2Ray 将先后尝试从以下路径加载config.json:

  • 工作目录(Working Directory)
  • 环境变量v2ray.location.asset所指定的路径

V2Ctl

V2Ctl 是一个集合,它有若干个子命令组成。全局的命令行形式如下:

v2ctl <command> <options>

command

子命令,有以下选项:

  • api: 调用 V2Ray 进程的远程控制指令。
  • config: 从标准输入读取 JSON 格式的配置,然后从标准输出打印 Protobuf 格式的配置。
  • cert: 生成 TLS 证书。
  • fetch: 抓取远程文件。
  • tlsping: (V2Ray 4.17+) 尝试进行 TLS 握手。
  • verify: 验证文件是否由 Project V 官方签名。
  • uuid: 输出一个随机的 UUID。

V2Ctl Api

v2ctl api [--server=127.0.0.1:8080] <Service.Method> <Request>

调用 V2Ray 进程的远程控制指令。示例:

v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger ''

V2Ctl Config

v2ctl config

此命令没有参数。它从标准输入读取 JSON 格式的配置,然后从标准输出打印 Protobuf 格式的配置。

V2Ctl Cert

v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h] [--name="V2Ray Inc"] [--org="V2Ray Inc] [--json] [--file=v2ray]

生成一个 TLS 证书。

--ca

如果指定此选项,将会生成一个 CA 证书。

--domain

证书的 Alternative Name 项。该参数可以多次使用,来指定多个域名。比如--domain=v2ray.com --domain=v2ray.cool

--expire

证书有效期。格式为 Golang 的时间长度

--name

证书的 Command Name 项。

--org

证书的 Orgnization 项。

--json

将生成的证书以 V2Ray 支持的 JSON 格式输出到标准输出。默认开启。

--file

将证书以 PEM 格式输出到文件。当指定 --file=a 时,将生成 a_cert.pema_key.pem 两个文件。

V2Ctl Fetch

v2ctl fetch <url>

抓取指定的 URL 的内容并输出,只支持 HTTP 和 HTTPS。

V2Ctl TlsPing

v2ctl tlsping <domain> --ip=[ip]

向指定的域名发起 TLS 握手。

domain

目标域名

--ip

此域名的 IP 地址。如果未指定此参数,V2Ctl 将使用系统的 DNS 进行域名解析。

V2Ctl Verify

v2ctl verify [--sig=/path/to/sigfile] <filepath>

此命令用于验证一个文件是否由 Project V 官方签名。

--sig

签名文件路径,默认值为待验证文件加入'.sig'后缀。

filepath

待验证文件路径。

V2Ctl UUID

v2ctl uuid

此命令没有参数。每次运行都会输出一个新的 UUID。

================================================ FILE: chapter_00/faq.html ================================================ 常见问题 · Project V 官方网站

常见问题

一般问题

制作 V2Ray 的目的是什么?

对于已公开的合法信息,人民有自由获取的权利。同时,人民也有言论自由的权利。

是否反对管制?

不反对管制。事实上任何事物都需要管制,以减少大众的生活成本,比如奶粉。但监管需要有法可依、有据可循。民众都认可的监管方式也是合理的,可接受的。

Project V 由谁主导开发?

我们是一群爱好自由的人们。由于政策压力,我们倾向于保持匿名,尽可能地不透露任何身份信息。

V2Ray 使用相关

V2Ray 如何升级

  • 重新下载安装包,或者
  • 如果你使用安装脚本进行安装,重新运行安装脚本即可

V2Ray 闪退

  • 如果你使用 Linux 并开启了 systemd,可以使用 journalctl -u v2ray 查看 V2Ray 退出时的日志;
  • 一般情况可以手动运行 v2ray -config=<config-file> -test 来查看错误信息;

兼容性保证

  • 配置文件向后兼容至少一个大版本,即 V2Ray 4.x 可以正常加载 3.x 的配置文件。
  • 所有基于 Protobuf 的通信协议,如 Api,向后兼容至少一个大版本。
  • 所有基于二进制的通信协议,如 Shadowsocks 和 VMess。当服务器版本不低于客户端版本时,保持永久兼容;当客户端版本超过服务器版本时,保持至少 12 个小版本的兼容性。

V2Ray 错误信息

VMess: Invalid User

可能的原因:

  1. 客户端和服务器端的用户 ID 不匹配;
  2. 客户端和服务器端的用户 alterId 不匹配;
  3. 客户端与服务器的时间不匹配,误差不能超过90秒钟;

Shadowsocks: Unknown address type

可能的原因:

  1. Shadowsocks 协议的加密方式或是密码不匹配;

Socks: Unknown Socks version: 67

可能的原因:

  • 你开启的是 Socks 代理,但在浏览器中配置了 HTTP 代理

解决方案:

  • 在 V2Ray 中配置一个 HTTP 入站代理,然后把浏览器的设置指向这个代理

其它软件错误

访问 Google 时,浏览器中显示证书无效

错误信息:攻击者可能会试图从 www.google.com 窃取您的信息(例如:密码、通讯内容或信用卡信息)。了解详情 NET::ERR_CERT_COMMON_NAME_INVALID

原因:你的 DNS 缓存可能已被污染。

解决方案:

  • 需要在使用代理的情况下,清空缓存并重新抓取 DNS 数据
  • 在 V2Ray 中可使用sniffing功能克服一部分 DNS 污染。

项目授权

Project V 使用以下方式进行授权

V2Ray

源代码以官方发布的安装包,使用 MIT 协议授权。包括以下代码仓库中的源代码及安装包:

官方网站

官方网站(v2ray.com)以知识共享署名 4.0 国际许可协议协议授权。

软件截图和其它文件

第三方所创作的内容,其版权归其创作者所有。Project V 放弃对这些内容的所有权。

  • 包括 Project V 使用过程中的截图。
  • 包括运行 Project V 所需的配置文件。
  • 包括 Project V 运行时产生的日志文件。

其它内容

未在上述提及的内容,其版权视具体情况而定。

================================================ FILE: chapter_00/help.html ================================================ 寻求帮助 · Project V 官方网站

寻求帮助

Project V 提供了多种方式进行交流。

Project V 团队支持中文和英文,请选择你所熟悉的语言来提问,以避免一些不必要的误会。管理员会以问题发起者使用的语言来回复;如果提问者使用了其它的语言,则以英文回复。

Github Issue

我们使用几个不同的仓库进行不同类型的讨论。

Telegram 讨论组

Project V 提供了下列讨论组,用于讨论不同类型的问题。

  • 使用
    • 仅用于讨论 Project V 使用相关问题。
    • 严禁任何不相关的话题。
  • 日常
    • 用于其它不相关的话题。

Project V 的所有讨论组都不可以发布 18 禁、政治相关、仇恨言论,一旦发现立即封禁。

另外请关注 Project V 官方公告 以获得最新资讯。

Twitter

ProjectV2Ray 用于常规的项目进展通知。

Email

如果你想和 V2Ray 的开发人员私下讨论一些问题,可以通过下列的邮箱联系。

love@v2ray.com: 基于 Gmail,主要通信邮箱,基本每天都查看。

v2ray@protonmail.com: 基于 Protonmail,端对端加密安全性高,但登录不方便,不能做到每天都收邮件。

由于工作繁忙,不能保证每封邮件都回复,请见谅。请尽量使用社区讨论以得到更快速的社区响应。

如果你需要发送加密信息,可以搜索love@v2ray.com相关联的 PGP 公钥,或者从下面的文本导入。

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org

mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu
3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85
c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs
0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w
EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk
CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj
OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY
cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m
uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV
va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF
5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB
tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP
eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu
ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY
WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM
iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG
1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5
iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm
ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM
otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe
3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q
dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT
swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh
SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc
tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt
kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB
8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/
ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y
1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO
SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+
GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/
KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/
b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy
ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN
dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP
eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV
9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB
TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt
6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ
IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+
2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT
tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH
iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6
U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD
WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B
X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt
PeRpd1GUXXeoGCw=
=To5T
-----END PGP PUBLIC KEY BLOCK-----
================================================ FILE: chapter_00/install.html ================================================ 下载安装 · Project V 官方网站

下载安装

平台支持

V2Ray 在以下平台中可用:

  • Windows 7 及之后版本(x86 / amd64);
  • Mac OS X 10.10 Yosemite 及之后版本(amd64);
  • Linux 2.6.23 及之后版本(x86 / amd64 / arm / arm64 / mips64 / mips);
    • 包括但不限于 Debian 7 / 8、Ubuntu 12.04 / 14.04 及后续版本、CentOS 6 / 7、Arch Linux;
  • FreeBSD (x86 / amd64);
  • OpenBSD (x86 / amd64);
  • Dragonfly BSD (amd64);

下载 V2Ray

预编译的压缩包可以在如下几个站点找到:

  1. Github Release: github.com/v2ray/v2ray-core
  2. Github 分流: github.com/v2ray/dist
  3. Homebrew: github.com/v2ray/homebrew-v2ray
  4. Arch Linux: packages/community/x86_64/v2ray/
  5. Snapcraft: snapcraft.io/v2ray-core

压缩包均为 zip 格式,找到对应平台的压缩包,下载解压即可使用。

验证安装包

V2Ray 提供两种验证方式:

  1. 安装包 zip 文件的 SHA1 / SHA256 摘要,在每个安装包对应的.dgst文件中可以找到。
  2. 可运行程序(v2ray 或 v2ray.exe)的 gpg 签名,文件位于安装包中的 v2ray.sig 或 v2ray.exe.sig。签名公钥可以在代码库中找到。

Windows 和 Mac OS 安装方式

通过上述方式下载的压缩包,解压之后可看到 v2ray 或 v2ray.exe。直接运行即可。

Linux 发行版仓库

部分发行版可能已收录 V2Ray 到其官方维护和支持的软件仓库/软件源中。出于兼容性、适配性考虑,您可以考虑选用由您发行版开发团队维护的软件包或下文的安装脚本亦或基于已发布的二进制文件或源代码安装。

Linux 安装脚本

V2Ray 提供了一个在 Linux 中的自动化安装脚本。这个脚本会自动检测有没有安装过 V2Ray,如果没有,则进行完整的安装和配置;如果之前安装过 V2Ray,则只更新 V2Ray 二进制程序而不更新配置。

以下指令假设已在 su 环境下,如果不是,请先运行 sudo su。

运行下面的指令下载并安装 V2Ray。当 yum 或 apt-get 可用的情况下,此脚本会自动安装 unzip 和 daemon。这两个组件是安装 V2Ray 的必要组件。如果你使用的系统不支持 yum 或 apt-get,请自行安装 unzip 和 daemon

bash <(curl -L -s https://install.direct/go.sh)

此脚本会自动安装以下文件:

  • /usr/bin/v2ray/v2ray:V2Ray 程序;
  • /usr/bin/v2ray/v2ctl:V2Ray 工具;
  • /etc/v2ray/config.json:配置文件;
  • /usr/bin/v2ray/geoip.dat:IP 数据文件
  • /usr/bin/v2ray/geosite.dat:域名数据文件

此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。

运行脚本位于系统的以下位置:

  • /etc/systemd/system/v2ray.service: Systemd
  • /etc/init.d/v2ray: SysV

脚本运行完成后,你需要:

  1. 编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;
  2. 运行 service v2ray start 来启动 V2Ray 进程;
  3. 之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。

go.sh 参数

go.sh 支持如下参数,可在手动安装时根据实际情况调整:

  • -p--proxy: 使用代理服务器来下载 V2Ray 的文件,格式与 curl 接受的参数一致,比如 "socks5://127.0.0.1:1080""http://127.0.0.1:3128"
  • -f--force: 强制安装。在默认情况下,如果当前系统中已有最新版本的 V2Ray,go.sh 会在检测之后就退出。如果需要强制重装一遍,则需要指定该参数。
  • --version: 指定需要安装的版本,比如 "v1.13"。默认值为最新版本。
  • --local: 使用一个本地文件进行安装。如果你已经下载了某个版本的 V2Ray,则可通过这个参数指定一个文件路径来进行安装。

示例:

  • 使用地址为 127.0.0.1:1080 的 SOCKS 代理下载并安装最新版本:./go.sh -p socks5://127.0.0.1:1080
  • 安装本地的 v1.13 版本:./go.sh --version v1.13 --local /path/to/v2ray.zip

Docker

V2Ray 提供了两个预编译的 Docker image:

  • v2ray/official: 包含最新发布的版本,每周跟随新版本更新;
  • v2ray/dev: 包含由最新的代码编译而成的程序文件,随代码库更新;

两个 image 的文件结构相同:

  • /etc/v2ray/config.json: 配置文件
  • /usr/bin/v2ray/v2ray: V2Ray 主程序
  • /usr/bin/v2ray/v2ctl: V2Ray 辅助工具
  • /usr/bin/v2ray/geoip.dat: IP 数据文件
  • /usr/bin/v2ray/geosite.dat: 域名数据文件
================================================ FILE: chapter_00/start.html ================================================ 新手上路 · Project V 官方网站

新手上路

在下载并安装了 V2Ray 之后,你需要对它进行一下配置。这里介绍一下简单的配置方式,只是为了演示,如需配置更复杂的功能,请参考后续的配置文件说明

客户端

在你的 PC (或手机)中,你需要运行 V2Ray 并使用下面的配置:

{
  "inbounds": [{
    "port": 1080,  // SOCKS 代理端口,在浏览器中需配置代理并指向这个端口
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "server", // 服务器地址,请修改为你自己的服务器 ip 或域名
        "port": 10086,  // 服务器端口
        "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
      }]
    }
  },{
    "protocol": "freedom",
    "tag": "direct",
    "settings": {}
  }],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [{
      "type": "field",
      "ip": ["geoip:private"],
      "outboundTag": "direct"
    }]
  }
}

上述配置唯一要改的地方就是你的服务器 IP,配置中已注明。上述配置会把除了局域网(比如访问路由器)之外的所有流量转发到你的服务器。

服务器

然后你需要一台防火墙外的服务器,来运行服务器端的 V2Ray。配置如下:

{
  "inbounds": [{
    "port": 10086, // 服务器监听端口,必须和上面的一样
    "protocol": "vmess",
    "settings": {
      "clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  }]
}

服务器的配置中需要确保 id 和端口与客户端一致,就可以正常连接了。

运行

  • 在 Windows 和 macOS 中,配置文件通常是 V2Ray 同目录下的 config.json 文件。直接运行 v2rayv2ray.exe 即可。
  • 在 Linux 中,配置文件通常位于 /etc/v2ray/config.json 文件。运行 v2ray --config=/etc/v2ray/config.json,或使用 systemd 等工具把 V2Ray 作为服务在后台运行。

更多详见的说明可以参考白话文教程配置文件说明

================================================ FILE: chapter_00/workflow.html ================================================ 使用方式 · Project V 官方网站

工作机制

单服务器模式

和其它的网络代理工具一样,你需要在一台配置了 V2Ray 的服务器,然后在自己的设备上安装 V2Ray 客户端,然后即可流畅地访问互联网。

graph LR; A(PC) -.- B(防火墙); B -.-> C(墙外网站); A --> D(V2Ray/VPS); D --> C; A --> E(墙内网站);

一个 V2Ray 服务器可同时支持多台设备,使用不同的代理协议访问。同时,经过合理的配置,V2Ray 可以识别并区分需要代理和不需要代理的流量,直连的流量不需要绕路。

桥接模式

如果你不想在每一台设备上都配置路由,你也可以设置一台中转服务器,用于接收客户端发来的所有流量,然后在服务器中进行转发判断。

graph LR; A(PC) -.-> B(防火墙); B -.-> C(墙外网站); A --> D(墙内VPS); D --> E(墙外VPS); E --> C; D --> F(墙内网站);

工作原理

在配置 V2Ray 之前,不妨先来看一下 V2Ray 的工作原理,以下是单个 V2Ray 进程的内部结构示意图。多个 V2Ray 之间互相独立,互不影响。

graph LR; A1(inbound) --> D(Dispatcher / Router / DNS); A2(inbound) --> D; A3(inbound) --> D; A4(inbound) --> D; D --> B1(outbound); D --> B2(outbound); D --> B3(outbound); D --> B4(outbound);
  • 需要配置至少一个入站协议(Inbound)和一个出站协议(Outbound)才可以正常工作。协议列表见第二章节。
    • 入站协议负责与客户端(如浏览器)通信:
      • 入站协议通常可以配置用户认证,如 ID 和密码等;
      • 入站协议收到数据之后,会交给分发器(Dispatcher)进行分发;
    • 出站协议负责将数据发给服务器,如另一台主机上的 V2Ray。
  • 当有多个出站协议时,可以配置路由(Routing)来指定某一类流量由某一个出站协议发出。
    • 路由会在必要时查询 DNS 以获取更多信息来进行判断。

具体的配置格式详见第二章节

================================================ FILE: chapter_02/01_overview.html ================================================ 文件格式 · Project V 官方网站

配置文件格式

V2Ray 的配置文件形式如下,客户端和服务器通用一种形式,只是实际的配置不一样。

{
  "log": {},
  "api": {},
  "dns": {},
  "stats": {},
  "routing": {},
  "policy": {},
  "reverse": {},
  "inbounds": [],
  "outbounds": [],
  "transport": {}
}

log: LogObject

日志配置,表示 V2Ray 如何输出日志。

api: ApiObject

内置的远程控置 API,详见远程控制配置

dns: DnsObject

内置的 DNS 服务器,若此项不存在,则默认使用本机的 DNS 设置。详见DNS 配置

routing: RoutingObject

路由配置

policy: PolicyObject

本地策略可进行一些权限相关的配置,详见本地策略

inbounds: [InboundObject]

一个数组,每个元素是一个入站连接配置

outbounds: [OutboundObject]

一个数组,每个元素是一个出站连接配置。列表中的第一个元素作为主出站协议。当路由匹配不存在或没有匹配成功时,流量由主出站协议发出。

transport: TransportObject

用于配置 V2Ray 如何与其它服务器建立和使用网络连接。详见底层传输配置

stats: StatsObject

当此项存在时,开启统计信息

reverse: ReverseObject

反向代理配置。

LogObject

{
  "access": "文件地址",
  "error": "文件地址",
  "loglevel": "warning"
}

access: string

访问日志的文件地址,其值是一个合法的文件地址,如"/tmp/v2ray/_access.log"(Linux)或者"C:\\Temp\\v2ray\\_access.log"(Windows)。当此项不指定或为空值时,表示将日志输出至 stdout。V2Ray 4.20 加入了特殊值none,即关闭access log。

error: string

错误日志的文件地址,其值是一个合法的文件地址,如"/tmp/v2ray/_error.log"(Linux)或者"C:\\Temp\\v2ray\\_error.log"(Windows)。当此项不指定或为空值时,表示将日志输出至 stdout。V2Ray 4.20 加入了特殊值none,即关闭error log(跟loglevel: "none"等价)。

loglevel: "debug" | "info" | "warning" | "error" | "none"

错误日志的级别。默认值为"warning"

  • "debug": 只有开发人员能看懂的信息。同时包含所有"info"内容。
  • "info": V2Ray 在运行时的状态,不影响正常使用。同时包含所有"warning"内容。
  • "warning": V2Ray 遇到了一些问题,通常是外部问题,不影响 V2Ray 的正常运行,但有可能影响用户的体验。同时包含所有"error"内容。
  • "error": V2Ray 遇到了无法正常运行的问题,需要立即解决。
  • "none": 不记录任何内容。

InboundObject

入站连接用于接收从客户端(浏览器或上一级代理服务器)发来的数据,可用的协议请见协议列表

{
  "port": 1080,
  "listen": "127.0.0.1",
  "protocol": "协议名称",
  "settings": {},
  "streamSettings": {},
  "tag": "标识",
  "sniffing": {
    "enabled": false,
    "destOverride": ["http", "tls"]
  },
  "allocate": {
    "strategy": "always",
    "refresh": 5,
    "concurrency": 3
  }
}

port: number | "env:variable" | string

端口。接受的格式如下:

  • 整型数值: 实际的端口号。
  • 环境变量: 以"env:"开头,后面是一个环境变量的名称,如"env:PORT"。V2Ray 会以字符串形式解析这个环境变量。
  • 字符串: 可以是一个数值类型的字符串,如"1234";或者一个数值范围,如"5-10"表示端口 5 到端口 10 这 6 个端口。

当只有一个端口时,V2Ray 会在此端口监听入站连接。当指定了一个端口范围时,取决于allocate设置。

listen: address

监听地址,只允许 IP 地址,默认值为"0.0.0.0",表示接收所有网卡上的连接。除此之外,必须指定一个现有网卡的地址。

protocol: string

连接协议名称,可选的值见协议列表

settings: InboundConfigurationObject

具体的配置内容,视协议不同而不同。详见每个协议中的InboundConfigurationObject

streamSettings: StreamSettingsObject

底层传输配置

tag: string

此入站连接的标识,用于在其它的配置中定位此连接。当其不为空时,其值必须在所有tag中唯一。

sniffing: SniffingObject

尝试探测流量的类型

allocate: AllocateObject

端口分配设置

SniffingObject

{
  "enabled": false,
  "destOverride": ["http", "tls"]
}

enabled: true | false

是否开启流量探测。

destOverride: ["http" | "tls"]

当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。

AllocateObject

{
  "strategy": "always",
  "refresh": 5,
  "concurrency": 3
}

strategy: "always" | "random"

端口分配策略。"always"表示总是分配所有已指定的端口,port中指定了多少个端口,V2Ray 就会监听这些端口。"random"表示随机开放端口,每隔refresh分钟在port范围中随机选取concurrency个端口来监听。

refresh: number

随机端口刷新间隔,单位为分钟。最小值为2,建议值为5。这个属性仅当strategy = random时有效。

concurrency: number

随机端口数量。最小值为1,最大值为port范围的三分之一。建议值为3

OutboundObject

出站连接用于向远程网站或下一级代理服务器发送数据,可用的协议请见协议列表

{
  "sendThrough": "0.0.0.0",
  "protocol": "协议名称",
  "settings": {},
  "tag": "标识",
  "streamSettings": {},
  "proxySettings": {
    "tag": "another-outbound-tag"
  },
  "mux": {}
}

sendThrough: address

用于发送数据的 IP 地址,当主机有多个 IP 地址时有效,默认值为"0.0.0.0"

protocol: string

连接协议名称,可选的值见协议列表

settings: OutboundConfigurationObject

具体的配置内容,视协议不同而不同。详见每个协议中的OutboundConfigurationObject

tag: string

此出站连接的标识,用于在其它的配置中定位此连接。当其值不为空时,必须在所有 tag 中唯一。

streamSettings: StreamSettingsObject

底层传输配置

proxySettings: ProxySettingsObject

出站代理配置。当出站代理生效时,此出站协议的streamSettings将不起作用。

mux: MuxObject

Mux 配置

ProxySettingsObject

{
  "tag": "another-outbound-tag"
}

tag: string

当指定另一个出站协议的标识时,此出站协议发出的数据,将被转发至所指定的出站协议发出。

================================================ FILE: chapter_02/02_protocols.html ================================================ 协议列表 · Project V 官方网站

V2Ray 协议列表

V2Ray 支持以下协议:

================================================ FILE: chapter_02/03_routing.html ================================================ 路由配置 · Project V 官方网站

路由功能

V2Ray 内建了一个简单的路由功能,可以将入站数据按需求由不同的出站连接发出,以达到按需代理的目的。这一功能的常见用法是分流国内外流量,V2Ray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。

RoutingObject

RoutingObject 对应主配置文件中的routing项。

{
  "domainStrategy": "AsIs",
  "rules": [],
  "balancers": []
}

domainStrategy: "AsIs" | "IPIfNonMatch" | "IPOnDemand"

域名解析策略,根据不同的设置使用不同的策略。

  • "AsIs": 只使用域名进行路由选择。默认值。
  • "IPIfNonMatch": 当域名没有匹配任何规则时,将域名解析成 IP(A 记录或 AAAA 记录)再次进行匹配;
    • 当一个域名有多个 A 记录时,会尝试匹配所有的 A 记录,直到其中一个与某个规则匹配为止;
    • 解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名;
  • "IPOnDemand": 当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配;

rules: [RuleObject]

对应一个数组,数组中每个元素是一个规则。对于每一个连接,路由将根据这些规则依次进行判断,当一个规则生效时,即将这个连接转发至它所指定的outboundTag(或balancerTag,V2Ray 4.4+)。当没有匹配到任何规则时,流量默认由主出站协议发出。

balancers: [ BalancerObject ]

(V2Ray 4.4+)一个数组,数组中每个元素是一个负载均衡器的配置。当一个规则指向一个负载均衡器时,V2Ray 会通过此负载均衡器选出一个出站协议,然后由它转发流量。

RuleObject

{
  "type": "field",
  "domain": [
    "baidu.com",
    "qq.com",
    "geosite:cn"
  ],
  "ip": [
    "0.0.0.0/8",
    "10.0.0.0/8",
    "fc00::/7",
    "fe80::/10",
    "geoip:cn"
  ],
  "port": "53,443,1000-2000",
  "network": "tcp",
  "source": [
    "10.0.0.1"
  ],
  "user": [
    "love@v2ray.com"
  ],
  "inboundTag": [
    "tag-vmess"
  ],
  "protocol":["http", "tls", "bittorrent"],
  "attrs": "attrs[':method'] == 'GET'",
  "outboundTag": "direct",
  "balancerTag": "balancer"
}

当多个属性同时指定时,这些属性需要同时满足,才可以使当前规则生效。如果多个规则分别使用了domain或者ip,需要对应添加多条规则。

type: "field"

目前只支持"field"这一个选项。

domain: [string]

一个数组,数组每一项是一个域名的匹配。有以下几种形式:

  • 纯字符串: 当此字符串匹配目标域名中任意部分,该规则生效。比如"sina.com"可以匹配"sina.com"、"sina.com.cn"和"www.sina.com",但不匹配"sina.cn"。
  • 正则表达式: 由"regexp:"开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如"regexp:\\.goo.*\\.com$"匹配"www.google.com"、"fonts.googleapis.com",但不匹配"google.com"。
  • 子域名 (推荐): 由"domain:"开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如"domain:v2ray.com"匹配"www.v2ray.com"、"v2ray.com",但不匹配"xv2ray.com"。
  • 完整匹配: 由"full:"开始,余下部分是一个域名。当此域名完整匹配目标域名时,该规则生效。例如"full:v2ray.com"匹配"v2ray.com"但不匹配"www.v2ray.com"。
  • 预定义域名列表:由"geosite:"开头,余下部分是一个名称,如geosite:google或者geosite:cn。名称及域名列表参考预定义域名列表
  • 从文件中加载域名: 形如"ext:file:tag",必须以ext:(小写)开头,后面跟文件名和标签,文件存放在资源目录中,文件格式与geosite.dat相同,标签必须在文件中存在。

ip: [string]

一个数组,数组内每一个元素代表一个 IP 范围。当某一元素匹配目标 IP 时,此规则生效。有以下几种形式:

  • IP: 形如"127.0.0.1"
  • CIDR: 形如"10.0.0.0/8".
  • GeoIP: 形如"geoip:cn",必须以geoip:(小写)开头,后面跟双字符国家代码,支持几乎所有可以上网的国家。
    • 特殊值:"geoip:private" (V2Ray 3.5+),包含所有私有地址,如127.0.0.1
  • 从文件中加载 IP: 形如"ext:file:tag",必须以ext:(小写)开头,后面跟文件名和标签,文件存放在资源目录中,文件格式与geoip.dat相同标签必须在文件中存在。

"ext:geoip.dat:cn"等价于"geoip:cn"

port:number | string

端口范围,有三种形式:

  • "a-b": a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间,当目标端口落在此范围内时,此规则生效。
  • a: a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。
  • (V2Ray 4.18+) 以上两种形式的混合,以逗号","分隔。形如:"53,443,1000-2000"

network: "tcp" | "udp" | "tcp,udp"

可选的值有"tcp"、"udp"或"tcp,udp",当连接方式是指定的方式时,此规则生效。

source: [string]

一个数组,数组内每一个元素是一个 IP 或 CIDR。当某一元素匹配来源 IP 时,此规则生效。

user: [string]

一个数组,数组内每一个元素是一个邮箱地址。当某一元素匹配来源用户时,此规则生效。当前 Shadowsocks 和 VMess 支持此规则。

inboundTag: [string]

一个数组,数组内每一个元素是一个标识。当某一元素匹配入站协议的标识时,此规则生效。

protocol: [ "http" | "tls" | "bittorrent" ]

一个数组,数组内每一个元素表示一种协议。当某一个协议匹配当前连接的流量时,此规则生效。必须开启入站代理中的sniffing选项。

attrs: string

(V2Ray 4.18+) 一段脚本,用于检测流量的属性值。当此脚本返回真值时,此规则生效。

脚本语言为 Starlark,它的语法是 Python 的子集。脚本接受一个全局变量attrs,其中包含了流量相关的属性。

目前只有 http 入站代理会设置这一属性。

示例:

  • 检测 HTTP GET: "attrs[':method'] == 'GET'"
  • 检测 HTTP Path: "attrs[':path'].startswith('/test')"
  • 检测 Content Type: "attrs['accept'].index('text/html') >= 0"

outboundTag: string

对应一个额外出站连接配置的标识。

balancerTag: string

对应一个负载均衡器的标识。balancerTagoutboundTag须二选一。当同时指定时,outboundTag生效。

BalancerObject

负载均衡器配置。当一个负载均衡器生效时,它会从指定的出站协议中,按配置选出一个最合适的出站协议,进行流量转发。

{
  "tag": "balancer",
  "selector": []
}

tag: string

此负载均衡器的标识,用于匹配RuleObject中的balancerTag

selector: [ string ]

一个字符串数组,其中每一个字符串将用于和出站协议标识的前缀匹配。在以下几个出站协议标识中:[ "a", "ab", "c", "ba" ]"selector": ["a"]将匹配到[ "a", "ab" ]

如果匹配到多个出站协议,负载均衡器目前会从中随机选出一个作为最终的出站协议。

预定义域名列表

此列表由 domain-list-community 项目维护,预置于每一个 V2Ray 的安装包中,文件名为geosite.dat

这个文件包含了一些常见的域名,可用于路由和 DNS 筛选。常用的域名有:

  • category-ads: 包含了常见的广告域名。
  • category-ads-all: 包含了常见的广告域名,以及广告提供商的域名。
  • cn: 相当于 geolocation-cntld-cn 的合集。
  • google: 包含了 Google 旗下的所有域名。
  • facebook: 包含了 Facebook 旗下的所有域名。
  • geolocation-cn: 包含了常见的国内站点的域名。
  • geolocation-!cn: 包含了常见的非国内站点的域名。
  • speedtest: 包含了所有 Speedtest 所用的域名。
  • tld-cn: 包含了所有 .cn 和 .中国 结尾的域名。
================================================ FILE: chapter_02/04_dns.html ================================================ DNS 配置 · Project V 官方网站

DNS 服务器

V2Ray 内置了一个 DNS 服务器,其有两大主要用途:根据域名的解析IP匹配路由规则,以及像传统的DNS功能,解析目标地址进行连接。

由此 DNS 服务器所发出的 DNS 查询请求,会自动根据路由配置进行转发,无需额外配置。

由于 DNS 协议的复杂性,V2Ray 只支持最基本的 IP 查询(A 和 AAAA 记录)。推荐使用本机 DNS 配合一个额外的 DNS 服务器来做 DNS 查询,如 CoreDNS,以使用完整的 DNS 功能。

注意:在freedom协议的outbound中,domainStrategy默认值为AsIs,不会使用本DNS服务器进行目的地址解析,如果需要使用应配置为UseIP

DNS 处理流程

当某个 DNS 服务器指定的域名列表匹配了当前要查询的域名,V2Ray 会优先使用这个 DNS 服务器进行查询,否则按从上往下的顺序进行查询,同时只返回匹配 expectIPs 的 IP 列表。

DNS服务器的处理流程示意图如下:

DnsObject

DnsObject对应配置文件中的dns项。

{
  "hosts": {
    "baidu.com": "127.0.0.1"
  },
  "servers": [
    {
      "address": "1.2.3.4",
      "port": 5353,
      "domains": [
        "domain:v2ray.com"
      ],
      "expectIPs": [
        "geoip:cn"
      ],
    },
    "8.8.8.8",
    "8.8.4.4",
    "localhost"
  ],
  "clientIp": "1.2.3.4",
  "tag": "dns_inbound"
}

hosts: map{string: address}

静态 IP 列表,其值为一系列的"域名":"地址"。其中地址可以是 IP 或者域名。在解析域名时,如果域名匹配这个列表中的某一项,当该项的地址为 IP 时,则解析结果为该项的 IP,而不会使用下述的 servers 进行解析;当该项的地址为域名时,会使用此域名进行 IP 解析,而不使用原始域名。

域名的格式有以下几种形式:

  • 纯字符串: 当此域名完整匹配目标域名时,该规则生效。例如"v2ray.com"匹配"v2ray.com"但不匹配"www.v2ray.com"。
  • 正则表达式: 由"regexp:"开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如"regexp:\\.goo.*\\.com$"匹配"www.google.com"、"fonts.googleapis.com",但不匹配"google.com"。
  • 子域名 (推荐): 由"domain:"开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如"domain:v2ray.com"匹配"www.v2ray.com"、"v2ray.com",但不匹配"xv2ray.com"。
  • 子串: 由"keyword:"开始,余下部分是一个字符串。当此字符串匹配目标域名中任意部分,该规则生效。比如"keyword:sina.com"可以匹配"sina.com"、"sina.com.cn"和"www.sina.com",但不匹配"sina.cn"。
  • 预定义域名列表:由"geosite:"开头,余下部分是一个名称,如geosite:google或者geosite:cn。名称及域名列表参考预定义域名列表

servers: [string | ServerObject ]

一个 DNS 服务器列表,支持的类型有两种:DNS地址(字符串形式)和ServerObject

当它的值是一个 DNS IP 地址时,如"8.8.8.8",V2Ray 会使用此地址的 53 端口进行 DNS 查询。

当值为"localhost"时,表示使用本机预设的 DNS 配置。

当值是"https://host:port/dns-query"的形式,如"https://dns.google/dns-query",V2Ray 会使用DNS over HTTPS (RFC8484, 简称DOH) 进行查询。有些服务商拥有IP别名的证书,可以直接写IP形式,比如https://1.1.1.1/dns-query。也可使用非标准端口和路径,如"https://a.b.c.d:8443/my-dns-query" (4.22.0+)

当值是"https+local://host:port/dns-query"的形式,如"https+local://dns.google/dns-query",V2Ray 会使用 DOH本地模式 进行查询,即DOH请求不会经过Routing/Outbound等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。(4.22.0+)

当使用 localhost 时,本机的 DNS 请求不受 V2Ray 控制,需要额外的配置才可以使 DNS 请求由 V2Ray 转发。

不同规则初始化得到的DNS客户端会在V2Ray启动日志中以info级别体现,比如local DOH remote DOH udp等模式。(4.22.0+)

clientIp: string

当前系统的 IP 地址,用于 DNS 查询时,通知服务器客户端的所在位置。不能是私有地址。

tag: string

(V2Ray 4.13+) 由此 DNS 发出的查询流量,除localhostDOHL_ 模式外,都会带有此标识,可在路由使用inboundTag进行匹配。

ServerObject

{
  "address": "1.2.3.4",
  "port": 5353,
  "domains": [
    "domain:v2ray.com"
  ],
  "expectIPs": [
    "geoip:cn"
  ]
}

address: address

DNS 服务器地址,如"8.8.8.8"。对于普通DNS IP地址只支持 UDP 协议的 DNS 服务器,若地址是以"https://"或"https+local://"开头的URL形式,则使用DOH模式,规则同字符串模式的DOH配置。

port: number

DNS 服务器端口,如53。此项缺省时默认为53。当使用DOH模式该项无效,非标端口应在URL中指定。

domains: [string]

一个域名列表,此列表包含的域名,将优先使用此服务器进行查询。域名格式和路由配置中相同。

expectIPs:[string]

(V2Ray 4.22.0+) 一个 IP 范围列表,格式和路由配置中相同。

当配置此项时,V2Ray DNS 会对返回的 IP 的进行校验,只返回包含 expectIPs 列表中的地址。

如果未配置此项,会原样返回 IP 地址。

================================================ FILE: chapter_02/05_transport.html ================================================ 传输配置 · Project V 官方网站

底层传输配置

底层传输方式(transport)是当前 V2Ray 节点和其它节点对接的方式。底层传输方式提供了稳定的数据传输通道。通常来说,一个网络连接的两端需要有对称的传输方式。比如一端用了 WebSocket,那么另一个端也必须使用 WebSocket,否则无法建立连接。

底层传输(transport)配置分为两部分,一是全局设置(TransportObject),二是分协议配置(StreamSettingsObject)。分协议配置可以指定每个单独的入站出站协议用怎样的方式传输。通常来说客户端和服务器对应的出站入站协议需要使用同样的传输方式。当分协议传输配置指定了一种传输方式,但没有填写其设置时,此传输方式会使用全局配置中的设置。

TransportObject

TransportObject对应配置文件的transport项。

{
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {}
}

tcpSettings: TcpObject

针对 TCP 连接的配置

kcpSettings: KcpObject

针对 mKCP 连接的配置

wsSettings: WebSocketObject

针对 WebSocket 连接的配置

httpSettings: HttpObject

针对 HTTP/2 连接的配置

dsSettings: DomainSocketObject

针于Domain Socket 连接的配置

quicSettings: QUICObject

(V2Ray 4.7+) 针于QUIC 连接的配置

StreamSettingsObject

TransportObject对应出站入站协议中的streamSettings项。每一个入站、出站连接都可以分别配置不同的传输配置,都可以设置streamSettings来进行一些传输的配置。

{
  "network": "tcp",
  "security": "none",
  "tlsSettings": {},
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {},
  "sockopt": {
    "mark": 0,
    "tcpFastOpen": false,
    "tproxy": "off"
  }
}

network: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"

数据流所使用的网络类型,默认值为 "tcp"

security: "none" | "tls"

是否启入传输层加密,支持的选项有 "none" 表示不加密(默认值),"tls" 表示使用 TLS

tlsSettings: TLSObject

TLS 配置。TLS 由 Golang 提供,支持 TLS 1.2,不支持 DTLS。

tcpSettings: TcpObject

当前连接的 TCP 配置,仅当此连接使用 TCP 时有效。配置内容与上面的全局配置相同。

kcpSettings: KcpObject

当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。

wsSettings: WebSocketObject

当前连接的 WebSocket 配置,仅当此连接使用 WebSocket 时有效。配置内容与上面的全局配置相同。

httpSettings: HttpObject

当前连接的 HTTP/2 配置,仅当此连接使用 HTTP/2 时有效。配置内容与上面的全局配置相同。

dsSettings: DomainSocketObject

当前连接的 Domain socket 配置,仅当此连接使用 Domain socket 时有效。配置内容与上面的全局配置相同。

quicSettings: QUICObject

(V2Ray 4.7+) 当前连接的 QUIC 配置,仅当此连接使用 QUIC 时有效。配置内容与上面的全局配置相同。

sockopt: SockoptObject

连接选项

TLSObject

{
  "serverName": "v2ray.com",
  "allowInsecure": false,
  "alpn": ["http/1.1"],
  "certificates": [],
  "disableSystemRoot": false
}

serverName: string

指定服务器端证书的域名,在连接由 IP 建立时有用。当目标连接由域名指定时,比如在 Socks 入站时接收到了域名,或者由 Sniffing 功能探测出了域名,这个域名会自动用于serverName,无须手动配置。

alpn: [ string ]

一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为["http/1.1"]

allowInsecure: true | false

是否允许不安全连接(用于客户端)。当值为true时,V2Ray 不会检查远端主机所提供的 TLS 证书的有效性。

allowInsecureCiphers: true | false

是否允许不安全的加密方式。默认情况下 TLS 只使用 TLS 1.3 推荐的加密算法套件,开启这一选项会增加一些与 TLS 1.2 兼容的加密套件。

disableSystemRoot: true | false

(V2Ray 4.18+) 是否禁用操作系统自带的 CA 证书。默认值为false。当值为true时,V2Ray 只会使用certificates中指定的证书进行 TLS 握手。

certificates: [ CertificateObject ]

证书列表,其中每一项表示一个证书

CertificateObject

{
  "usage": "encipherment",

  "certificateFile": "/path/to/certificate.crt",
  "keyFile": "/path/to/key.key",

  "certificate": [
    "-----BEGIN CERTIFICATE-----",
    "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
    "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
    "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
    "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
    "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
    "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
    "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
    "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
    "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
    "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
    "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
    "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
    "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
    "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
    "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
    "-----END CERTIFICATE-----"
  ],
  "key": [
    "-----BEGIN RSA PRIVATE KEY-----",
    "MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
    "bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
    "GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
    "jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
    "itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
    "IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
    "qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
    "C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
    "/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
    "aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
    "/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
    "bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
    "8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
    "pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
    "L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
    "3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
    "az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
    "gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
    "TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
    "eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
    "64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
    "8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
    "GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
    "ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
    "cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
    "-----END RSA PRIVATE KEY-----"
  ]
}

usage: "encipherment" | "verify" | "issue"

证书用途,默认值为"encipherment"

  • "encipherment": 证书用于 TLS 认证和加密。
  • "verify": 证书用于验证远端 TLS 的证书。当使用此项时,当前证书必须为 CA 证书。
  • "issue": 证书用于签发其它证书。当使用此项时,当前证书必须为 CA 证书。

在 Windows 平台上可以将自签名的 CA 证书安装到系统中,即可验证远端 TLS 的证书。

当有新的客户端请求时,假设所指定的serverName"v2ray.com",V2Ray 会先从证书列表中寻找可用于"v2ray.com"的证书,如果没有找到,则使用任一usage"issue"的证书签发一个适用于"v2ray.com"的证书,有效期为一小时。并将新的证书加入证书列表,以供后续使用。

certificateFile: string

证书文件路径,如使用 OpenSSL 生成,后缀名为 .crt。

使用v2ctl cert -ca可以生成自签名的 CA 证书。

certificate: [ string ]

一个字符串数组,表示证书内容,格式如样例所示。certificatecertificateFile二者选一。

keyFile: string

密钥文件路径,如使用 OpenSSL 生成,后缀名为 .key。目前暂不支持需要密码的 key 文件。

key: [ string ]

一个字符串数组,表示密钥内容,格式如样例如示。keykeyFile二者选一。

certificateFilecertificate同时指定时,V2Ray 优先使用certificateFilekeyFilekey也一样。

usage"verify"时,keyFilekey可均为空。

SockoptObject

{
  "mark": 0,
  "tcpFastOpen": false,
  "tproxy": "off"
}

mark: number

一个整数。当其值非零时,在出站连接上标记 SO_MARK。

  • 仅适用于 Linux 系统。
  • 需要 CAP_NET_ADMIN 权限。

tcpFastOpen: true | false

是否启用 TCP Fast Open。当其值为true时,强制开启TFO;当其它为false时,强制关闭TFO;当此项不存在时,使用系统默认设置。可用于入站出站连接。

  • 仅在以下版本(或更新版本)的操作系统中可用:
    • Windows 10 (1604)
    • Mac OS 10.11 / iOS 9
    • Linux 3.16: 系统已默认开启,无需要配置。

tproxy: "redirect" | "tproxy" | "off"

是否开启透明代理 (仅适用于 Linux)。

  • "redirect": 使用 Redirect 模式的透明代理。仅支持 TCP/IPv4 和 UDP 连接。
  • "tproxy": 使用 TProxy 模式的透明代理。支持 TCP 和 UDP 连接。
  • "off": 关闭透明代理。

透明代理需要 Root 或 CAP_NET_ADMIN 权限。

Dokodemo-door 中指定了followRedirect,且sockopt.tproxy为空时,sockopt.tproxy的值会被设为"redirect"

================================================ FILE: chapter_02/api.html ================================================ API 配置 · Project V 官方网站

远程控制

V2Ray 中可以开放一些 API 以便远程调用。这些 API 都基于 gRPC

当远程控制开启时,V2Ray 会自建一个出站代理,以tag配置的值为标识。用户必须手动将所有的 gRPC 入站连接通过路由指向这一出站代理。

ApiObject

ApiObject对应配置文件中的api项。

{
  "tag": "api",
  "services": [
    "HandlerService",
    "LoggerService",
    "StatsService"
  ]
}

tag: string

出站代理标识

services: [string]

开启的 API 列表,可选的值见API 列表

支持的 API 列表

HandlerService

一些对于入站出站代理进行修改的 API,可用的功能如下:

  • 添加一个新的入站代理;
  • 添加一个新的出站代理;
  • 删除一个现有的入站代理;
  • 删除一个现有的出站代理;
  • 在一个入站代理中添加一个用户(仅支持 VMess);
  • 在一个入站代理中删除一个用户(仅支持 VMess);

LoggerService

支持对内置 Logger 的重启,可配合 logrotate 进行一些对日志文件的操作。

StatsService

内置的数据统计服务,详见统计信息

================================================ FILE: chapter_02/env.html ================================================ 环境变量 · Project V 官方网站

环境变量

V2Ray 提供以下环境变量以供修改 V2Ray 的一些底层配置。

每个连接的缓存大小

  • 名称: v2ray.ray.buffer.sizeV2RAY_RAY_BUFFER_SIZE
  • 单位: MBytes
  • 默认值: 在 x86、amd64、arm64、s390x 上为 2,其它平台上禁用该缓存。
  • 特殊值: 0 表示缓存无上限

已过时,请使用本地策略中的 bufferSize

对于一个代理连接,当上下游网络速度有差距时,V2Ray 会缓存一部分数据,以减小对网络传输的影响。这个配置设置了缓存的大小,越大的缓存会占用更多的内存,也会使网络性能越好。

资源文件路径

  • 名称: v2ray.location.assetV2RAY_LOCATION_ASSET
  • 默认值: 和 v2ray 文件同路径

这个环境变量指定了一个文件夹位置,这个文件夹应当包含 geoip.dat 和 geosite.dat 文件。

配置文件位置

  • 名称: v2ray.location.configV2RAY_LOCATION_CONFIG
  • 默认值: 和 v2ray 文件同路径

这个环境变量指定了一个文件夹位置,这个文件夹应当包含 config.json 文件。

分散读取

  • 名称:v2ray.buf.readvV2RAY_BUF_READV
  • 默认值:auto

V2Ray 3.37 开始使用 Scatter/Gather IO,这一特性可以在大流量(超过 100 MByte/s)的时候依然使用较低的内存。可选的值有autoenabledisable

  • enable: 强制开启分散读取特性。
  • disable: 强制关闭分散读取特性
  • auto: 仅在 Windows、MacOS、Linux 并且 CPU 平台为 x86、AMD64、s390x 时,开启此特性。

在流量没有达到 100 MByte/s 时,开启与否在内存使用上没有明显的差异。

================================================ FILE: chapter_02/index.html ================================================ 配置文件 · Project V 官方网站

配置文件

V2Ray 本身使用基于 Protobuf 的配置。由于 Protobuf 的文本格式不方便阅读,V2Ray 同时也支持 JSON 格式的配置。在运行之前,V2Ray 会自动将 JSON 转换为对应的 Protobuf。换言之,V2Ray 将来也可能会支持其它格式的配置。

以下介绍一下基于 JSON 格式的配置。

JSON,全称 JavaScript Object Notation,简而言之是 Javascript 中的对象(Object)。一个 JSON 文件包含一个完整的对象,以大括号“{”开头,大括号“}”结束。

一个 JSON 对象包含一系列的键值对(Key-Value Pair),一个键是一个字符串(String),而值有多种类型,常见的有字符串(String)、数字(Number)、布尔(Bool)、数组(Array)和对象(Object)。下面是一个简单的 JSON 对象示例:

{
  "stringValue": "This is a string.",
  "numberValue": 42,
  "boolValue": true,
  "arrayValue": ["this", "is", "a", "string", "array"],
  "objectValue": {
    "another": "object"
  }
}

V2Ray 的 JSON 格式支持注释,可使用“//”或者“/* */”来进行注释。在不支持注释的编辑器中可能被显示为“错误”,但实际上是可以正常使用的。

JSON 数据类型

这里介绍一下常用的数据类型,在之后其它的配置中会用到。

boolean: true | false

布尔值,只有truefalse两种取值,不带引号。

number

数字,在 V2Ray 的使用中通常为非负整数,即053…… 数字在 JSON 格式中不带引号。

string

字符串,由引号包含的一串字符,如无特殊说明,字符的内容不限。

array: []

数组,由方括号包含的一组元素,如字符串数组表示为[string]

object: {}

对象,一组键值对。样例见本文上方的示例。

通常一个键值对的后面需要有一个逗号",",但如果这个键值对后面紧跟一个大括号"}"的话,则一定不能有逗号。

V2Ray 常用数据类型

map: object {string:string}

一组键值对,其类型在括号内指出。每一个键和值的类型对应相同。

address: string

字符串,表示一个 IP 地址或域名,形如:"8.8.8.8""www.v2ray.com"

address_port: string

字符串,表示一个地址和端口,常见的形式如:"8.8.8.8:53",或者 "www.v2ray.com:80"。在一部分配置中,地址部分可以省略,如":443"

配置生成器和模板

V2Ray 项目目前尚没有官方维护模板合集或配置文件生成工具,如有需要,可以前往 神一样的工具们 章节查阅部分收录。

================================================ FILE: chapter_02/mux.html ================================================ Mux 配置 · Project V 官方网站

Mux 多路复用

Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细节详见Mux.Cool。Mux 是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频、下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配。

MuxObject

MuxObject对应OutboundObject中的mux项。

{
  "enabled": false,
  "concurrency": 8
}

enabled: true | false

是否启用 Mux 转发请求

concurrency: number

最大并发连接数。最小值1,最大值1024,缺省默认值8

特殊值-1,不加载mux模块。(4.22.0+)

这个数值表示了一个 TCP 连接上最多承载的 Mux 连接数量。当客户端发出了 8 个 TCP 请求,而concurrency=8时,V2Ray 只会发出一条实际的 TCP 连接,客户端的 8 个请求全部由这个 TCP 连接传输。

================================================ FILE: chapter_02/policy.html ================================================ 本地策略 · Project V 官方网站

本地策略

本地策略可以配置一些用户相关的权限,比如连接超时设置。V2Ray 处理的每一个连接,都对应到一个用户,按照这个用户的等级(level)应用不同的策略。本地策略可按照等级的不同而变化。

PolicyObject

PolicyObject对应配置文件中的policy项。

{
  "levels": {
    "0": {
      "handshake": 4,
      "connIdle": 300,
      "uplinkOnly": 2,
      "downlinkOnly": 5,
      "statsUserUplink": false,
      "statsUserDownlink": false,
      "bufferSize": 10240
    }
  },
  "system": {
    "statsInboundUplink": false,
    "statsInboundDownlink": false
  }
}

level: map{string: LevelPolicyObject}

一组键值对,每个键是一个字符串形式的数字(JSON 的要求),比如 "0""1" 等,双引号不能省略,这个数字对应用户等级。每一个值是一个 LevelPolicyObject.

每个入站出站代理现在都可以设置用户等级,V2Ray 会根据实际的用户等级应用不同的本地策略。

system: SystemPolicyObject

V2Ray 系统的策略

LevelPolicyObject

{
  "handshake": 4,
  "connIdle": 300,
  "uplinkOnly": 2,
  "downlinkOnly": 5,
  "statsUserUplink": false,
  "statsUserDownlink": false,
  "bufferSize": 10240
}

handshake: number

连接建立时的握手时间限制。单位为秒。默认值为4。在入站代理处理一个新连接时,在握手阶段(比如 VMess 读取头部数据,判断目标服务器地址),如果使用的时间超过这个时间,则中断该连接。

connIdle: number

连接空闲的时间限制。单位为秒。默认值为300。在入站出站代理处理一个连接时,如果在 connIdle 时间内,没有任何数据被传输(包括上行和下行数据),则中断该连接。

uplinkOnly: number

当连接下行线路关闭后的时间限制。单位为秒。默认值为2。当服务器(如远端网站)关闭下行连接时,出站代理会在等待 uplinkOnly 时间后中断连接。

downlinkOnly: number

当连接上行线路关闭后的时间限制。单位为秒。默认值为5。当客户端(如浏览器)关闭上行连接时,入站代理会在等待 downlinkOnly 时间后中断连接。

在 HTTP 浏览的场景中,可以将uplinkOnlydownlinkOnly设为0,以提高连接关闭的效率。

statsUserUplink: true | false

当值为true时,开启当前等级的所有用户的上行流量统计。

statsUserDownlink: true | false

当值为true时,开启当前等级的所有用户的下行流量统计。

bufferSize: number

每个连接的内部缓存大小。单位为 kB。当值为0时,内部缓存被禁用。

默认值 (V2Ray 4.4+):

  • 在 ARM、MIPS、MIPSLE 平台上,默认值为0
  • 在 ARM64、MIPS64、MIPS64LE 平台上,默认值为4
  • 在其它平台上,默认值为512

默认值 (V2Ray 4.3-):

  • 在 ARM、MIPS、MIPSLE、ARM64、MIPS64、MIPS64LE 平台上,默认值为16
  • 在其它平台上,默认值为2048

bufferSize 选项会覆盖环境变量v2ray.ray.buffer.size的设定。

SystemPolicyObject

{
  "statsInboundUplink": false,
  "statsInboundDownlink": false
}

statsInboundUplink: true | false

当值为true时,开启所有入站代理的上行流量统计。

statsInboundDownlink: true | false

当值为true时,开启所有入站代理的下行流量统计。

================================================ FILE: chapter_02/protocols/blackhole.html ================================================ Blackhole · Project V 官方网站

Blackhole

  • 名称: blackhole
  • 类型: 出站协议

Blackhole(黑洞)是一个出站数据协议,它会阻碍所有数据的出站,配合路由(Routing)一起使用,可以达到禁止访问某些网站的效果。

OutboundConfigurationObject

{
  "response": {
    "type": "none"
  }
}

response: ResponseObject

配置黑洞的响应数据。Blackhole 会在收到待转发数据之后,发送指定的响应数据,然后关闭连接。待转发的数据将被丢弃。如不指定此项,Blackhole 将直接关闭连接。

ResponseObject

{
  "type": "none"
}

type: "http" | "none"

type"none"(默认值)时,Blackhole将直接关闭连接。当type"http"时,Blackhole会发回一个简单的 HTTP 403 数据包,然后关闭连接。

================================================ FILE: chapter_02/protocols/dns.html ================================================ DNS · Project V 官方网站

DNS

  • 名称: dns
  • 类型: 出站协议

DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。

在处理 DNS 查询时,此出站协议会将 IP 查询(即 A 和 AAAA)转发给内置的 DNS 服务器。其它类型的查询流量将被转发至它们原本的目标地址。

DNS 出站协议在 V2Ray 4.15 中引入。

OutboundConfigurationObject

{
    "network": "tcp",
    "address": "1.1.1.1",
    "port": 53
}

network: "tcp" | "udp"

(V2Ray 4.16+) 修改 DNS 流量的传输层协议,可选的值有"tcp""udp"。当不指定时,保持来源的传输方式不变。

address: address

(V2Ray 4.16+) 修改 DNS 服务器地址。当不指定时,保持来源中指定的地址不变。

port: number

(V2Ray 4.16+) 修改 DNS 服务器端口。当不指定时,保持来源中指定的端口不变。

================================================ FILE: chapter_02/protocols/dokodemo.html ================================================ Dokodemo · Project V 官方网站

Dokodemo-door

  • 名称: dokodemo-door
  • 类型: 入站协议

Dokodemo door(任意门)是一个入站数据协议,它可以监听一个本地端口,并把所有进入此端口的数据发送至指定服务器的一个端口,从而达到端口映射的效果。

InboundConfigurationObject

{
  "address": "8.8.8.8",
  "port": 53,
  "network": "tcp",
  "timeout": 0,
  "followRedirect": false,
  "userLevel": 0
}

address: address

将流量转发到此地址。可以是一个 IP 地址,形如"1.2.3.4",或者一个域名,形如"v2ray.com"。字符串类型。

followRedirect(见下文)为 true 时,address 可为空。

port: number

将流量转发到目标地址的指定端口,范围[1, 65535],数值类型。必填参数。

network: "tcp" | "udp" | "tcp,udp"

可接收的网络协议类型。比如当指定为"tcp"时,任意门仅会接收 TCP 流量。默认值为"tcp"

timeout: number

入站数据的时间限制(秒),默认值为 300。

V2Ray 3.1 后等价于对应用户等级的 connIdle 策略

followRedirect: true | false

当值为true时,dokodemo-door 会识别出由 iptables 转发而来的数据,并转发到相应的目标地址。详见传输配置中的tproxy设置。

userLevel: number

用户等级,所有连接都会使用这个用户等级。

透明代理配置样例

V2Ray 中增加一个 dokodemo-door 的入站协议:

{
  "network": "tcp,udp",
  "timeout": 30,
  "followRedirect": true
}

配置 iptables:

# Create new chain
iptables -t nat -N V2RAY
iptables -t mangle -N V2RAY
iptables -t mangle -N V2RAY_MARK

# Ignore your V2Ray server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A V2RAY -d 123.123.123.123 -j RETURN

# Ignore LANs and any other addresses you'd like to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN

# Anything else should be redirected to Dokodemo-door's local port
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345

# Add any UDP rules
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A V2RAY -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A V2RAY_MARK -p udp --dport 53 -j MARK --set-mark 1

# Apply the rules
iptables -t nat -A OUTPUT -p tcp -j V2RAY
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -A OUTPUT -j V2RAY_MARK
================================================ FILE: chapter_02/protocols/freedom.html ================================================ Freedom · Project V 官方网站

Freedom

  • 名称:freedom
  • 类型:出站协议

Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。

OutboundConfigurationObject

{
  "domainStrategy": "AsIs",
  "redirect": "127.0.0.1:3366",
  "userLevel": 0
}

domainStrategy: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6"

在目标地址为域名时,Freedom 可以直接向此域名发出连接("AsIs"),或者将域名解析为 IP 之后再建立连接("UseIP""UseIPv4""UseIPv6")。解析 IP 的步骤会使用 V2Ray 内建的 DNS。默认值为"AsIs"

(V2Ray 4.6+) 当使用"UseIP"模式,并且出站连接配置中指定了sendThrough时,Freedom 会根据sendThrough的值自动判断所需的IP类型,IPv4 或 IPv6。

(V2Ray 4.7+) 当使用"UseIPv4""UseIPv6"模式时,Freedom 会只使用对应的 IPv4 或 IPv6 地址。当sendThrough指定了不匹配的本地地址时,将导致连接失败。

redirect: address_port

Freedom 会强制将所有数据发送到指定地址(而不是入站协议指定的地址)。其值为一个字符串,样例:"127.0.0.1:80", ":1234"。当地址不指定时,如":443",Freedom 不会修改原先的目标地址。当端口为0时,如"v2ray.com:0",Freedom 不会修改原先的端口。

userLevel: number

用户等级,所有连接都使用这一等级。

================================================ FILE: chapter_02/protocols/http.html ================================================ HTTP · Project V 官方网站

HTTP

  • 名称:http
  • 类型:入站 / 出站

HTTP 的配置分为两部分,InboundConfigurationObjectOutboundConfigurationObject,分别对应入站和出站协议配置中的settings项。

InboundConfigurationObject

{
  "timeout": 0,
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "allowTransparent": false,
  "userLevel": 0
}

应该注意,虽然http inbound可以提供公共服务,但http协议没有对传输加密,不适宜经公网中传输,更容易成为被人用作攻击的肉鸡。http inbound更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。

timeout: number

从客户端读取数据的超时设置(秒),0 表示不限时。默认值为 300。 V2Ray 3.1 后等价于对应用户等级的 connIdle 策略。

accounts: [AccountObject]

一个数组,数组中每个元素为一个用户帐号。默认值为空。

accounts 非空时,HTTP 代理将对入站连接进行 Basic Authentication 验证。

allowTransparent: true | false

当为true时,会转发所有 HTTP 请求,而非只是代理请求。若配置不当,开启此选项会导致死循环。

userLevel: number

用户等级,所有连接使用这一等级。

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

用户名,字符串类型。必填。

pass: string

密码,字符串类型。必填。

在 Linux 中使用以下环境变量即可在当前 session 使用全局 HTTP 代理(很多软件都支持这一设置,也有不支持的)。

  • export http_proxy=http://127.0.0.1:8080/ (地址须改成你配置的 HTTP 入站代理地址)
  • export https_proxy=$http_proxy

OutboundConfigurationObject

{
  "servers": [
    {
      "address": "192.168.108.1",
      "port": 3128,
      "users": [
        {
          "user": "my-username",
          "pass": "my-password"
        }
      ]
    }
  ]
}

(V2ray 4.21.0+)

应该注意,虽然http outbound可以作为对外访问的配置,但http proxy协议没有对传输加密,不适宜经公网中传输,且因不支持udp传输将会导致core功能受限(Routing过程的的DNS查询不可用)。http outbound更有意义的用法是在特殊情况下,只能使用http proxy对外访问内部网络中,作为为其他协议连接代理服务器的前置代理使用(见OutboundObjectProxySettingsObject)。另因http proxy只能代理tcp协议,udp系的协议均不能通过。

(V2ray 4.21.1+)

4.20.0版本中引入了http outbound作为其他协议的前置代理用法中,缺乏了对tls配置的支持。4.21.1的补丁版本中对streamSettings中的securitytlsSettings保留生效。目前前置代理的用法中,vmess/tcp、vmess/tcp-tls和shadowsocks等三种协议方式可使用,其他传输协议的前置代理用法需后续版本开发支持。

servers: 数组

HTTP代理服务器配置,若配置多个,循环使用 (RoundRobin)。

address: string

HTTP代理服务器地址,必填。

port: int

HTTP代理服务器端口,必填。

user: [AccountObject]

一个数组,数组中每个元素为一个用户帐号。默认值为空。

================================================ FILE: chapter_02/protocols/mtproto.html ================================================ MTProto · Project V 官方网站

MTProto

  • 名称: mtproto
  • 类型: 入站 / 出站

MTProto 是一个 Telegram 专用的代理协议。在 V2Ray 中可使用一组入站出站代理来完成 Telegram 数据的代理任务。

目前只支持转发到 Telegram 的 IPv4 地址。

InboundConfigurationObject

{
  "users": [{
    "email": "love@v2ray.com",
    "level": 0,
    "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
  }]
}

users: [UserObject]

一个数组,其中每一个元素表示一个用户。目前只有第一个用户会生效。

UserObject

{
  "email": "love@v2ray.com",
  "level": 0,
  "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}

email: string

用户邮箱,用于统计流量等辅助功能

level: number

用户等级。

secret: string

用户密钥。必须为 32 个字符,仅可包含09af之间的字符。

使用此命令生成 MTProto 代理所需要的用户密钥:openssl rand -hex 16

OutboundConfigurationObject

{
}

样例配置

MTProto 仅可用于 Telegram 数据。你可能需要一个路由来绑定对应的入站出站代理。以下是一个不完整的示例:

入站代理:

{
  "tag": "tg-in",
  "port": 443,
  "protocol": "mtproto",
  "settings": {
    "users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
  }
}

出站代理:

{
  "tag": "tg-out",
  "protocol": "mtproto",
  "settings": {}
}

路由:

{
  "type": "field",
  "inboundTag": ["tg-in"],
  "outboundTag": "tg-out"
}

然后使用 Telegram 连接这台机器的 443 端口即可。

================================================ FILE: chapter_02/protocols/shadowsocks.html ================================================ Shadowsocks · Project V 官方网站

Shadowsocks

  • 名称:shadowsocks
  • 类型:入站 / 出站

Shadowsocks 协议,包含入站和出站两部分,兼容大部分其它版本的实现。

与官方版本的兼容性:

  • 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
  • 支持 OTA
    • 客户端可选开启或关闭;
    • 服务器端可强制开启、关闭或自适应;
  • 加密方式(其中 AEAD 加密方式在 V2Ray 3.0 中加入):
    • aes-256-cfb
    • aes-128-cfb
    • chacha20
    • chacha20-ietf
    • aes-256-gcm
    • aes-128-gcm
    • chacha20-poly1305 或称 chacha20-ietf-poly1305
  • 插件:
    • 通过 Standalone 模式支持 obfs

Shadowsocks 的配置分为两部分,InboundConfigurationObjectOutboundConfigurationObject,分别对应入站和出站协议配置中的settings项。

InboundConfigurationObject

{
  "email": "love@v2ray.com",
  "method": "aes-128-cfb",
  "password": "密码",
  "level": 0,
  "ota": true,
  "network": "tcp"
}

email: string

邮件地址,可选,用于标识用户

method: string

必填。可选的值见加密方式列表

password: string

必填,任意字符串。Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。

level: number

用户等级,默认值为 0。详见本地策略

ota: true | false

是否强制 OTA,如果不指定此项,则自动判断。强制开启 OTA 后,V2Ray 会拒绝未启用 OTA 的连接。反之亦然。

当使用 AEAD 时,ota 设置无效

network: "tcp" | "udp" | "tcp,udp"

可接收的网络连接类型,默认值为"tcp"

OutboundConfigurationObject

{
  "servers": [
    {
      "email": "love@v2ray.com",
      "address": "127.0.0.1",
      "port": 1234,
      "method": "加密方式",
      "password": "密码",
      "ota": false,
      "level": 0
    }
  ]
}

servers: [ServerObject]

一个数组,其中每一项是一个 ServerObject

ServerObject

{
  "email": "love@v2ray.com",
  "address": "127.0.0.1",
  "port": 1234,
  "method": "加密方式",
  "password": "密码",
  "ota": false,
  "level": 0
}

email: string

邮件地址,可选,用于标识用户

address: address

Shadowsocks 服务器地址,支持 IPv4、IPv6 和域名。必填。

port: number

Shadowsocks 服务器端口。必填。

method: string

必填。可选的值见加密方式列表

password: string

必填。任意字符串。Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。

ota: true | false

是否开启 Shadowsocks 的一次验证(One time auth),默认值为false

当使用 AEAD 时,ota 设置无效。

level: number

用户等级

加密方式列表

  • "aes-256-cfb"
  • "aes-128-cfb"
  • "chacha20"
  • "chacha20-ietf"
  • "aes-256-gcm"
  • "aes-128-gcm"
  • "chacha20-poly1305""chacha20-ietf-poly1305"
================================================ FILE: chapter_02/protocols/socks.html ================================================ SOCKS · Project V 官方网站

Socks

  • 名称:socks
  • 类型:入站 / 出站

标准 Socks 协议实现,兼容 Socks 4、Socks 4a 和 Socks 5

Socks 的配置分为两部分,InboundConfigurationObjectOutboundConfigurationObject,分别对应入站和出站协议配置中的settings项。

OutboundConfigurationObject

{
  "servers": [{
    "address": "127.0.0.1",
    "port": 1234,
    "users": [
      {
        "user": "test user",
        "pass": "test pass",
        "level": 0
      }
    ]
  }]
}

应该注意,虽然socks outbound可以作为对外访问的配置,但socks协议没有对传输加密,不适宜经公网中传输。socks outbound 更有意义的用法是在特殊情况下,只能使用socks proxy对外访问内部网络中,作为为其他协议连接代理服务器的前置代理使用(见OutboundObjectProxySettingsObject)。

servers: [ ServerObject ]

Socks 服务器列表,其中每一项是一个服务器配置。

ServerObject

{
  "address": "127.0.0.1",
  "port": 1234,
  "users": [
    {
      "user": "test user",
      "pass": "test pass",
      "level": 0
    }
  ]
}

address: address

服务器地址。

仅支持连接到 Socks 5 服务器。

port: number

服务器端口

users: [ UserObject ]

用户列表,其中每一项一个用户配置。当列表不为空时,Socks 客户端会使用此用户信息进行认证;如未指定,则不进行认证。

UserObject

{
  "user": "test user",
  "pass": "test pass",
  "level": 0
}

user: string

用户名

pass: string

密码

level: number

用户等级

InboundConfigurationObject

应该注意,虽然socks inbound可以公共服务端口,但socks协议没有对传输加密,不适宜经公网中传输。socks inbound更有意义的用法是在局域网或本机环境下,为其他程序提供本地服务。

{
  "auth": "noauth",
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "udp": false,
  "ip": "127.0.0.1",
  "userLevel": 0
}

auth: "noauth" | "password"

Socks 协议的认证方式,支持"noauth"匿名方式和"password"用户密码方式。默认值为"noauth"

accounts: [ AccountObject ]

一个数组,数组中每个元素为一个用户帐号。默认值为空。此选项仅当 authpassword 时有效。

udp: true | false

是否开启 UDP 协议的支持。默认值为 false

ip: address

当开启 UDP 时,V2Ray 需要知道本机的 IP 地址。默认值为"127.0.0.1"

userLevel: number

用户等级,所有连接使用这一等级。

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

用户名

pass: string

密码

================================================ FILE: chapter_02/protocols/vmess.html ================================================ VMess · Project V 官方网站

VMess

  • 名称:vmess
  • 类型:入站 / 出站

VMess 是一个加密传输协议,它分为入站和出站两部分,通常作为 V2Ray 客户端和服务器之间的桥梁。

VMess 依赖于系统时间,请确保使用 V2Ray 的系统 UTC 时间误差在 90 秒之内,时区无关。在 Linux 系统中可以安装ntp服务来自动同步系统时间。

VMess 的配置分为两部分,InboundConfigurationObjectOutboundConfigurationObject,分别对应入站和出站协议配置中的settings项。

OutboundConfigurationObject

{
  "vnext": [
    {
      "address": "127.0.0.1",
      "port": 37192,
      "users": [
        {
          "id": "27848739-7e62-4138-9fd3-098a63964b6b",
          "alterId": 4,
          "security": "auto",
          "level": 0
        }
      ]
    }
  ]
}

vnext:[ ServerObject ]

一个数组,包含一系列的服务器配置

ServerObject

{
  "address": "127.0.0.1",
  "port": 37192,
  "users": []
}

address: address

服务器地址,支持 IP 地址或者域名。

port: number

服务器端口号。

users: [ UserObject ]

一组服务器认可的用户

UserObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "alterId": 4,
  "security": "auto",
  "level": 0
}

id:string

VMess 用户的主 ID。必须是一个合法的 UUID。

alterId:number

为了进一步防止被探测,一个用户可以在主 ID 的基础上,再额外生成多个 ID。这里只需要指定额外的 ID 的数量,推荐值为 4。不指定的话,默认值是 0。最大值 65535。这个值不能超过服务器端所指定的值。

level: number

用户等级

security: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none"

加密方式,客户端将使用配置的加密方式发送数据,服务器端自动识别,无需配置。

  • "aes-128-gcm":推荐在 PC 上使用
  • "chacha20-poly1305":推荐在手机端使用
  • "auto":默认值,自动选择(运行框架为 AMD64、ARM64 或 s390x 时为aes-128-gcm加密方式,其他情况则为 Chacha20-Poly1305 加密方式)
  • "none":不加密

推荐使用"auto"加密方式,这样可以永久保证安全性和兼容性。

InboundConfigurationObject

{
  "clients": [
    {
      "id": "27848739-7e62-4138-9fd3-098a63964b6b",
      "level": 0,
      "alterId": 4,
      "email": "love@v2ray.com"
    }
  ],
  "default": {
    "level": 0,
    "alterId": 4
  },
  "detour": {
    "to": "tag_to_detour"
  },
  "disableInsecureEncryption": false
}

clients: [ ClientObject ]

一组服务器认可的用户。clients 可以为空。当此配置用作动态端口时,V2Ray 会自动创建用户。

detour: DetourObject

指示对应的出站协议使用另一个服务器。

default: DefaultObject

可选,clients 的默认配置。仅在配合detour时有效。

disableInsecureEncryption: true | false

是否禁止客户端使用不安全的加密方式,当客户端指定下列加密方式时,服务器会主动断开连接。默认值为false

  • "none"
  • "aes-128-cfb"

ClientObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "level": 0,
  "alterId": 4,
  "email": "love@v2ray.com"
}

id: string

VMess 的用户 ID。必须是一个合法的 UUID。

level: number

用户等级,详见本地策略

alterId: number

与上文出站协议中的含义相同。

email: string

用户邮箱地址,用于区分不同用户的流量。

alterId 取值的大小和流量特征没有必然联系。对于日常使用,16 以内的值已经够用了。

DetourObject

{
  "to": "tag_to_detour"
}

to: string

一个入站协议的tag,详见配置文件。指定的入站协议必须是一个 VMess

DefaultObject

{
  "level": 0,
  "alterId": 4
}

level: number

用户等级,意义同上。默认值为0

alterId: number

ClientObject中的alterId相同,默认值为64。推荐值4

================================================ FILE: chapter_02/reverse.html ================================================ 反向代理 · Project V 官方网站

反向代理

反向代理是一个 V2Ray 的附加功能,可以把服务器端的流量向客户端转发,即逆向流量转发。

反向代理功能在 V2Ray 4.0+ 可用。目前处于测试阶段,可能会有一些问题。

反向代理的大致工作原理如下:

  • 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP,无法在公网上直接访问。另有一台主机 B,它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。
  • 在主机 A 中配置一个 V2Ray,称为bridge,在 B 中也配置一个 V2Ray,称为portal
  • bridge会向portal主动建立连接,此连接的目标地址可以自行设定。portal会收到两种连接,一是由bridge发来的连接,二是公网用户发来的连接。portal会自动将两类连接合并。于是bridge就可以收到公网流量了。
  • bridge在收到公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由的协作。
  • bridge会根据流量的大小进行动态的负载均衡。

反向代理默认已开启 Mux,请不要在其用到的出站代理上再次开启 Mux。

ReverseObject

ReverseObject对应配置文件中的reverse项。

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }],
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"
  }]
}

bridges: [BridgeObject]

一个数组,每一项表示一个bridge。每个bridge的配置是一个 BridgeObject

portals: [PortalObject]

一个数组,每一项表示一个portal。每个portal的配置是一个 PortalObject

BridgeObject

{
  "tag": "bridge",
  "domain": "test.v2ray.com"
}

tag: string

一个标识,所有由bridge发出的连接,都会带有这个标识。可以在路由中使用inboundTag进行识别。

domain: string

一个域名。bridgeportal建立的连接,都会使用这个域名进行发送。这个域名只作为bridgeportal的通信用途,不必真实存在。

PortalObject

tag: string

portal的标识。在路由中使用outboundTag将流量转发到这个portal

domain: string

一个域名。当portal接收到流量时,如果流量的目标域名是此域名,则portal认为当前连接上bridge发来的通信连接。而其它流量则会被当成需要转发的流量。portal所做的工作就是把这两类连接进行识别并拼接。

和其它配置一样,一个 V2Ray 既可以作为bridge,也可以作为portal,也可以同时两者,以适用于不同的场景需要。

完整配置

bridge通常需要两个出站代理,一个用于连接portal,另一个用于发送实际的流量。也就是说,你需要用路由区分两种流量。

反向代理配置:

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }]
}

出站代理:

{
  "tag": "out",
  "protocol": "freedom",
  "settings": {
    "redirect": "127.0.0.1:80" // 将所有流量转发到网页服务器
  }
},
{
  "protocol": "vmess",
  "settings": {
    "vnext": [{
      "address": "portal的IP地址",
      "port": 1024,
      "users": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
    }]
  },
  "tag": "interconn"
}

路由配置:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["bridge"],
    "domain": ["full:test.v2ray.com"],
    "outboundTag": "interconn"
  },{
    "type": "field",
    "inboundTag": ["bridge"],
    "outboundTag": "out"
  }]
}

portal通常需要两个入站代理,一个用于接收bridge的连接,另一个用于接收实际的流量。同时你也需要用路由区分两种流量。

反向代理配置:

{
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"  // 必须和 bridge 的配置一样
  }]
}

入站代理:

{
  "tag": "external",
  "port": 80,  // 开放 80 端口,用于接收外部的 HTTP 访问
  "protocol": "dokodemo-door",
  "settings": {
    "address": "127.0.0.1",
    "port": 80,
    "network": "tcp"
  }
},
{
  "port": 1024, // 用于接收 bridge 的连接
  "tag": "interconn",
  "protocol": "vmess",
  "settings": {
    "clients": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
  }
}

路由配置:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["external"],
    "outboundTag": "portal"
  },{
    "type": "field",
    "inboundTag": ["interconn"],
    "outboundTag": "portal"
  }]
}

在运行过程中,建议先启用bridge,再启用portal

================================================ FILE: chapter_02/stats.html ================================================ 统计信息 · Project V 官方网站

统计信息

V2Ray 提供了一些关于其运行状况的统计信息。

StatsObject

StatsObject 对应配置文件中的stats项。

{
}

目前统计信息没有任何参数,只要StatsObject项存在,内部的统计即会开启。同时你还需要在 Policy 中开启对应的项,才可以统计对应的数据。

目前已有的统计信息如下:

用户数据

user>>>[email]>>>traffic>>>uplink

特定用户的上行流量,单位字节。

user>>>[email]>>>traffic>>>downlink

特定用户的下行流量,单位字节。

如果对应用户没有指定 Email,则不会开启统计。

全局数据

inbound>>>[tag]>>>traffic>>>uplink

特定入站代理的上行流量,单位字节。

inbound>>>[tag]>>>traffic>>>downlink

特定入站代理的下行流量,单位字节。

================================================ FILE: chapter_02/transport/domainsocket.html ================================================ DomainSocket · Project V 官方网站

DomainSocket 传输方式

Domain Socket 使用标准的 Unix domain socket 来传输数据。它的优势是使用了操作系统内建的传输通道,而不会占用网络缓存。相比起本地环回网络(local loopback)来说,Domain socket 速度略快一些。

目前仅可用于支持 Unix domain socket 的平台,如 macOS 和 Linux。在 Windows 上不可用。

如果指定了 domain socket 作为传输方式,在入站出站代理中配置的端口和 IP 地址将会失效,所有的传输由 domain socket 取代。

DomainSocketObject

DomainSocketObject对应传输配置中的dsSettings项。

{
  "path": "/path/to/ds/file"
}

path: string

一个合法的文件路径。在运行 V2Ray 之前,这个文件必须不存在。

================================================ FILE: chapter_02/transport/h2.html ================================================ HTTP/2 · Project V 官方网站

HTTP/2 传输方式

V2Ray 3.17 中加入了基于 HTTP/2 的传输方式。它完整按照 HTTP/2 标准实现,可以通过其它的 HTTP 服务器(如 Nginx)进行中转。

由 HTTP/2 的建议,客户端和服务器必须同时开启 TLS 才可以正常使用这个传输方式。

V2Ray 4.20 中对服务端的TLS配置的强制条件移除,为了在特殊用途的分流部署环境中,由外部网关组件完成TLS层对话,V2Ray作为后端应用,网关和V2Ray间使用称为h2c的明文http/2进行通讯。

HttpObject

HttpObject对应传输配置中的httpSettings项。

{
  "host": ["v2ray.com"],
  "path": "/random/path"
}

host: [string]

一个字符串数组,每一个元素是一个域名。客户端会随机从列表中选出一个域名进行通信,服务器会验证域名是否在列表中。

path string

HTTP 路径,由/开头。客户端和服务器必须一致。可选参数,默认值为"/"

================================================ FILE: chapter_02/transport/mkcp.html ================================================ mKCP · Project V 官方网站

mKCP 传输方式

mKCP 使用 UDP 来模拟 TCP 连接,请确定主机上的防火墙配置正确。mKCP 牺牲带宽来降低延迟。传输同样的内容,mKCP 一般比 TCP 消耗更多的流量。

KcpObject

{
  "mtu": 1350,
  "tti": 20,
  "uplinkCapacity": 5,
  "downlinkCapacity": 20,
  "congestion": false,
  "readBufferSize": 1,
  "writeBufferSize": 1,
  "header": {
    "type": "none"
  }
}

mtu: number

最大传输单元(maximum transmission unit),请选择一个介于 576 - 1460 之间的值。默认值为 1350

tti: number

传输时间间隔(transmission time interval),单位毫秒(ms),mKCP 将以这个时间频率发送数据。请选译一个介于 10 - 100 之间的值。默认值为 50

uplinkCapacity: number

上行链路容量,即主机发出数据所用的最大带宽,单位 MB/s,默认值 5。注意是 Byte 而非 bit。可以设置为 0,表示一个非常小的带宽。

downlinkCapacity: number

下行链路容量,即主机接收数据所用的最大带宽,单位 MB/s,默认值 20。注意是 Byte 而非 bit。可以设置为 0,表示一个非常小的带宽。

uplinkCapacitydownlinkCapacity 决定了 mKCP 的传输速度。以客户端发送数据为例,客户端的 uplinkCapacity 指定了发送数据的速度,而服务器端的 downlinkCapacity 指定了接收数据的速度。两者的值以较小的一个为准。推荐把 downlinkCapacity 设置为一个较大的值,比如 100,而 uplinkCapacity 设为实际的网络速度。当速度不够时,可以逐渐增加 uplinkCapacity 的值,直到带宽的两倍左右。

congestion: true | false

是否启用拥塞控制,默认值为 false。开启拥塞控制之后,V2Ray 会自动监测网络质量,当丢包严重时,会自动降低吞吐量;当网络畅通时,也会适当增加吞吐量。

readBufferSize: number

单个连接的读取缓冲区大小,单位是 MB。默认值为 2

writeBufferSize: number

单个连接的写入缓冲区大小,单位是 MB。默认值为 2

readBufferSizewriteBufferSize 指定了单个连接所使用的内存大小。在需要高速传输时,指定较大的 readBufferSizewriteBufferSize 会在一定程度上提高速度,但也会使用更多的内存。在网速不超过 20MB/s 时,默认值 1MB 可以满足需求;超过之后,可以适当增加 readBufferSizewriteBufferSize 的值,然后手动平衡速度和内存的关系。

header: HeaderObject

数据包头部伪装设置

HeaderObject

{
  "type": "none"
}

type: string

伪装类型,可选的值有:

  • "none": 默认值,不进行伪装,发送的数据是没有特征的数据包。
  • "srtp": 伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。
  • "utp": 伪装成 uTP 数据包,会被识别为 BT 下载数据。
  • "wechat-video": 伪装成微信视频通话的数据包。
  • "dtls": 伪装成 DTLS 1.2 数据包。
  • "wireguard": 伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)

鸣谢

  • @skywind3000 发明并实现了 KCP 协议;
  • @xtaci 将 KCP 由 C 语言实现翻译成 Go;
  • @xiaokangwang 测试 KCP 与 V2Ray 的整合并提交了最初的 PR。

对 KCP 协议的改进

更小的协议头

原生 KCP 协议使用了 24 字节的固定头部,而 mKCP 修改为数据包 18 字节,确认(ACK)包 16 字节。更小的头部有助于躲避特征检查,并加快传输速度。

另外,原生 KCP 的单个确认包只能确认一个数据包已收到,也就是说当 KCP 需要确认 100 个数据已收到时,它会发出 24 * 100 = 2400 字节的数据。其中包含了大量重复的头部数据,造成带宽的浪费。mKCP 会对多个确认包进行压缩,100 个确认包只需要 16 + 2 + 100 * 4 = 418 字节,相当于原生的六分之一。

确认包重传

原生 KCP 协议的确认(ACK)包只发送一次,如果确认包丢失,则一定会导致数据重传,造成不必要的带宽浪费。而 mKCP 会以一定的频率重发确认包,直到发送方确认为止。单个确认包的大小为 22 字节,相比起数据包的 1000 字节以上,重传确认包的代价要小得多。

连接状态控制

mKCP 可以有效地开启和关闭连接。当远程主机主动关闭连接时,连接会在两秒钟之内释放;当远程主机断线时,连接会在最多 30 秒内释放。

原生 KCP 不支持这个场景。

================================================ FILE: chapter_02/transport/quic.html ================================================ QUIC · Project V 官方网站

QUIC 传输方式

QUIC 全称 Quick UDP Internet Connection,是由 Google 提出的使用 UDP 进行多路并发传输的协议。其主要优势是:

  1. 减少了握手的延迟(1-RTT 或 0-RTT)
  2. 多路复用,并且没有 TCP 的阻塞问题
  3. 连接迁移,(主要是在客户端)当由 Wifi 转移到 4G 时,连接不会被断开。

QUIC 目前处于实验期,使用了正在标准化过程中的 IETF 实现,不能保证与最终版本的兼容性。

版本历史

V2Ray 4.7:

  • 开始支持 QUIC。
  • 默认设定:
    • 12 字节的 Connection ID
    • 30 秒没有数据通过时自动断开连接 (可能会影响一些长连接的使用)

QuicObject

QUIC 的配置对应传输配置中的 quicSettings 项。对接的两端的配置必须完全一致,否则连接失败。QUIC 强制要求开启 TLS,在传输配置中没有开启 TLS 时,V2Ray 会自行签发一个证书进行 TLS 通讯。在使用 QUIC 传输时,可以关闭 VMess 的加密。

{
  "security": "none",
  "key": "",
  "header": {
    "type": "none"
  }
}

security: "none" | "aes-128-gcm" | "chacha20-poly1305"

加密方式。默认值为不加密。

此加密是对 QUIC 数据包的加密,加密后数据包无法被探测。

key: string

加密时所用的密钥。可以是任意字符串。当security不为"none"时有效。

header: HeaderObject

数据包头部伪装设置

HeaderObject

{
  "type": "none"
}

type: string

伪装类型,可选的值有:

  • "none": 默认值,不进行伪装,发送的数据是没有特征的数据包。
  • "srtp": 伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。
  • "utp": 伪装成 uTP 数据包,会被识别为 BT 下载数据。
  • "wechat-video": 伪装成微信视频通话的数据包。
  • "dtls": 伪装成 DTLS 1.2 数据包。
  • "wireguard": 伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)

当加密和伪装都不启用时,数据包即为原始的 QUIC 数据包,可以与其它的 QUIC 工具对接。为了避免被探测,建议加密或伪装至少开启一项。

================================================ FILE: chapter_02/transport/tcp.html ================================================ TCP · Project V 官方网站

TCP 传输方式

TcpObject

{
  "header": {
    "type": "none"
  }
}

header: NoneHeaderObject | HttpHeaderobject

数据包头部伪装设置,默认值为NoneHeaderObject

NoneHeaderObject

不进行伪装

{
  "type": "none"
}

type: "none"

指定不进行伪装

HttpHeaderObject

HTTP 伪装配置必须在对应的入站出站连接上同时配置,且内容必须一致。

{
  "type": "http",
  "request": {},
  "response": {}
}

type: "http"

指定进行 HTTP 伪装

request: HTTPRequestObject

HTTP 请求

response: HTTPResponseObject

HTTP 响应

HTTPRequestObject

{
  "version": "1.1",
  "method": "GET",
  "path": ["/"],
  "headers": {
    "Host": ["www.baidu.com", "www.bing.com"],
    "User-Agent": [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
    ],
    "Accept-Encoding": ["gzip, deflate"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP 版本,默认值为"1.1"

method: string

HTTP 方法,默认值为"GET"

path: [ string ]

路径,一个字符串数组。默认值为["/"]。当有多个值时,每次请求随机选择一个值。

headers: map{ string, [ string ]}

HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。

HTTPResponseObject

{
  "version": "1.1",
  "status": "200",
  "reason": "OK",
  "headers": {
    "Content-Type": ["application/octet-stream", "video/mpeg"],
    "Transfer-Encoding": ["chunked"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP 版本,默认值为"1.1"

status: string

HTTP 状态,默认值为"200"

reason: string

HTTP 状态说明,默认值为"OK"

headers: map{string, [ string ]}

HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。

================================================ FILE: chapter_02/transport/websocket.html ================================================ WebSocket · Project V 官方网站

WebSocket 传输方式

使用标准的 WebSocket 来传输数据。WebSocket 连接可以被其它 HTTP 服务器(如 NGINX)分流。

Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来用做流量的源地址。

示例配置

{
  "path": "/",
  "headers": {
    "Host": "v2ray.com"
  }
}

path string

WebSocket 所使用的 HTTP 协议路径,默认值为 "/"

headers: map{string: string}

自定义 HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是字符串。默认值为空。

================================================ FILE: core/index.html ================================================ Nothing here Nothing to see here; move along. ================================================ FILE: developer/index.html ================================================ 开发人员手册 · Project V 官方网站

开发人员手册

Project V

Project V 由以下几部分组成:

V2Ray 项目组

V2Ray 项目组最初是为了 V2Ray 核心的开发而建立,现在已推广到整个 Project V 生态环境。我们欢迎你加入组织参与开发。当然你也选择可以使用自己的 V2Ray 之外的环境。

加入 V2Ray 的朋友们可以使用项目组提供的如下设施:

  • 私有讨论组: 只对 V2Ray 项目组开放的讨论组。
  • 私有构建环境: 完全封闭的编译环境,可以安全地使用私有内容,如 GPG 私钥。

加入方式

只要你的 Github 帐号已有一些合理的代码,或已向 V2Ray 项目提交过 PR,都可以申请加入。请向love@v2ray.com发送邮件,注明你的 Github 帐号,稍后你会收到邀请。

权限及义务

  • 项目组的所有成员都自动获得 push 和创建 repo 的权限。
  • 除了几个核心的 branch 外,所有成员可以自由地提交代码。
  • 项目组成员有义务汇报任何可能威胁到项目安全的行为。

周边项目

即使不加入项目组,Project V 也欢迎你开发兼容 Project V 的软件。兼容 Project V 的软件须遵循以下协议:

第三方开发者的权利和义务

  1. 开发者拥有所开发软件的全部版权。
  2. 开发者拥有所开发软件的所有盈利,同时也须独立承担开发过程中所有的开销和风险。
  3. 开发者可以在软件中使用 “V2Ray” 和 “Project V” 一词、Project V 图标和其它 Project V 相关的用语。
  4. 开发者可以自由地使用 V2Ray 的核心代码。
  5. 开发者有义务向公众宣传 Project V 项目。
  6. 开发者有义务向 Project V 官方汇报使用过程中的问题。
  7. 开发者有义务在其软件或介绍中提到 Project V 项目和 Project V 官网链接。

Project V 官方的权利和义务

  1. Project V 官方有义务向开发者提供技术支持。
  2. Project V 官方有义务向开发者提供资金支持。在开发者接受的情况下,资金将以不定期捐赠的方式进行。
  3. Project V 官方保留向任何侵权行为追责的权利。
================================================ FILE: developer/intro/compile.html ================================================ 配置开发环境 · Project V 官方网站

配置开发环境

V2Ray 使用 Golang 作为主要编程语言。团队发布流程上使用 Bazel作为构建工具。推荐使用 Mac OS 或 Linux 进行开发,少量的脚本可能无法在 Windows 上正常运行。

前序工作

推荐环境

这里推荐使用Ubuntu 18.04发行版,并使用snap安装go环境 。snap可自动在后台维护golang环境,保持与上游环境一致更新。

拉取 V2Ray 源代码

go get -u v2ray.com/core/...

注意在无法正常访问google的网络环境,这个命令无法完成,需要先配置好一个本地的HTTP代理服务器,并配置本地环境变量,比如

export http_proxy=http://localhost:1080
export https_proxy=http://localhost:1080

go将会使用本地的1080端口的HTTP代理进行源码拉取。

手工构建

cd $(go env GOPATH)/src/v2ray.com/core/main
env CGO_ENABLED=0 go build -o $HOME/v2ray -ldflags "-s -w"

cd $(go env GOPATH)/src/v2ray.com/core/infra/control/main
env CGO_ENABLED=0 go build -o $HOME/v2ctl -tags confonly -ldflags "-s -w"

以上命令在当前用户的$HOME目录下生成刚新构建的v2rayv2ctl执行文件,即可正常使用。

构建其他CPU架构、其他系统(windows/macos)的过程属于golang的交叉编译流程,主要是控制GOOS/GOARCH两个变量,这里不再重复,查阅golang相关文档。

脚本构建

以上手工构建的只是v2ray可执行程序本身,发行包zip内还包含了地址库等其他文件。使用打包脚本可方便地制作出的发布包。

wget https://raw.githubusercontent.com/v2ray/v2ray-core/master/release/user-package.sh) 
chmod 755 user-package.sh

以上脚本直接执行即可在当前目录生成类似v2ray-custom-linux-amd64-20190710-000000.zip的文件,即为发布包。

这个脚本可用一些参数编译出自行定制的发布包:

  • windows 构建windows版本的发布包
  • darwin 构建darwin(MacOS)版本的发布包
  • tgz 最后打包成tar.gz而不是zip格式
  • 386 构建成32位程序
  • arm 构建适合arm架构CPU的程序,arm arm64
  • mips 同上,参照golang的交叉编译文档
  • nodat 不要包含地址库geoip.dat geosite.dat, 可以减小发布包的大小
  • noconf 不要包括范例json, systemd/systemv等配置文件
  • nosource 不要执行go get ...,避免已经拉取到本地的v2ray源码被覆盖

以上参数没有次序要求,只需要按需传给脚本,比如构建一个适合windows 32位,不带地址库,不带样例配置的发布包:

./user-package.sh windows 386 nodat noconf

脚本编译的v2ray,其启动信息会变成用户编译的时间,以做区分:

V2Ray 4.20.0 (user) 20190710-010000
A unified platform for anti-censorship.

用户还可修改脚本内的信息,定制属于自己的版本。

CODENAME="user"
BUILDNAME=$NOW

自动构建

bazel构建工具主要是发布团队使用。

如果只需要构建某个特定平台的安装包,如 Linux / AMD64:

cd $GOPATH/src/v2ray.com/core
bazel build --action_env=GOPATH=$GOPATH --action_env=PATH=$PATH //release:v2ray_linux_amd64_package
#Output: bazel-bin/release/v2ray-linux-64.zip

构建所有安装包:

cd $GOPATH/src/v2ray.com/core
bazel build --action_env=GOPATH=$GOPATH --action_env=PATH=$PATH //release:all

安装构建完成的安装包

$GOPATH/src/v2ray.com/core/release/install-release.sh --local <path/to/zip/file>

自动化从源代码构建

某些场景可能需要从源代码构建,而不能直接下载安装包,比如制作一个安装源的时候。以下提供一个简单的自动构建方法:

  1. 安装 Golang 和 Bazel,并设置 GOPATH。
  2. 下载完整的源代码: curl -L -O https://github.com/v2ray/v2ray-core/releases/latest/src_all.zip。这个压缩包从 3.46.4 开始提供,包含了编译 V2Ray 所需的所有代码。 从4.19开始src_all.zip不再提供,因ext仓库已经合并。
  3. 解压: unzip -d $GOPATH/src/ src_all.zip
  4. 构建:
cd $GOPATH/src/v2ray.com/core
bazel build --action_env=GOPATH=$GOPATH --action_env=PATH=$PATH //release:v2ray_linux_amd64_package
  1. 然后可以解压安装包并重新打包: unzip bazel-bin/release/v2ray-linux-64.zip
================================================ FILE: developer/intro/design.html ================================================ 核心设计 · Project V 官方网站

核心设计

本文描述了 V2Ray 内核(v2ray-core)的设计思路。

目标

  • V2Ray 内核提供了一个平台,支持必要的网络代理功能,在其之上可以进二次开发,以提供更好的用户体验;
  • 以跨平台为首要原则,以减少二次开发的成本;

架构

Architecture

内核分为三层:应用层、代理层和传输层。每一层内包含数个模块,模块间互相独立,同类型的模块可以无缝替换。

应用层

应用层包含一些代理层中常用的功能,这些功能被抽象出来,以便在不同的代理模块中复用。应用层的模块应为纯软件实现,不与硬件或平台相关的技术有关。

重要模块列表:

  • Dispatcher: 用于把入站代理所接收到的数据,传送给出站代理;
  • Router: 内置路由,详见路由配置
  • DNS: 内置的 DNS 缓存;
  • Proxy Manager: 入站代理的管理器;

代理层

代理层分为两部分:入站代理(Inbound Proxy)和出站代理(Outbound Proxy)。两部分相互独立,入站代理不依赖于某个特定的出站代理,反之亦然。所有已实现的协议列表一览。

入站代理

出站代理

传输层

传输层提供一些网络数据传输相关的工具模块。

================================================ FILE: developer/intro/guide.html ================================================ 开发指引 · Project V 官方网站

开发指引

基本

版本控制

Git

分支(Branch)

本项目只使用一个分支,即 master。所有更改全部提交进 master,并确保 master 在任一时刻都是可编译可使用的。

发布(Release)

尽量使用自动化工具发布,比如 v2ray-core 使用 Travis-ci 作为自动编译和发布工具。

引用其它项目

  • Golang
    • 产品代码只能使用 golang 的标准库,即名称不包含任何网址的包;
    • 测试代码可以使用 golang.org/x/... ;
    • 如需引用其它项目请事先创建 Issue 讨论;
  • 其它
    • 只要不违反双方的协议(本项目为 MIT),且对项目有帮助的工具,都可以使用。

开发流程

写代码之前

发现任何问题,或对项目有任何想法,请立即创建 Issue 讨论之,以减少重复劳动和消耗在代码上的时间。

修改代码

  • Golang
    • 请参考 Effective Go
    • 每一次 commit 之前请运行: gofmt -w v2ray.com/core/
    • 每一次 commit 之前请确保测试通过: go test v2ray.com/core/...
    • 提交 PR 之前请确保新增代码有超过 70% 的代码覆盖率(code coverage)。
  • 其它
    • 请注意代码的可读性

Pull Request

  • 提交 PR 之前请先运行 git pull 以确保 merge 可顺利进行;
  • 一个 PR 只做一件事,如有对多个 bug 的修复,请对每一个 bug 提交一个 PR;
  • 由于 Golang 的特殊需求(Package path),Go 项目的 PR 流程和其它项目有所不同:
    1. 先 Fork 本项目,创建你自己的 github.com/your/v2ray-core;
    2. 在你的 Go workspace 中运行:go get -u v2ray.com/core/...
    3. 在 go get 创建的 v2ray-core 目录中运行:git remote add fork https://github.com/you/cooltool.git
    4. 然后你可以在 v2ray-core 中修改代码,由于这是一个 v2ray 的 clone,import path 不受影响;
    5. 修改完成之后,运行:git push fork
    6. 然后去你的 fork(就是 v2ray.com/core)中发一个 PR 即可;
    7. 以上内容修改自这篇文章

对代码的修改

功能性问题

请提交至少一个测试用例(test case)来验证对现有功能的改动。

性能相关

请提交必要的测试数据来证明现有代码的性能缺陷,或是新增代码的性能提升。

新功能

  • 如果新增功能对已有功能不影响,请提供可以开启/关闭的开关(如 flag),并使新功能保持默认关闭的状态;
  • 大型新功能(比如增加一个新的协议)开发之前,请先提交一个 issue,讨论完毕之后再进行开发。

其它

视具体情况而定。

V2Ray 编码规范

以下内容适用于 V2Ray 中的 Golang 代码。

代码结构

v2ray-core
├── app        // 应用模块
│   ├── router // 路由
├── common     // 公用代码
├── proxy      // 通讯协议,参见[协议列表](../chapter_02/02_protocols.md)
│   ├── blackhole
│   ├── dokodemo-door
│   ├── freedom
│   ├── socks
│   ├── vmess
├── transport  // 传输模块

编码规范

基本和 Golang 的官方推荐做法基本一致,有一些例外。写在这里以方便大家熟悉 Golang。

命名

  • 文件和目录名尽量使用单个英文单词,比如 hello.go;
    • 如果实在没办法,则目录使用连接线/文件名使用下划线连接两个(或多个单词),比如 hello-world/hello_again.go;
    • 测试代码使用 _test.go 结尾;
  • 类型使用 Pascal 命名法,比如 ConnectionHandler;
    • 对缩写不强制小写,即 HTML 不必写成 Html;
  • 公开成员变量也使用 Pascal 命名法;
  • 私有成员变量使用小驼峰式命名法,如 privateAttribute;
  • 为了方便重构,方法建议全部使用 Pascal 命名法;
    • 尽管 Golang 中的以大小写区分公开和私有方法,但在实际操作中并不方便。
    • 完全私有的类型放入 internal。

内容组织

  • 一个文件包含一个主要类型,及其相关的私有函数等;
  • 测试相关的文件,如 Mock 等工具类,放入 testing 子目录;
================================================ FILE: developer/intro/roadmap.html ================================================ 开发计划 · Project V 官方网站

开发计划

版本号

V2Ray Core 的版本号形如 X.Y.Z,其中 X 表示 Milestone,Y 表示 Release,如 2.3 表示第二个 Milestone 的第三个 Release;Z 表示测试版本。

周期

V2Ray Core 每周发布一个 Release。从 2.0 开始,每个 Milestone 持续一年。

进度管理

所有新功能的讨论和计划都放在 v2ray/Planning

================================================ FILE: developer/intro/tools.html ================================================ 开发工具 · Project V 官方网站

开发工具

第三方 SDK

自动化工具

V2Ray 使用下列自动化工具进行编译和发布。

================================================ FILE: developer/protocols/mkcp.html ================================================ mKCP 协议 · Project V 官方网站

mKCP 协议

mKCP 是流式传输协议,由 KCP 协议修改而来,可以按顺序传输任意的数据流。

版本

mKCP 没有版本号,不保证版本之间兼容性。

依赖

底层协议

mKCP 是一个基于 UDP 的协议,所有通讯使用 UDP 传输。

函数

  • fnv: FNV-1a 哈希函数
    • 输入参数为任意长度的字符串;
    • 输入出一个 32 位无符号整数;

通讯过程

  1. mKCP 将数据流拆成若干个数据包进行发送。一个数据流有一个唯一标识,用以区分不同的数据流。数据流中的每一个数据包都携带了同样的标识。
  2. mKCP 没有握手过程,当收到一个数据包时,根据其携带的数据流的标识来判断是否为新的通话,或是正在进行中的通话。
  3. 每一个数据包中包含若干个片段(Segment),片段分为三类:数据(Data)、确认(ACK)、心跳(Ping)。每个片段需要单独处理。

数据格式

数据包

4 字节 2 字节 L 字节
认证信息 A 数据长度 L 片段部分

其中:

  • 认证信息 A = fnv(片段部分),big endian;
  • 片段部分可能包含多个片段;

数据片段

2 字节 1 字节 1 字节 4 字节 4 字节 4 字节 2 字节 Len 字节
标识 Conv 指令 Cmd 选项 Opt 时间戳 Ts 序列号 Sn 未确认序列号 Una 长度 Len 数据

其中:

  • 标识 Conv: mKCP 数据流的标识
  • 指令 Cmd: 常量 0x01
  • 选项 Opt: 可选的值有:
    • 0x00: 空选项
    • 0x01: 对方已发出所有数据
  • 时间戳 Ts: 当前片段从远端发送出来时的时间,big endian
  • 序列号 Sn: 该数据片段时数据流中的位置,起始片段的序列号为 0,之后每个新片段按顺序加 1
  • 未确认序列号 Una: 远端主机正在发送的,且尚未收到确认的最小的 Sn

确认片段

2 字节 1 字节 1 字节 4 字节 4 字节 4 字节 2 字节 Len * 4 字节
标识 Conv 指令 Cmd 选项 Opt 窗口 Wnd 下一接收序列号 Sn 时间戳 Ts 长度 Len 已收到的序列号

其中:

  • 标识 Conv: mKCP 数据流的标识
  • 指令 Cmd: 常量 0x00
  • 选项 Opt: 同上
  • 窗口 Wnd: 远端主机可以接收的最大序列号
  • 下一接收序列号 Sn: 远端主机未收到的数据片段中的最小序列号
  • 时间戳 Ts: 远端主机最新收到的数据片段的时间戳,可用于计算延迟
  • 已收到的序列号: 每个 4 字节,表示此序列号的数据已经确认收到

注释:

  • 远程主机期待收到序列号 [Sn, Wnd) 范围内的数据

心跳片段

2 字节 1 字节 1 字节 4 字节 4 字节 4 字节
标识 Conv 指令 Cmd 选项 Opt 未确认序列号 Una 下一接收序列号 Sn 延迟 Rto

其中:

  • 标识 Conv: mKCP 数据流的标识
  • 指令 Cmd: 可选的值有
    • 0x02: 远端主机强行终止会话
    • 0x03: 正常心跳
  • 选项 Opt: 同上
  • 未确认序列号 Una: 同数据片段的 Una
  • 下一接收序列号 Sn: 同确认片段的 Sn
  • 延迟 Rto: 远端主机自己计算出的延迟
================================================ FILE: developer/protocols/muxcool.html ================================================ Mux.Cool · Project V 官方网站

Mux.Cool 协议

Mux.Cool 协议是一个多路复用传输协议,用于在一条已建立的数据流中传输多个各自独立的数据流。

版本

当前版本是 1 Beta。

依赖

底层协议

Mux.Cool 必须运行在一个已建立的可靠数据流之上。

通讯过程

一个 Mux.Cool 连接中可传输若干个子连接,每个子连接有一个独立的 ID 和状态。传输过程由帧(Frame)组成,每一帧用于传输一个特定的子连接的数据。

客户端行为

当有连接需求时并且没有现有可用的连接时,客户端向服务器发起一个新连接,以下称为“主连接”。

  1. 一个主连接可用于发送若干个子连接。客户端可自主决定主连接可承载的子连接数量。
  2. 对于一个新的子连接,客户端必须发送状态New以通知服务器建立子连接,然后使用状态Keep来传送数据。
  3. 当子连接结束时,客户端发送End状态来通知服务器关闭子连接。
  4. 客户端可自行决定何时关闭主连接,但必须确定服务器也同时保持连接。
  5. 客户端可使用 KeepAlive 状态来避免服务器关闭主连接。

服务器端行为

当服务器端接收到新的子连接时,服务器应当按正常的连接来处理。

  1. 当收到状态End时,服务器端可以关闭对目标地址的上行连接。
  2. 在服务器的响应中,必须使用与请求相同的 ID 来传输子连接的数据。
  3. 服务器不能使用New状态。
  4. 服务器可使用 KeepAlive 状态来避免客户端关闭主连接。

传输格式

Mux.Cool 使用对称传输格式,即客户端和服务器发送和接收相同格式的数据。

帧格式

2 字节 L 字节 X 字节
元数据长度 L 元数据 额外数据

元数据

元数据有若干种类型,由状态 S 来区分。所有类型的元数据都包含 ID 和 Opt 两项,其含义为:

  • ID: 子连接的唯一标识
  • Opt:
    • D(0x01): 有额外数据

当选项 Opt(D) 开启时,额外数据格式如下:

2 字节 L 字节
长度 L 数据

新建子连接 (New)

2 字节 1 字节 1 字节 1 字节 2 字节 1 字节 X 字节
ID 0x01 选项 Opt 网络类型 N 端口 地址类型 T 地址 A

其中:

  • 网络类型 N:
    • 0x01:TCP,表示当前子连接的流量应当以 TCP 的方式发送至目标。
    • 0x02:UDP,表示当前子连接的流量应当以 UDP 的方式发送至目标。
  • 地址类型 T:
    • 0x01:IPv4
    • 0x02:域名
    • 0x03:IPv6
  • 地址 A:
    • 当 T = 0x01 时,A 为 4 字节 IPv4 地址;
    • 当 T = 0x02 时,A 为 1 字节长度(L) + L 字节域名;
    • 当 T = 0x03 时,A 为 16 字节 IPv6 地址;

在新建子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。

保持子连接 (Keep)

2 字节 1 字节 1 字节
ID 0x02 选项 Opt

在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。

关闭子连接 (End)

2 字节 1 字节 1 字节
ID 0x03 选项 Opt

在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。

保持连接 (KeepAlive)

2 字节 1 字节 1 字节
ID 0x04 选项 Opt

在保持连接时:

  • 若 Opt(D) 开启,则这一帧所带的数据必须被丢弃。
  • ID 可为随机值。

应用

Mux.Cool 协议与底层协议无关,理论上可以使用任何可靠的流式连接来传输 Mux.Cool 的协议数据。

在目标导向的协议如 Shadowsocks 和 VMess 协议中,连接建立时必须包含一个指定的地址。为了保持兼容性,Mux.Cool 协议指定地址为“v1.mux.cool”。即当主连接的目标地址与之匹配时,则进行 Mux.Cool 方式的转发,否则按传统方式进行转发。

修订历史

2017.04.12 重构页面,加入 KeepAlive 状态 2017.04.03 初版

================================================ FILE: developer/protocols/vmess.html ================================================ VMess 协议 · Project V 官方网站

VMess 协议

VMess 是 V2Ray 原创的加密通讯协议。

版本

当前版本号为 1。

依赖

底层协议

VMess 是一个基于 TCP 的协议,所有数据使用 TCP 传输。

用户 ID

ID 等价于 UUID,是一个 16 字节长的随机数,它的作用相当于一个令牌(Token)。 一个 ID 形如:de305d54-75b4-431b-adb2-eb6b9e546014,几乎完全随机,可以使用任何的 UUID 生成器来生成,比如这个

用户 ID 可在配置文件中指定。

函数

  • MD5: MD5 函数
    • 输入参数为任意长度的 byte 数组
    • 输出为一个 16 byte 的数组
  • HMAC: HMAC 函数
    • 输入参数为:
      • H:散列函数
      • K:密钥,任意长度的 byte 数组
      • M:消息,任意长度的 byte 数组
  • Shake: SHA3-Shake128 函数
    • 输入参数为任意长度的字符串
    • 输出为任意长度的字符串

通讯过程

VMess 是一个无状态协议,即客户端和服务器之间不需要握手即可直接传输数据,每一次数据传输对之前和之后的其它数据传输没有影响。 VMess 的客户端发起一次请求,服务器判断该请求是否来自一个合法的客户端。如验证通过,则转发该请求,并把获得的响应发回给客户端。 VMess 使用非对称格式,即客户端发出的请求和服务器端的响应使用了不同的格式。

客户端请求

16 字节 X 字节 余下部分
认证信息 指令部分 数据部分

认证信息

认证信息是一个 16 字节的哈希(hash)值,它的计算方式如下:

  • H = MD5
  • K = 用户 ID (16 字节)
  • M = UTC 时间,精确到秒,取值为当前时间的前后 30 秒随机值(8 字节, Big Endian)
  • Hash = HMAC(H, K, M)

指令部分

指令部分经过 AES-128-CFB 加密:

  • Key:MD5(用户 ID + []byte('c48619fe-8f02-49e0-b9e9-edf763e17e21'))
  • IV:MD5(X + X + X + X),X = []byte(认证信息生成的时间) (8 字节, Big Endian)
1 字节 16 字节 16 字节 1 字节 1 字节 4 位 4 位 1 字节 1 字节 2 字节 1 字节 N 字节 P 字节 4 字节
版本号 Ver 数据加密 IV 数据加密 Key 响应认证 V 选项 Opt 余量 P 加密方式 Sec 保留 指令 Cmd 端口 Port 地址类型 T 地址 A 随机值 校验 F

选项 Opt 细节:(当某一位为 1 时,表示该选项启用)

0 1 2 3 4 5 6 7
X X X X X M R S

其中:

  • 版本号 Ver:始终为 1;
  • 数据加密 IV:随机值;
  • 数据加密 Key:随机值;
  • 响应认证 V:随机值;
  • 选项 Opt:
    • S (0x01):标准格式的数据流(建议开启);
    • R (0x02):客户端期待重用 TCP 连接(V2Ray 2.23+ 弃用);
      • 只有当 S 开启时,这一项才有效;
    • M (0x04):开启元数据混淆(建议开启);
      • 只有当 S 开启时,这一项才有效;
      • 当其项开启时,客户端和服务器端需要分别构造两个 Shake 实例,分别为 RequestMask = Shake(请求数据 IV), ResponseMask = Shake(响应数据 IV)。
    • X:保留
  • 余量 P:在校验值之前加入 P 字节的随机值;
  • 加密方式:指定数据部分的加密方式,可选的值有:
    • 0x00:AES-128-CFB;
    • 0x01:不加密;
    • 0x02:AES-128-GCM;
    • 0x03:ChaCha20-Poly1305;
  • 指令 Cmd:
    • 0x01:TCP 数据;
    • 0x02:UDP 数据;
  • 端口 Port:Big Endian 格式的整型端口号;
  • 地址类型 T:
    • 0x01:IPv4
    • 0x02:域名
    • 0x03:IPv6
  • 地址 A:
    • 当 T = 0x01 时,A 为 4 字节 IPv4 地址;
    • 当 T = 0x02 时,A 为 1 字节长度(L) + L 字节域名;
    • 当 T = 0x03 时,A 为 16 字节 IPv6 地址;
  • 校验 F:指令部分除 F 外所有内容的 FNV1a hash;

数据部分

数据部分有两种格式,默认为基本格式。

基本格式 (弃用)

此格式仅作为向后兼容所用,在之后的版本中可能被删除。

所有数据均认为是请求的实际内容。这些内容将被发往指令部分所指定的地址。当 Cmd = 0x01 时,这些数据将以 TCP 的形式发送;当 Cmd = 0x02 时,这些数据将以 UDP 形式发送。

此格式支持“不加密”和“AES-128-CFB”两种加密方式,加密的 Key 和 IV 由指令部分指定。

标准格式

当 Opt(S) 开启时,数据部分使用此格式。实际的请求数据被分割为若干个小块,每个小块的格式如下。服务器校验完所有的小块之后,再按基本格式的方式进行转发。

2 字节 L 字节
长度 L 数据包

其中:

  • 长度 L:Big Endian 格式的整型,最大值为 2^14;
    • 当 Opt(M) 开启时,L 的值 = 真实值 xor Mask。Mask = (RequestMask.NextByte() << 8) + RequestMask.NextByte();
  • 数据包:由指定的加密方式加密过的数据包;

在传输结束之前,数据包中必须有实际数据,即除了长度和认证数据之外的数据。当传输结束时,客户端必须发送一个空的数据包,即 L = 0(不加密) 或认证数据长度(有加密),来表示传输结束。

按加密方式不同,数据包的格式如下:

  • 不加密:
    • L 字节:实际数据;
  • AES-128-CFB:整个数据部分使用 AES-128-CFB 加密
    • 4 字节:实际数据的 FNV1a hash;
    • L - 4 字节:实际数据;
  • AES-128-GCM:Key 为指令部分的 Key,IV = count (2 字节) + IV (10 字节)。count 从 0 开始递增,每个数据包加 1;IV 为 指令部分 IV 的第 3 至第 12 字节。
    • L - 16 字节:实际数据;
    • 16 字节:GCM 认证信息
  • ChaCha20-Poly1305:Key = MD5(指令部分 Key) + MD5(MD5(指令部分 Key)),IV = count (2 字节) + IV (10 字节)。count 从 0 开始递增,每个数据包加 1;IV 为 指令部分 IV 的第 3 至第 12 字节。
    • L - 16 字节:实际数据;
    • 16 字节:Poly1305 认证信息

服务器应答

应答头部数据使用 AES-128-CFB 加密,IV 为 MD5(数据加密 IV),Key 为 MD5(数据加密 Key)。实际应答数据视加密设置不同而不同。

1 字节 1 字节 1 字节 1 字节 M 字节 余下部分
响应认证 V 选项Opt 指令 Cmd 指令长度 M 指令内容 实际应答数据

其中:

  • 响应认证 V:必须和客户端请求中的响应认证 V 一致;
  • 选项 Opt:
    • 0x01:服务器端准备重用 TCP 连接(V2Ray 2.23+ 弃用);
  • 指令 Cmd:
    • 0x01:动态端口指令
  • 实际应答数据:
    • 如果请求中的 Opt(S) 开启,则使用标准格式,否则使用基本格式。
    • 格式均和请求数据相同。
      • 当 Opt(M) 开启时,长度 L 的值 = 真实值 xor Mask。Mask = (ResponseMask.NextByte() << 8) + ResponseMask.NextByte();

动态端口指令

1 字节 2 字节 16 字节 2 字节 1 字节 1 字节
保留 端口 Port 用户 ID AlterID 用户等级 有效时间 T

其中:

  • 端口 Port:Big Endian 格式的整型端口号;
  • 有效时间 T:分钟数;

客户端在收到动态端口指令时,服务器已开放新的端口用于通信,这时客户端可以将数据发往新的端口。在 T 分钟之后,这个端口将失效,客户端必须重新使用主端口进行通信。

注释

  • 为确保向前兼容性,所有保留字段的值必须为 0。
================================================ FILE: en/awesome/ads.html ================================================ With Ads · Project V Official

Some Advertisement

The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V.

Self Hosting

Let's Encrypt

Free TLS certificates

Vultr

VPS

2019 limited promotion, $50 free credit

BlueHost

VPS, web hosting

ClouDNS

Domain registration, DNS, SSL certificate

Bandwagon

Well-known VPS provider. Low price for good product.

VPN

BabyDriver

Supports V2Ray. Coupon code: bcb518

喵帕斯

V2Ray support (beta)

Lanan

V2Ray based VPN service. Coupon code: v2ray

V2Net

Customized V2Ray service. Promo code: v2ray.com

Cryptocurrency

LocalBitcoins

Trade Bitcoins offline

CoinCola

OTC market to trade BTC, ETH, BCH, USDT.

Binance

Trading market for crypto currencies.

Coinex

Trading market for crypto currencies.

CoinPayment

Online crypto currency wallet

================================================ FILE: en/awesome/tools.html ================================================ Awesome V · Project V Official

Awesome V

Graphic Client

V2RayW

Download: Github

V2RayN

Download: Github

Clash for Windows

Download: Github

V2RayX

Download: Github

V2RayU

Download: Github

V2RayC

Download: Github

ClashX

Download: Github

Qv2ray

Qv2ray: v2ray Cross-Platform GUI written in Qt, supports multi-language, connection edit and auto-check updates

Download: GitHub

Website (Chinese): https://lhy0403.github.io/Qv2ray

Mellow

Mellow is a rule-based global transparent proxy client for Windows, macOS and Linux.

Download: Github

Kitsunebi

Kitsunebi is an iOS app based on V2Ray. It provides full functionality as V2Ray. It also supports importing and exporting V2Ray compatible JSON configuration.

Download: iTunes

i2Ray

i2Ray is another iOS app based on V2Ray with easy-to-use UI design.

Download: iTunes

Shadowrocket

Shadowrocket is a generic VPN app. Is supports multiple protocols such as Shadowsocks, VMess, SSR etc.

Download: iTunes

Pepi (was ShadowRay)

Pepi is V2Ray compatible app. Is is able create VPN connections based on VMess protocol, and communicate with any V2Ray servers.

Download: iTunes

Quantumult

Download: iTunes

BifrostV

BifrostV is an Android app based on V2Ray core. It supports VMess, Shadowsocks, socks protocols.

Download: Play Store | APK Pure

V2RayNG

V2RayNG is an Android app based on V2Ray. It provides same feature set as V2Ray core.

Download: Play Store | GitHub

Online services

Configuration generator

Online configuration generator.

UUID Generator

UUID generator for VMess users.

================================================ FILE: en/configuration/api.html ================================================ API · Project V Official

API

V2Ray provides some API for remote access. These APIs are based on gRPC.

When API is enabled, V2Ray creates an outbound proxy automatically, tagged as tag. User must route all gRPC connections to this outbound.

ApiObject

ApiObject is used as api field in top level configuration.

{
  "tag": "api",
  "services": [
    "HandlerService",
    "LoggerService",
    "StatsService"
  ]
}

tag: string

The tag of the outbound proxy.

services: [ string ]

List of enabled APIs.

Supported API list

HandlerService

API for manipulating inbound and outbound proxies. The following functionalities are provided:

  • Add a new inbound/outbound proxy.
  • Remove an existing inbound/outbound proxy.
  • Add a new user to an inbound proxy (VMess only).
  • Remove an existing user from an inbound proxy (VMess only).

LoggerService

To restart internal logger. Can work with logrotate for operating log files.

StatsService

Support for internal Statistics.

================================================ FILE: en/configuration/dns.html ================================================ DNS · Project V Official

DNS

V2Ray has an internal DNS server which provides DNS relay for other components.

Due to the complexity of DNS protocol, V2Ray for now only supports basic IP queries (A and AAAA). We recommend to use a professional DNS rely (such as CoreDNS) for V2Ray.

The DNS queries relayed by this DNS service will also be dispatched based on routing settings. No extra configuration is required.

DnsObject

DnsObject is used as dns field in top level configuration.

{
  "hosts": {
    "baidu.com": "127.0.0.1"
  },
  "servers": [
    {
      "address": "1.2.3.4",
      "port": 5353,
      "domains": [
        "domain:v2ray.com"
      ]
    },
    "8.8.8.8",
    "8.8.4.4",
    "localhost"
  ],
  "clientIp": "1.2.3.4",
  "tag": "dns_inbound"
}

hosts: map{string: address}

A list of static addresses, in the form of domain:address. Each entry has a domain name as key and IP or domain address as value. If a DNS query targets one of the domains in this list, the corresponding IP will be returned immediately and DNS query will not be relayed, or the corresponding domain address will be used for further DNS queries, instead of the previous one.

The format of domains is:

  • Plaintext: When the targeting domain is exactly the value, the rule takes effect. Example: rule "v2ray.com" matches "v2ray.com", but not "www.v2ray.com".
  • Regular expression: Begining with "regexp:", the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule "regexp:\\.goo.*\\.com$" matches "www.google.com" and "fonts.googleapis.com", but not "google.com".
  • Subdomain (recommended): Begining with "domain:" and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule "domain:v2ray.com" matches "www.v2ray.com", "v2ray.com", but not "xv2ray.com".
  • Keyword: Begining with "keyword:" and the rest is a pattern. If this string matches any part of the targeting domain, this rule takes effet. Example: rule "keyword:sina.com" matches targeting domain "sina.com", "sina.com.cn" and "www.sina.com", but not "sina.cn".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.

servers: [string | ServerObject | "localhost" ]

List of DNS servers. Each server may be specified in three formats: IP address, ServerObject, or "localhost".

When a server is an IP address, such as "8.8.8.8", V2Ray queries DNS on UDP port 53 on this address.

When a server is "localhost", V2Ray queries local host for DNS.

When "localhost" is used, out-going DNS traffic is not controlled by V2Ray. However, you may redirect DNS queries back to V2Ray with additional configuration.

clientIp: string

IP address of current machine. If specified, V2Ray uses this IP as EDNS-Client-Subnet. This IP can't be a private address.

tag: string

(V2Ray 4.13+) All traffic initiated from this DNS, except to localhost, will have this tag as inbound. It can be used for routing.

ServerObject

{
  "address": "1.2.3.4",
  "port": 5353,
  "domains": [
    "domain:v2ray.com"
  ],
}

address: address

Address of the DNS server. For now only UDP servers are supported.

port: number

Port of the DNS server. Usually it is 53 or 5353.

domains: [string]

A list of domains. If the domain of enquire matches one of the list, this DNS server will be prioritized for DNS query for this domain.

Domain name format is the same as in routing.

When a DNS server has the domain in its domain list, the domain will be queried in this server first, and then other servers. Otherwise DNS queries are sent to DNS servers in the order they appear in the config file.

================================================ FILE: en/configuration/env.html ================================================ Env Variables · Project V Official

Environment Variables

V2Ray reads the following environment variables.

Cache size per connection

  • Name: v2ray.ray.buffer.size or V2RAY_RAY_BUFFER_SIZE
  • Unit: MBytes
  • Default value: 2 on x86, amd64, arm64 and s390x. This cache is disabled on other platforms.
  • Special value: 0 for unlimited cache size

Deprecated. Use bufferSize in Policy.

For each connection, when there is a difference in speed between inbound and outbound traffic, V2Ray will cache some data for larger throughput. This setting controls the size of the cache. The larger the cache, the better the performance.

Location of V2Ray asset

  • Name: v2ray.location.asset or V2RAY_LOCATION_ASSET
  • Default value: Same directory where v2ray is.

This variable specifies a directory where geoip.dat and geosite.dat files are.

Location of V2Ray config

  • Name: v2ray.location.config or V2RAY_LOCATION_CONFIG
  • Default value: Same directory where v2ray is.

This variable specifies a directory where config.json is.

Scatter Reading

  • Name: v2ray.buf.readv or V2RAY_BUF_READV
  • Default value: auto

V2Ray 3.37 uses Scatter/Gather IO. This feature will use less memory when connection speed is over 100 MByte/s. Possible values are: auto, enable and disable.

  • enable: Enable scatter reading.
  • disable: Disable scatter reading.
  • auto: Only enable on Windows, MacOS, Linux when CPU is x86, AMD64 or s390x.

When connection speed is less than 100 MByte/s, no matter whether this is enabled or not, there is no obvious difference in terms of memory usage.

================================================ FILE: en/configuration/index.html ================================================ Configuration · Project V Official

Configuration

V2Ray uses protobuf-based configuration. As protobuf format is less readable, V2Ray also supports configuration in JSON. Before V2Ray runs, it automatically converts JSON config into protobuf. That being said, other configuration formats may be introduced in the furture.

Here we introduce the JSON-based configuration.

JSON, or JavaScript Object Notation, in short is objects in Javascript. One JSON file contains one and only one JSON object, beginning with "{" and ending with "}".

A JSON object contains a list of key value pairs. A key is a string, and a value may be various of types, such as string, number, boolean, array or another object. A typical object is like below:

{
  "stringValue": "This is a string.",
  "numberValue": 42,
  "boolValue": true,
  "arrayValue": ["this", "is", "a", "string", "array"],
  "objectValue": {
    "another": "object"
  }
}

V2Ray supports comments in JSON,annotated by "//" or "/* */". In an editor that doesn't support comments, they may get displayed as errors, but comments actually work fine in V2Ray.

JSON Data Types

Here is a brief introduction of JSON data types. They will be referenced in the rest of docs.

boolean: true | false

Boolean value, has to be either true or false, without quotation mark.

number

Usually non-negative integers, without quotation mark.

string

Sequence of characters, surrounded by quotation mark.

array: []

Array of elements. The type of its elements is usually the same, e.g., [string] is an array of strings.

object: {}

Object. It comes with a list of key value pairs.

A key value pair usually ends with a comma ",", but must not ends with a comma if it is the last element of the object.

V2Ray Common Data Types

map: object {string, string}

An object whose keys and values have fixed types.

address: string

An IP or domain address in string form, such as "8.8.8.8" or "www.v2ray.com"

address_port: string

An address with port, such as "8.8.8.8:53" or "www.v2ray.com:80". In some usages, the address part can be omitted, like ":443".

================================================ FILE: en/configuration/mux.html ================================================ Mux · Project V Official

Multiplexing

Multiplexing, or Mux, is to use one physical TCP connections for multiple virtual TCP connections.

Mux is designed to reduce TCP handshake latency. It is NOT for high throughput. When used for downloading large files or speed measurement, Mux is usually slower than a normal TCP connection.

MuxObject

{
  "enabled": false,
  "concurrency": 8
}

enabled: true | false

Whether or not to enable Mux on an outbound.

concurrency: number

Max number of multiplexed connections that one physical connection can handle at a time. Max value 1024, min value 1, default 8.

================================================ FILE: en/configuration/overview.html ================================================ Overview · Project V Official

Configuration Overview

V2Ray shares a same structure of configuration between server side and client side shown as below. Server and client configurations are different in specific sections.

Below is the top level structure of the configuration. Each section has its own format.

{
  "log": {},
  "api": {},
  "dns": {},
  "stats": {},
  "routing": {},
  "policy": {},
  "inbounds": [],
  "outbounds": [],
  "transport": {}
}

log: LogObject

Log configuration to control log outputs.

api: ApiObject

RPC API to control the V2Ray instance. See API configuration for details.

dns: DnsObject

Configuration for internal DNS server's configurations. If this section is omitted, V2Ray will use your system-wide DNS configuration. For details, see DNS Configurations.

stats: StatsObject

When specified, internal Statistics is enabled.

policy: PolicyObject

Configurations for permissions and other security strategies. For details, see Local Policy.

routing: RoutingObject

Configuration for internal Routing strategy.

inbounds: [ InboundObject ]

An array of InboundObject as configuration for inbound proxies.

outbounds: [ OutboundObject ]

An array of OutboundObject as configuration for outbound proxies. The first outbound in the array is the main one. It is the default outbound in routing decision.

transport: TransportObject

Low-level transport protocol's configurations. For details, see Protocol Transport Options.

LogObject

{
  "access": "/path/to/file",
  "error": "/path/to/file",
  "loglevel": "warning"
}

access: string

Path to access log. If not empty, it must be a legal file path, such as "/tmp/v2ray/_access.log"(Linux), or "C:\\Temp\\v2ray\\_access.log"(Windows). If empty, V2Ray writes access log to stdout.

error: string

Path to error log. If not empty, it must be a legal file path. If empty, V2Ray writes error log to stdout.

loglevel: "debug" | "info" | "warning" | "error" | "none"

Level of logs to be written. Different log levels indicate different content of logs. Default value is "warning".

Log levels:

  • "debug": Information for developers only. Also includes all "info" logs.
  • "info": Information for current state of V2Ray. Users don't have to take care of those. Also includes all "warning" logs.
  • "warning": Something wrong with the environment, usually outside of V2Ray, e.g., network breakage. V2Ray still runs, but users may experience some breakages. Also includes all "error" logs.
  • "error": Something severely wrong, that V2Ray can't run at all.
  • "none": All logging are disabled.

InboundObject

An InboundObject defines an inbound proxy. It handles incoming connections to V2Ray. Available proxies are listed here.

{
  "port": 1080,
  "listen": "127.0.0.1",
  "protocol": "protocol_name",
  "settings": {},
  "streamSettings": {},
  "tag": "inbound_tag_name",
  "sniffing": {
    "enabled": false,
    "destOverride": ["http", "tls"]
  },
  "allocate": {
    "strategy": "always",
    "refresh": 5,
    "concurrency": 3
  },
}

port: number | "env:variable" | string

Port that the proxy is listening on. Acceptable formats are:

  • Integer: actual port number.
  • Environment variable: Beginning with "env:", an env variable specifies the port in string format, such as "env:PORT". V2Ray will decode the variable as string.
  • String: A numberic string value, such as "1234", or a range of ports, such as "5-10" for 6 ports in total.

The actual ports to open also depend on allocate setting. See below.

listen: address

The address to be listened on. Default value is "0.0.0.0" for incoming connections on all network interfaces. Otherwise the value has to be the address of an existing network interface.

protocol: string

Name of the inbound protocol. See each individual for available values.

settings: InboundConfigurationObject

Protocol-specific settings. See InboundConfigurationObject defined in each protocol.

streamSettings: [StreamSettingsObject]

See Protocol Transport Options for detail.

tag: string

The tag of the inbound proxy. It can be used for routing decisions. If not empty, it must be unique among all inbound proxies.

sniffing: SniffingObject

Configuration for content sniffing.

allocate: AllocateObject

Configuration for port allocation.

SniffingObject

{
  "enabled": false,
  "destOverride": ["http", "tls"]
}

enabled: true | false

Whether or not to enable content sniffing.

destOverride: ["http" | "tls"]

An array of content type. If the content type of incoming traffic is specified in the list, the destination of the connection will be overwritten by sniffed value.

AllocateObject

{
  "strategy": "always",
  "refresh": 5,
  "concurrency": 3
}

strategy: "always" | "random"

Strategy of port allocation. When it is set to "always", all port in the port field will be allocated for listening. If "random" is set, V2Ray will listen on number of concurrency ports, and the list of ports are refereshed every refresh minutes.

refresh: number

Number of minutes to refresh the ports of listening. Min value is 2. This setting is only effective when strategy is set to "random".

concurrency: number

Number of ports to listen. Min value is 1. Max value is one third of entire port range.

OutboundObject

An OutboundObject defines an outbound proxy for handling out-going connections. Available protocols are listed here.

{
  "sendThrough": "0.0.0.0",
  "protocol": "protocol_name",
  "settings": {},
  "tag": "this_outbound_tag_name",
  "streamSettings": {},
  "proxySettings": {
    "tag": "another_outbound_tag_name"
  },
  "mux": {}
}

sendThrough: address

An IP address for sending traffic out. The default value, "0.0.0.0" is for randomly choosing an IP available on the host. Otherwise the value has to be an IP address from existing network interfaces.

protocol: string

The protocol name of this outbound. See Protocols for all available values.

settings: OutboundConfigurationObject

Protocol-specific settings. See OutboundConfigurationObject in each individual protocols.

tag: string

The tag of this outbound. If not empty, it must be unique among all outbounds.

streamSettings: StreamSettingsObject

Low-level transport settings. See Protocol Transport Options.

proxySettings: ProxySettingsObject

Configuration for delegating traffic from this outbound to another. When this is set, streamSettings of this outbound will has no effect.

mux: MuxObject

See Mux configuration for detail.

ProxySettingsObject

{
  "tag": "another-outbound-tag"
}

tag: string

When tag is set to the tag of another outbound, the out-going traffic of current outbound will be delegated to the specified one.

================================================ FILE: en/configuration/policy.html ================================================ Policy · Project V Official

Local Policy

Local policy manages policy settings of current V2Ray instance, such as connection timeouts. The policys can be applied to each user level, or the whole system.

PolicyObject

PolicyObject is used as policy field in top level configuration.

{
  "levels": {
    "0": {
      "handshake": 4,
      "connIdle": 300,
      "uplinkOnly": 2,
      "downlinkOnly": 5,
      "statsUserUplink": false,
      "statsUserDownlink": false
    }
  },
  "system": {
    "statsInboundUplink": false,
    "statsInboundDownlink": false
  }
}

level: map{string: LevelPolicyObject}

A list of key value pairs. Each key is a string of integer (restricted by JSON), such as "0", "1", etc. The numeric value is for a certain user level.

User level can be set on each inbound and outbound proxy. V2Ray will apply different policies based on user level.

system: SystemPolicyObject

System-wide policy

LevelPolicyObject

{
  "handshake": 4,
  "connIdle": 300,
  "uplinkOnly": 2,
  "downlinkOnly": 5,
  "statsUserUplink": false,
  "statsUserDownlink": false,
  "bufferSize": 10240
}

handshake: number

Timeout for establishing a connection, in seconds. Default value 4. At the handshake stage of an inbound proxy dealing with a new connection, say VMess reading request header, if it takes longer than handshake time, V2Ray aborts the connection.

connIdle: number

Timeout for idle connections, in seconds. Default value 300. If there is no data passed through the connection in connIdle time, V2Ray aborts the conneciton.

uplinkOnly: number

Time for keeping connections open after the uplink of the connection is closed, in seconds. Default value 2. After remote (server) closes the downlink of the connection, V2Ray aborts the connection after uplinkOnly times.

downlinkOnly: number

Time for keeping connections open after the downlink of the connection is closed, in seconds. Default value 5. After client (browser) closes the uplink of the connection, V2Ray aborts the connection after downlinkOnly time.

In a simple webpage browser scenario, it is safe to set uplinkOnly and downlinkOnly both to 0, for better performance.

statsUserUplink: true | false

When set to true, V2Ray enables stat counter to uplink traffic for all users in this level.

statsUserDownlink: true | false

When set to true, V2Ray enables stat counter to downlink traffic for all users in this level.

bufferSize: number

Size of internal buffer per connection, in kilo-bytes. Default value is 10240. When it is set to 0, the internal buffer is disabled.

Default value (V2Ray 4.4+):

  • 0 on ARM, MIPS and MIPSLE.
  • 4 on ARM64, MIPS64 and MIPS64LE.
  • 512 on other platforms.

Default value (V2Ray 4.3-):

  • 16 on ARM, ARM64, MIPS, MIPS64, MIPSLE and MIPS64LE.
  • 2048 on other platforms.

bufferSize overrides v2ray.ray.buffer.size settings in env variables.

SystemPolicyObject

{
  "statsInboundUplink": false,
  "statsInboundDownlink": false
}

statsInboundUplink: true | false

When set to true, V2Ray enables stat counter for all uplink traffic in all inbound proxies.

statsInboundDownlink: true | false

When set to true, V2Ray enables stat counter for all downlink traffic in all inbound proxies.

================================================ FILE: en/configuration/protocols/blackhole.html ================================================ Blackhole · Project V Official

Blackhole

  • Name: blackhole
  • Type: Outbound

Blackhole is a protocol for outbound connections. It blocks all connections with pre-defined responses. Combined with Routing, this can be used for blocking access to some websites.

ConfigurationObject

{
  "response": {
    "type": "none"
  }
}

response: ResponseObject

Pre-defined response. Blockhole will send (if any) pre-defined data immediately for any connection passed to it and close the connection.

ResponseObject

{
  "type": "none"
}

type: "none" | "http"

Type of the response, available options are:

  • "none": Default value. Empty response.
  • "http": A valid HTTP 403 response.
================================================ FILE: en/configuration/protocols/dns.html ================================================ DNS · Project V Official

DNS

  • Name: dns
  • Type: Outbound

DNS is an outbound proxy. It is mainly used for intercept and proxy DNS queries and responses. This outbound proxy can only accept DNS traffic, including both TCP and UDP based DNS queries. Other type of traffic will result in errors.

When proxying DNS queries, DNS outbound will redirect IP queries (A and AAAA) to internal DNS server. It will send other type of queries directly to its original destination.

DNS outbound proxy is introduced in V2Ray 4.15.

OutboundConfigurationObject

{
    "network": "tcp",
    "address": "1.1.1.1",
    "port": 53
}

network: "tcp" | "udp"

(V2Ray 4.16+) Modify the transport protocol of the DNS traffic. The value may be either "tcp" or "udp". If it is not specified, the original protocol remains unchanged.

address: address

(V2Ray 4.16+) Modify the DNS server address in the request. If it is not specified, the original DNS server address remain unchanged.

port: number

(V2Ray 4.16+) Modify the DNS server port in the request. If it is not specified, the original DNS server port remain unchanged.

================================================ FILE: en/configuration/protocols/dokodemo.html ================================================ Dokodemo · Project V Official

Dokodemo-door

  • Name: dokodemo-door
  • Type: Inbound

Dokodemo-door is a protocol for inbound connections. It take any connections and passes them to the specified destination.

Dokodemo-door can also (if configured) work as a transparent proxy.

ConfigurationObject

{
  "address": "8.8.8.8",
  "port": 53,
  "network": "tcp",
  "followRedirect": false,
  "userLevel": 0
}

address: address

Address of the destination server. May be an IPv4, IPv6 or a domain, in string form. When followRedirect (see below) is true, address can be empty.

port: number

Port of the destination server.

network: "tcp" | "udp" | "tcp,udp"

Type of acceptable network. If "tcp" is specified, all UDP traffic sent to this dokodemo-door will be discarded.

followRedirect: true | false

When set to true, dokodemo-door will recognize destination from TProxy and use it as its destination. See TProxy in transport for detail.

userLevel: number

User level. All connections share this level. See Policy for details.

Examples for transparent proxy

Add a dokodemo-door inbound as below.

{
  "network": "tcp,udp",
  "timeout": 30,
  "followRedirect": true
}

Configure iptables as below.

# Create new chain
iptables -t nat -N V2RAY
iptables -t mangle -N V2RAY
iptables -t mangle -N V2RAY_MARK

# Ignore your V2Ray server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A V2RAY -d 123.123.123.123 -j RETURN

# Ignore LANs and any other addresses you'd like to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN

# Anything else should be redirected to Dokodemo-door's local port
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345

# Add any UDP rules
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A V2RAY -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A V2RAY_MARK -p udp --dport 53 -j MARK --set-mark 1

# Apply the rules
iptables -t nat -A OUTPUT -p tcp -j V2RAY
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -A OUTPUT -j V2RAY_MARK
================================================ FILE: en/configuration/protocols/freedom.html ================================================ Freedom · Project V Official

Freedom

  • Name: freedom
  • Type: Outbound

Freedom is a protocol for outbound connections. It passes all TCP or UDP connection to their destinations. This outbound is used when you want to send traffic to its real destination.

ConfigurationObject

{
  "domainStrategy": "AsIs",
  "redirect": "127.0.0.1:3366",
  "userLevel": 0
}

domainStrategy: "AsIs" | "UseIP"

Strategy for domain name resolution. Options are:

  • "AsIs": Default value. Resolve domain name by system.
  • "UseIP": Use internal DNS for domain name resolution.
  • "UseIPv4": Use IPv4 address only, after resolved by internal DNS.
  • "UseIPv6": Use IPv6 address only, after resolved by internal DNS.

(V2Ray 4.6+) In UseIP mode, when sendThrough is specified in OutboundObject, Freedom will automatically choose between IPv4 and IPv6 address for destination based on sendThrough settings.

(V2Ray 4.7+) If sendThrough address conflicts with "UseIPv4" or "UseIPv6", Freedom will fail to dial out-going connections.

redirect: address_port

Redirect all connections to this address, in form like "127.0.0.1:80" or ":1234".

  • When address is empty, e.g. ":443", Freedom will use the original destination address.
  • When port is 0, e.g. "v2ray.com:0", Freedom will use the original port.

userLevel: number

User level. All connections share this level.

================================================ FILE: en/configuration/protocols/http.html ================================================ HTTP · Project V Official

HTTP

  • Name: http
  • Type: Inbound

HTTP is a protocol for inbound connections. It is compatible with HTTP/1.1.

InboundConfigurationObject

{
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "allowTransparent": false,
  "userLevel": 0
}

accounts: [AccountObject]

An array in which each entry is an account. It is empty by default. If not empty, HTTP Basic Authentication is required for incoming requests.

allowTransparent: true | false

If set to true, all HTTP request sent to this inbound will be proxied, including non-proxy request.

userLevel: number

User level. All connections share this level.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Username for HTTP authentication.

pass: string

password for HTTP authentication.

Use the following settings in Linux to use HTTP proxy in current session.

  • export http_proxy=http://127.0.0.1:8080/ (URL has to change according to your config)
  • export https_proxy=$http_proxy

================================================ FILE: en/configuration/protocols/mtproto.html ================================================ MTProto · Project V Official

MTProto

  • Name: mtproto
  • Type: Inbound / Outbound

MTProto proxy is a special procol for Telegram. It consists of a pair of inbound and outboud proxies in V2Ray. They are usually used together for building a proxy for Telegram

For now V2Ray only supports IPv4 address of Telegram server.

InboundConfigurationObject

{
  "users": [{
    "email": "love@v2ray.com",
    "level": 0,
    "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
  }]
}

users: [UserObject]

An array of users. For now only the first user is effective.

UserObject

{
  "email": "love@v2ray.com",
  "level": 0,
  "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}

email: string

User email. Used for tracking purposes. See Stats.

level: number

User level.

secret: string

User secret. In Telegram, user secret must be 32 characters long, and only contains characters between 0 to 9, and ato f.

You may use the following command to generate MTProto secret: openssl rand -hex 16

Outbound configuration

{
}

Sample

MTProto can only be used for Telegram traffic. You may need a routing rule to combine the corresponding inbound and outbound. Here is an incomplete sample.

Inbound:

{
  "tag": "tg-in",
  "port": 443,
  "protocol": "mtproto",
  "settings": {
    "users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
  }
}

Outbound:

{
  "tag": "tg-out",
  "protocol": "mtproto",
  "settings": {}
}

Routing:

{
  "type": "field",
  "inboundTag": ["tg-in"],
  "outboundTag": "tg-out"
}

The configure your Telegram app to connect to 443 port on this machine.

================================================ FILE: en/configuration/protocols/shadowsocks.html ================================================ Shadowsocks · Project V Official

Shadowsocks

  • Name: shadowsocks
  • Type: Inbound / Outbound

Shadowsocks protocol, for both inbound and outbound connections.

Compatibility with official version:

  • Supports both TCP and UDP connections, where UDP can be optional turned off.
  • Supports OTA
    • Client may choose to turn on or off.
    • Server may choose to enable, disable or auto.
  • Encryption methods (AEAD ciphers added in V2Ray 3.0):
    • aes-256-cfb
    • aes-128-cfb
    • chacha20
    • chacha20-ietf
    • aes-256-gcm
    • aes-128-gcm
    • chacha20-poly1305 a.k.a. chacha20-ietf-poly1305
  • Plugins:
    • Support obfs through standalone mode.

InboundConfigurationObject

{
  "email": "love@v2ray.com",
  "method": "aes-128-cfb",
  "password": "password",
  "level": 0,
  "ota": true,
  "network": "tcp"
}

email: string

Email address. Used for user identification.

method: string

Required. See Encryption methods for available values.

password: string

Required. Password in Shadowsocks protocol. Can be any string.

level: number

User level. Default to 0. See Policy.

ota: true | false

Whether or not to force OTA. If true and the incoming connection doesn't enable OTA, V2Ray will reject this connection. Vice versa.

If this field is not specified, V2Ray auto detects OTA settings from incoming connections.

When AEAD encryption is used, ota has no effect.

network: "tcp" | "udp" | "tcp,udp"

Type of supported networks. Default to "tcp".

OutboundConfigurationObject

{
  "servers": [
    {
      "email": "love@v2ray.com",
      "address": "127.0.0.1",
      "port": 1234,
      "method": "method",
      "password": "password",
      "ota": false,
      "level": 0
    }
  ]
}

Where:

  • email: Email address. Used for user identification.
  • address: Address of Shadowsocks server. Can be IPv4, IPv6 or domain.
  • port: Port of Shadowsocks server.
  • method: Encryption method. No default value. Options are:
    • "aes-256-cfb"
    • "aes-128-cfb"
    • "chacha20"
    • "chacha20-ietf"
    • "aes-256-gcm"
    • "aes-128-gcm"
    • "chacha20-poly1305" or "chacha20-ietf-poly1305"
  • password: Password. Can be any string.
  • ota: Whether or not to use OTA.
    • When AEAD is used, ota has no effect.
  • level: User level.

servers: [ServerObject]

An array of ServerObjects.

ServerObject

{
  "email": "love@v2ray.com",
  "address": "127.0.0.1",
  "port": 1234,
  "method": "加密方式",
  "password": "密码",
  "ota": false,
  "level": 0
}

email: string

Email address. Used for user identification.

address: address

Required. Shadowsocks server address. May be IPv4, IPv6 or domain address.

port: number

Required. Shadowsocks server port.

method: string

Required. See Encryption methods for available values.

password: string

Required. Password in Shadowsocks protocol. Can be any string.

ota: true | false

Whether or not to use OTA. Default value is false.

When AEAD encryption is used, this field has no effect.

level: number

User level.

Encryption methods

  • "aes-256-cfb"
  • "aes-128-cfb"
  • "chacha20"
  • "chacha20-ietf"
  • "aes-256-gcm"
  • "aes-128-gcm"
  • "chacha20-poly1305" or "chacha20-ietf-poly1305"
================================================ FILE: en/configuration/protocols/socks.html ================================================ SOCKS · Project V Official

Socks

  • Name: socks
  • Type: Inbound / Outbound

Socks is an implementation of standard SOCKS protocol, compatible with Socks 4, Socks 4a and Socks 5.

Socks configuration consists of two parts, InboundConfigurationObject and OutboundConfigurationObject, for inbound and outbound respectively.

OutboundConfigurationObject

OutboundConfigurationObject is used as settings field in OutboundObject in top level configuration.

{
  "servers": [{
    "address": "127.0.0.1",
    "port": 1234,
    "users": [
      {
        "user": "test user",
        "pass": "test pass",
        "level": 0
      }
    ]
  }]
}

servers: [ ServerObject ]

An array of Socks servers.

ServerObject

{
  "address": "127.0.0.1",
  "port": 1234,
  "users": [
    {
      "user": "test user",
      "pass": "test pass",
      "level": 0
    }
  ]
}

address: address

Socks server address. May be IPv4, IPv6 or domain address.

Only support Socks 5 servers.

port: number

Socks server port.

users: [ UserObject ]

An array of users. Each element in the array is an user. If the list is not empty. Socks inbound will force user authentication. Otherwise, anonymous user is allowed.

UserObject

{
  "user": "test user",
  "pass": "test pass",
  "level": 0
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

level: number

User level for tracking and policy purpose. Default value is 0.

InboundConfigurationObject

{
  "auth": "noauth",
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "udp": false,
  "ip": "127.0.0.1",
  "userLevel": 0
}

auth: "noauth" | "password"

Socks autentication method. "noauth" is for anonymous authentication, and "password" for authentication with username and password. Default value is "noauth".

accounts: [ AccountObject ]

An array of user accounts, for authenication purpose. Only take effect when auth is set to "password".

udp: true | false

Whether or not to enable UDP. Default value is false.

ip: address

When UDP is enabled, V2Ray needs to know the IP address of current host. Default value is "127.0.0.1". This must be set to the public IP address of the host, if you want to allow public UDP traffic.

userLevel: number

User level. All incoming connections share this user level.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

================================================ FILE: en/configuration/protocols/vmess.html ================================================ VMess · Project V Official

VMess

  • Name: vmess
  • Type: Inbound / Outbound

VMess is a protocol for encrypted communications. It includes both inbound and outbound proxy.

VMess depends on system time. Please ensure that your system time is in sync with UTC time. Timezone doesn't matter. One may install ntp service on Linux to automatically adjust system time.

OutboundConfigurationObject

{
  "vnext": [
    {
      "address": "127.0.0.1",
      "port": 37192,
      "users": [
        {
          "id": "27848739-7e62-4138-9fd3-098a63964b6b",
          "alterId": 4,
          "security": "auto",
          "level": 0
        }
      ]
    }
  ]
}

vnext: [ ServerObject ]

An array, where each element presents a remote server

ServerObject

{
  "address": "127.0.0.1",
  "port": 37192,
  "users": []
}

address: address

Server address, may be IPv4, IPv6 or domain name.

port: number

Server port

users: [ UserObject ]

An array where each element is an VMess user

UserObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "alterId": 16,
  "security": "auto",
  "level": 0
}

id: string

User ID, in the form of a UUID.

alterId: number

Number of alternative IDs. The alternative IDs will be generated in a deterministic way. Default to 0. Maximum 65535. Recommend 4. Its value must be not larger than the one in corresponding Inbound.

level: number

User level. See Policy for more detail.

security: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none"

Method for encrypting payload. This setting is only available at outbound. The VMess inbound will automatically recognize this setting and decrypt payload accordingly. Options are:

  • "aes-128-gcm": Recommended for PC.
  • "chacha20-poly1305": Recommended for mobile.
  • "auto": Default value. Use aes-128-gcm on AMD64, ARM64 and S390x, or chacha20-poly1305 otherwise.
  • "none": Traffic is not encrypted at all.

Use "auto" wherever possible for better compatibility.

InboundConfigurationObject

{
  "clients": [
    {
      "id": "27848739-7e62-4138-9fd3-098a63964b6b",
      "level": 0,
      "alterId": 4,
      "email": "love@v2ray.com"
    }
  ],
  "default": {
    "level": 0,
    "alterId": 4
  },
  "detour": {
    "to": "tag_to_detour"
  },
  "disableInsecureEncryption": false
}

clients: [ ClientObject ]

An array for valid user accounts. May be empty when used for dynamic port feature.

detour: DetourObject

Optional feature to suggest client to take a detour. If specified, this inbound will instruct the outbound to use another inbound.

default: DefaultObject

Optional default client configuration. Usually used with detour.

disableInsecureEncryption: true | false

Forbids client for using insecure encryption methods. When set to true, connections will be terminated immediately if the following encryption is used. Default value false.

  • none
  • aes-128-cfb

ClientObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "level": 0,
  "alterId": 4,
  "email": "love@v2ray.com"
}

id: string

User ID, in the form of UUID.

level: number

User level. See Policy for its usage.

alterId: number

Number of alternative IDs. Same as in Outbound.

email: string

Email address for user identification.

DetourObject

{
  "to": "tag_to_detour"
}

to: string

The tag of an inbound proxy. See Overview. If configured, VMess will suggest its client to use the detour for further connections.

DefaultObject

{
  "level": 0,
  "alterId": 4
}

level: number

User level.

alterId: number

Number of alternative IDs. Default value 64. Recommend 4.

================================================ FILE: en/configuration/protocols.html ================================================ Protocols · Project V Official

Protocols

V2Ray supports the following protocols. Each protocol may be an inbound protocol, or an outbound protocol, or both.

================================================ FILE: en/configuration/reverse.html ================================================ Reverse · Project V Official

Reverse Proxy

Reverse proxy is an optional feature in V2Ray. It redirects traffic from a server to a client. Thus is so called "Reverse" proxying.

Reverse proxy is available in V2Ray 4.0+. It is now in beta, and may be improved in near future.

Reverse proxy works in the following way:

  • Suppose there is a device A that runs a web server. Device A has no public IP address, and can't be accessed from internet. There is another device B, say a cloud server, which can be access from internet. We need to use B as portal, to redirect traffice to A.
  • Now we install a V2Ray on device A, named bridge. And then install a V2Ray on device B, named portal.
  • bridge will open connections to portal. Their target can be customized for routing purpose. portal will receive these connections, as well as connections from other uses in the internet. portal will "connect" these two kind of connections. Then the interent traffic will be tunneled to bridge.
  • After bridge receives traffic from internet through portal, it will send these traffic to the web server on localhost. You may configure routing for these traffic as well.
  • bridge will control load balance based of the amount of traffic.

Reverse proxy has already leveraged Mux. It is not necessary to configure Mux again on its outbound.

ReverseObject

ReverseObject is used as reverse field in top level configuration.

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }],
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"
  }]
}

bridges: [BridgeObject]

An array of bridges. Each bridge is a BridgeObject.

portals: [PortalObject]

An array of portals. Each portal is a PortalObject.

BridgeObject

{
  "tag": "bridge",
  "domain": "test.v2ray.com"
}

tag: string

A tag. All traffic initiated by this bridge will have this tag. It can be used for routing, identified as inboundTag.

domain: string

A domain. All connections initiated by bridge towards portal will use this domain as target. This domain is only used for communication between bridge and portal. It is not necessary to be actually registered.

PortalObject

tag: string

A Tag. You need to redirect all traffic to this portal, by targeting outboundTag to this tag. The traffic includes the connections from bridge, as well as internet traffic.

domain: string

A domain. When a connection targeting this domain, portal considers it is a connection from bridge, otherwise it is an internet connection.

Like other usages, a V2Ray instance can be used as a bridge, or a portal, or both as the same time.

Example configuration

bridge usually needs two outbounds. One for connecting portal, and another for connecting local web server.

Reverse:

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }]
}

Outbound:

{
  "tag": "out"
  "protocol": "freedom",
  "settings": {
    "redirect": "127.0.0.1:80" // Send traffic to local web server
  }
},
{
  "protocol": "vmess",
  "settings": {
    "vnext": [{
      "address": "portal的IP地址",
      "port": 1024,
      "users": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
    }]
  },
  "tag": "interconn"
}

Routing:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["bridge"],
    "domain": ["full:test.v2ray.com"],
    "outboundTag": "interconn"
  },{
    "type": "field",
    "inboundTag": ["bridge"],
    "outboundTag": "out"
  }]
}

portal usually needs two inbounds. One for connections from bridge, and another for internet connections.

Reverse:

{
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"  // Must be the same as in bridge
  }]
}

Inbound:

{
  "tag": "external",
  "port": 80,  // Open port 80 for internet HTTP traffic
  "protocol": "dokodemo-door",
  "settings": {
    "address": "127.0.0.1",
    "port": 80,
    "network": "tcp"
  }
},
{
  "port": 1024, // For bridge connections
  "tag": "interconn",
  "protocol": "vmess",
  "settings": {
    "clients": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
  }
}

Routing:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["external"],
    "outboundTag": "portal"
  },{
    "type": "field",
    "inboundTag": ["interconn"],
    "outboundTag": "portal"
  }]
}

In practice, you may want to run bridge first and then portal.

================================================ FILE: en/configuration/routing.html ================================================ Routing · Project V Official

Routing

V2Ray has an internal routing mechanism. It routes inbound connections to various outbound based on rules. A common scenario is to split traffic by country. V2Ray can detect target country (by Geo IP) of a connection, and sends then connection to corresponding outbound proxy.

RoutingObject

RoutingObject is used as routing in top level configuration.

{
  "domainStrategy": "AsIs",
  "rules": [],
  "balancers": []
}

domainStrategy: "AsIs" | "IPIfNonMatch" | "IPOnDemand"

Domain resolution strategy. Choices are:

  • "AsIs": Only use domain for routing. Default value.
  • "IPIfNonMatch": When no rule matches current domain, V2Ray resolves it into IP addresses (A or AAAA records) and try all rules again.
    • If a domain has multiple IP addresses, V2Ray tries all of them.
    • The resolved IPs are only used for routing decisions, the traffic is still sent to original domain address.
  • "IPOnDemand": As long as there is a IP-based rule, V2Ray resolves the domain into IP immediately.

rules: [RuleObject]

An array of rules. For each inbound connection, V2Ray tries these rules from top down one by one. If a rule takes effect, the connection will be routed to the outboundTag (or balancerTag, V2Ray 4.4+) of the rule.

balancers: [ BalancerObject ]

(V2Ray 4.4+) An array of load balancers. When a routing rule points to a load balancer, the balancer will select an outbound based on configuration. Then traffic will be sent to that outbound.

RuleObject

{
  "type": "field",
  "domain": [
    "baidu.com",
    "qq.com",
    "geosite:cn"
  ],
  "ip": [
    "0.0.0.0/8",
    "10.0.0.0/8",
    "fc00::/7",
    "fe80::/10",
    "geoip:cn"
  ],
  "port": "53,443,1000-2000",
  "network": "tcp",
  "source": [
    "10.0.0.1"
  ],
  "user": [
    "love@v2ray.com"
  ],
  "inboundTag": [
    "tag-vmess"
  ],
  "protocol":["http", "tls", "bittorrent"],
  "attrs": "attrs[':method'] == 'GET'",
  "outboundTag": "direct",
  "balancerTag": "balancer"
}

When multiple fields are specified, these fields have to be all satisfied, in order to make the rule effective. If you need both domain and ip rules, it is highly likely you need put them into separate rules.

type: "field"

The only valid value for now is "field".

domain: [ string ]

An array of domains. Available formats are:

  • Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule "sina.com" matches targeting domain "sina.com", "sina.com.cn" and "www.sina.com", but not "sina.cn".
  • Regular expression: Begining with "regexp:", the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule "regexp:\\.goo.*\\.com$" matches "www.google.com" and "fonts.googleapis.com", but not "google.com".
  • Subdomain (recommended): Begining with "domain:" and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule "domain:v2ray.com" matches "www.v2ray.com", "v2ray.com", but not "xv2ray.com".
  • Full domain: Begining with "full:" and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule "domain:v2ray.com" matches "v2ray.com", but not "www.v2ray.com".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.
  • Domains from file: Such as "ext:file:tag". The value must begin with ext: (lowercase), and followed by filename and tag. The file is placed in resource directory, and has the same format of geosite.dat. The tag must exist in the file.

ip: [string]

An array of IP ranges. When the targeting IP is in one of the ranges, this rule takes effect. Available formats:

  • IP: such as "127.0.0.1".
  • CIDR: such as "127.0.0.0/8".
  • GeoIP: such as "geoip:cn". It begins with geoip: (lower case) and followed by two letter of country code.
    • Special value "geoip:private": for all private addresses such as 127.0.0.1.
  • IPs from file: Such as "ext:file:tag". The value must begin with ext: (lowercase), and followed by filename and tag. The file is placed in resource directory, and has the same format of geoip.dat. The tag must exist in the file.

"ext:geoip.dat:cn" is equivalent to "geoip:cn".

port:number | string

Port range. Formats are:

  • "a-b": Both a and b are positive integers and less than 65536. When the targeting port is in [a, b), this rule takes effect.
  • a: a is a positive integer, and less than 65536. When the targeting port is a, this rule takes effect.
  • Mix of the two above, separated by ",". Such as "53,443,1000-2000".

network: "tcp" | "udp" | "tcp,udp"

When the connection has in the chosen network, this rule take effect.

source: [string]

An array of IP ranges. Same format as ip. When the source IP of the connection is in the IP range, this rule takes effect.

user: [string]

An array of email address. When the inbound connection uses an user account of the email address, this rule takes effect. For now Shadowsocks and VMess support user with email.

inboundTag: [string]

An array of string as inbound proxy tags. When the connection comes from one of the specified inbound proxy, this rule takes effect.

protocol: [ "http" | "tls" | "bittorrent" ]

An array of string as protocol types. When the connection uses one of the protocols, this rule takes effect. To recognize the protocol of a connection, one must enable sniffing option in inbound proxy.

attrs: string

(V2Ray 4.18+) A Starlark script, used for detecting traffic attributes. When this script returns true, this rule takes effect.

Starlark is a subset of Python. The script takes a global varible named attrs. It contains all attributes of the traffic.

At the moment, only http inbound sets attrs.

Examples:

  • Detect HTTP GET: "attrs[':method'] == 'GET'"
  • Detect HTTP Path: "attrs[':path'].startswith('/test')"
  • Detect Content Type: "attrs['accept'].index('text/html') >= 0"

outboundTag string

Tag of the outbound that the connection will be sent to, if this rule take effect.

balancerTag: string

Tag of an load balancer. Then this rule takes effect, V2Ray will use the balancer to select an outbound. Either outboundTag or balancerTag must be specified. When both are specified, outboundTag takes priority.

BalancerObject

Configuration for a load balancer. When a load balancer takes effective, it selects one outbound from matching outbounds. This outbound will be used for send out-going traffic.

{
  "tag": "balancer",
  "selector": []
}

tag: string

Tag of this BalancerObject, to be matched from balancerTag in RuleObject.

selector: [ string ]

An array of strings. These strings are used to select outbounds with prefix matching. For example, with the following outbound tags: [ "a", "ab", "c", "ba" ],selector ["a"] matches [ "a", "ab" ].

When multiple outbounds are selected, load balancer for now picks one final outbound at random.

Pre-defined domain lists

This is a domain lists maintained by domain-list-community project. It provides a file named geosite.dat for some predefined domain lists. Notably:

  • category-ads: Common ads domains.
  • category-ads-all: Common ads domains and ads providers' domains.
  • cn: Equivalent to an union of geolocation-cn and tld-cn.
  • google: All Google domains.
  • facebook: All Facebook domains.
  • geolocation-cn: Common domains that serve in China.
  • geolocation-!cn: Common domains that don't serve in China
  • speedtest: All domains used by Speedtest.
  • tld-cn: All .cn and .中国 domains.
================================================ FILE: en/configuration/stats.html ================================================ Statistics · Project V Official

Statistics

V2Ray provides some information about its internals.

StatsObject

StatsObject is used as stats field in top level configuration.

{
}

At the moment there is no parameter in stats settings. Stats is enabled automatically when the StatsObject is set in top level configuration. You need also enable the corresponding settings in Policy, in order to keep track of user or system stats.

All stats counters are listed below:

User Traffic

If an user doesn't has email address set in protocol settings, the traffic stats will not be enabled.

user>>>[email]>>>traffic>>>uplink

Accumulated uplink traffic of specific user, in bytes.

user>>>[email]>>>traffic>>>downlink

Accumulated downlink traffic of specific user, in bytes.

Global Traffic

inbound>>>[tag]>>>traffic>>>uplink

Accumulated uplink traffic of specific inbound, in bytes.

inbound>>>[tag]>>>traffic>>>downlink

Accumulated downlink traffic of specific inbound, in bytes.

================================================ FILE: en/configuration/transport/domainsocket.html ================================================ DomainSocket · Project V Official

Domain Socket Transport

Domain Socket uses standard Unix domain socket to transport data. Domain socket is system interal tranfer channel. It doesn't jam network buffer and may be a bit faster than trasnferring through local loopback network.

Domain socket can only be used on platforms that supports Unix domain socket, such as macOS and Linux. It is not available on Windows.

When domain socket is used, IP and port specified on the inbound/outbound proxy will be ignored. All traffic is tunneled through the domain socket.

DomainSocketObject

DomainSocketObject is used in dsSettings field in TransportObject and StreamSettingsObject.

{
  "path": "/path/to/ds/file"
}

path: string

An valid absolute file path. Before running V2Ray, the file on this path must not exist.

================================================ FILE: en/configuration/transport/h2.html ================================================ HTTP/2 · Project V Official

HTTP/2 Transport

HTTP/2 transport is added in V2Ray 3.17. It is based on standard HTTP/2, and can be proxies through other HTTP server, such as Nginx.

Due to HTTP/2 recommandation, the corressponding inbound and outbound must enable TLS to use this transport.

HttpObject

DomainSocketObject is used in httpSettings field in TransportObject and StreamSettingsObject.

{
  "host": ["v2ray.com"],
  "path": "/random/path"
}

host: [ string ]

A string array. Each element is a domain. Client picks up a domain at random for each request. Server checks whether the domain in incoming request is in the list.

path: string

HTTP path. Client and server must have the same value.

================================================ FILE: en/configuration/transport/mkcp.html ================================================ mKCP · Project V Official

mKCP Transport

mKCP is a reliable stream transport. It is an UDP based protocol. mKCP sends more traffic for lower latency. To transfer the same amount of data, mKCP usually requires more throughput than TCP does.

KcpObject

{
  "mtu": 1350,
  "tti": 20,
  "uplinkCapacity": 5,
  "downlinkCapacity": 20,
  "congestion": false,
  "readBufferSize": 1,
  "writeBufferSize": 1,
  "header": {
    "type": "none"
  }
}

mtu: number

Maximum transmission unit. It indicates the maxium number bytes that an UDP packet can carry. Recommended value is between 576 and 1460. Default value 1350.

tti: number

Transmission time interval, in milli-second. mKCP sends data in this interval. Recommended value is between 10 and 100. Default value 50.

uplinkCapacity: number

Uplink bandwidth, in MB/s. The maximum bandwidth for the V2Ray instance to upload data to a remote one. Default value is 5. Please note it is byte (in MB/s), not bit. One may use value 0 for a small bandwidth.

downlinkCapacity: number

Downlink bandwidth, in MB/s. The maximum bandwidth for the V2Ray instance to download data. Default value is 20. Please note it is byte (in MB/s), not bit. One may use value 0 for a small bandwidth.

uplinkCapacity and downlinkCapacity determine the speed of mKCP. On client side, uplinkCapacity specifies the speed for client sending data to server. On sever side, downlinkCapacity specifies the speed of server receiving data. The minimum of this pair is effective in an actual connection.

congestion: true | false

Whether or not to enable congestion control. Default value is false. When congestion control is enabled, V2Ray will detect network quality. It will send less packets when packet loss is severe, or more data when network is not fully filled.

readBufferSize: number

Read buffer size for a single connection, in MB. Default value is 2.

writeBufferSize: number

Write buffer size for a single connection, in MB. Default value is 2.

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

type: string

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "none": Default value. No obfuscation is used.
  • "srtp": Obfuscated as SRTP traffic. It may be recognized as video calls such as Facetime.
  • "utp": Obfuscated as uTP traffic. It may be recognized as Bittorrent traffic.
  • "wechat-video": Obfuscated to WeChat traffic.
  • "dtls": Obfuscated as DTLS 1.2 packets.
  • "wireguard": Obfuscated as WireGuard packets. (NOT true WireGuard protocol)

Credits

  • @skywind3000 invented the original KCP protocol and implemented in C.
  • @xtaci re-implement KCP protocol in Go.
  • @xiaokangwang integrated KCP into V2Ray.
================================================ FILE: en/configuration/transport/quic.html ================================================ QUIC · Project V Official

QUIC

QUIC, or Quick UDP Internet Connection, is a multiplexing transport based on UDP, initially designed, implemented, and deployed by Google.

QUIC has the following advantages:

  1. Reduced number of roundtrips in handshake phase. (1-RTT or 0-RTT)
  2. Multiplexing without head of line blocking as in TCP
  3. Connection migration, especially for clients. For example, connections don't break when device moves from Wi-Fi to 4G.

QUIC is now an experiment in V2Ray. It implements IETF specification. As the spec is still being standardized, compatibility can't be guaranteed.

Update History

V2Ray 4.7:

  • Initial version to support QUIC.
  • Default settings:
    • 12 byte Connection ID
    • Connection timeout in 30 seconds if no data traffic. (May have impact on some long HTTP connections)

QuicObject

QUIC is used as quicSettings in transport settings. The configuration must be exactly the same between connecting peers.

QUIC requires TLS. If TLS is not enabled in transport settings, V2Ray will automatically issue a TLS certificate for it. When QUIC transport is used, encryption in VMess can be turned off.

{
  "security": "none",
  "key": "",
  "header": {
    "type": "none"
  }
}

security: "none" | "aes-128-gcm" | "chacha20-poly1305"

Extra encryption over entire QUIC packet, include the frame head part. Default value is "none" for no encryption. After being encrypted, QUIC packets can't be sniff'ed.

key: string

Key for the encryption above. Can be any string. Only effective when security is not "none".

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

type: string

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "none": Default value. No obfuscation is used.
  • "srtp": Obfuscated as SRTP traffic. It may be recognized as video calls such as Facetime.
  • "utp": Obfuscated as uTP traffic. It may be recognized as Bittorrent traffic.
  • "wechat-video": Obfuscated to WeChat traffic.
  • "dtls": Obfuscated as DTLS 1.2 packets.
  • "wireguard": Obfuscated as WireGuard packets. (NOT true WireGuard protocol)

When neither encryption nor obfuscation is enabled, QUIC transport is compatible with other QUIC tools. However it is recommended to enable either or both for better undetectable communication.

================================================ FILE: en/configuration/transport/tcp.html ================================================ TCP · Project V Official

TCP Transport

TcpObject

{
  "header": {
    "type": "none"
  }
}

header: NoneHeaderObject | HttpHeaderobject

Header obfuscation. Default value is NoneHeaderObject.

NoneHeaderObject

No header obfuscation.

{
  "type": "none"
}

type: "none"

Disable header obfuscation.

HttpHeaderObject

HTTP header obfuscation. The configuration must be the same between connecting inbound and outbound.

{
  "type": "http",
  "request": {},
  "response": {}
}

type: "http"

Enable HTTP header obfuscation.

request: HTTPRequestObject

HTTP request template.

response: HTTPResponseObject

HTTP response template.

HTTPRequestObject

{
  "version": "1.1",
  "method": "GET",
  "path": ["/"],
  "headers": {
    "Host": ["www.baidu.com", "www.bing.com"],
    "User-Agent": [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
    ],
    "Accept-Encoding": ["gzip, deflate"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

method: string

HTTP method. Default value is "GET"

path: [ string ]

HTTP path. An array is string. The path will be chosen randomly for every connection.

headers: map{string, [ string ] }

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

HTTPResponseObject

{
  "version": "1.1",
  "status": "200",
  "reason": "OK",
  "headers": {
    "Content-Type": ["application/octet-stream", "video/mpeg"],
    "Transfer-Encoding": ["chunked"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

status: string

HTTP status. Default value is "200"

reason: string

HTTP status message. Default value is "OK".

headers: map{string, string}

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

================================================ FILE: en/configuration/transport/websocket.html ================================================ WebSocket · Project V Official

WebSocket

Use standard WebSocket to transport data. Websocket connections can be proxied by HTTP server such as Nginx.

WebSocketObject

WebSocketObject is used as wsSettings in TransportObject or StreamSettingsObject.

Websocket recognizes HTTP header X-Forwarded-For, and uses it as inbound source address.

{
  "path": "/",
  "headers": {
    "Host": "v2ray.com"
  }
}

path: string

Path used for WebSocket. Default to root, as "/".

headers: map{string, string}

Custom HTTP header. An array where each entry is a key value pair in string, for header and value in HTTP header. Default is empty.

================================================ FILE: en/configuration/transport.html ================================================ Transport · Project V Official

Transport Settings

Transport is for how V2Ray sends and receives data from its peers. The responsibility of a transport is to reliably transfer data to a peer. Usually a connection has matching transports on both endpoints. For example, if a V2Ray outbound uses WebSocket as its transport, the inbound it talks to also has to use WebSocket, otherwise a connection can't be established.

The transport settings devides into two parts: global settings and per proxy settings. Per-proxy settings specifies how each individual proxy handles its data, while global settings is for all proxies. Usually the inbound and outbound proxies between the connecting peer must have the same transport settings. When a proxy has no transport settings, the global settings applies.

TransportObject

TransportObject is used as transport field in top level configuration.

{
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {}
}

tcpSettings: TcpObject

Settings for TCP transport.

kcpSettings: KcpObject

Settings for mKCP transport.

wsSettings: WebSocketObject

Settings for WebSocket transport.

httpSettings: HttpObject

Settings for HTTP/2 transport.

dsSettings: DomainSocketObject

Settings for Domain Socket transport.

quicSettings: QUICObject

(V2Ray 4.7+) Settings for QUIC transport.

StreamSettingsObject

Each inbound and outbound proxy may has its own transport settings, as specified in streamSettings field in top level configuration.

{
  "network": "tcp",
  "security": "none",
  "tlsSettings": {},
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {},
  "sockopt": {
    "mark": 0,
    "tcpFastOpen": false,
    "tproxy": "off"
  }
}

network: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"

Network type of the stream transport. Default value "tcp".

security: "none" | "tls"

Type of security. Choices are "none" (default) for no extra security, or "tls" for using TLS.

tlsSettings: TLSObject

TLS settings. TLS is provided by Golang. Support up to TLS 1.2. DTLS is not supported.

tcpSettings: TcpObject

TCP transport configuration for current proxy. Effective only when the proxy uses TCP transport. Configuration is the same as it is in global configuration.

kcpSettings: KcpObject

mKCP transport configuration for current proxy. Effective only when the proxy uses mKCP transport. Configuration is the same as it is in global configuration.

wsSettings: WebSocketObject

WebSocket transport configuration for current proxy. Effective only when the proxy uses WebSocket transport. Configuration is the same as it is in global configuration.

httpSettings: HttpObject

HTTP/2 transport configuration for current proxy. Effective only when the proxy uses HTTP/2 transport. Configuration is the same as it is in global configuration.

dsSettings: DomainSocketObject

Domain socket transport configuration for current proxy. Effective only when the proxy uses domain socket transport. Configuration is the same as it is in global configuration.

quicSettings: QUICObject

(V2Ray 4.7+) QUIC transport configuration for current proxy. Effective only when the proxy uses QUIC transport. Configuration is the same as it is in global configuration.

sockopt: SockoptObject

Socket options for incoming and out-going connections.

TLSObject

{
  "serverName": "v2ray.com",
  "allowInsecure": false,
  "alpn": ["http/1.1"],
  "certificates": [],
  "disableSystemRoot": false
}

serverName: string

Server name (usually domain) used for TLS authentication. Typically this is used when corressponding inbound/outbound uses IP for communication.

When domain name is specified from inbound proxy, or get sniffed from the connection, it will be automatically used for connection. It is not necessary to set serverName in such case.

alpn: [ string ]

An array of strings, to specifiy the ALPN value in TLS handshake. Default value is ["http/1.1"].

allowInsecure: true | false

If true, V2Ray allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.

allowInsecureCiphers: true | false

Whehter or not to allow insecure cipher suites. By default TLS only uses cipher suites from TLS 1.3 spec. Turn on this option to allow cipher suites with static RSA keys.

disableSystemRoot: true | false

(V2Ray 4.18+) Whether or not to disable system root CAs for TLS handshake. Default value is false. If set to true, V2Ray will use only certificates for TLS handshake.

certificates: [ CertificateObject ]

List of TLS certificates. Each entry is one certificate.

CertificateObject

{
  "usage": "encipherment",

  "certificateFile": "/path/to/certificate.crt",
  "keyFile": "/path/to/key.key",

  "certificate": [
    "-----BEGIN CERTIFICATE-----",
    "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
    "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
    "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
    "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
    "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
    "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
    "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
    "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
    "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
    "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
    "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
    "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
    "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
    "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
    "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
    "-----END CERTIFICATE-----"
  ],
  "key": [
    "-----BEGIN RSA PRIVATE KEY-----",
    "MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
    "bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
    "GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
    "jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
    "itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
    "IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
    "qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
    "C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
    "/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
    "aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
    "/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
    "bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
    "8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
    "pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
    "L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
    "3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
    "az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
    "gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
    "TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
    "eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
    "64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
    "8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
    "GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
    "ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
    "cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
    "-----END RSA PRIVATE KEY-----"
  ]
}

usage: "encipherment" | "verify" | "issue"

Purpose of the certificate. Default value "encipherment". Choices are:

  • "encipherment": Certificate is used for TLS authentication and encryption.
  • "verify": Certificate is used for validating TLS certificates from remote peer. In this case, the certificate has to be a CA certificate.
  • "issue": Certificate is used for issuing other certificates. In this case, the certificate has to be a CA certificate.

On Windows, you have to install your CA certificate to system, in order to verify cerificates issued from the CA.

When there is a new client request, say for serverName = "v2ray.com", V2Ray will find a certificate for "v2ray.com" first. If not found, V2Ray will try to issue a new certificate using any existing certificate whose usage is "issue" for "v2ray.com". The new certificate expires in one hour, and will be added to certificate pool for later reuse.

certificateFile: string

File path to the certificate. If the certificate is generated by OpenSSL, the path ends with ".crt".

Use v2ctl cert -ca command to generate a new CA certificate.

certificate: [ string ]

List of strings as content of the certificate. See the example above. Either certificate or certificateFile must not be empty.

keyFile: string

File path to the private key. If generated by OpenSSL, the file usually ends with ".key". Key file with password is not supported.

key: [ string ]

List of strings as content of the private key. See the example above. Either key or keyFile must not be empty.

When certificateFile and certificate are both filled in. V2Ray uses certificateFile. Same for keyFile and key.

When usage is "verify", both keyFile and key can be empty.

SockoptObject

{
  "mark": 0,
  "tcpFastOpen": false,
  "tproxy": "off"
}

mark: number

An integer. If non-zero, the value will be set to out-going connections via socket option SO_MARK. This mechanism only applies on Linux and requires CAP_NET_ADMIN permission.

tcpFastOpen: true | false

Whether or not to enable TCP Fast Open. When set to true, V2Ray enables TFO for current connection. When set to false, V2Ray disables TFO. If this entry doesn't exist, V2Ray uses default settings from operating system.

  • Only apply on the following operating systems:
    • Windows 10 (1604) or later
    • Mac OS 10.11 / iOS 9 or later
    • Linux 3.16 or later: Enabled by system default.
  • Applicable for both inbound and outbound connections.

tproxy: "redirect" | "tproxy" | "off"

Whether or not to enable transparent proxy on Linux. Choices are:

  • "off": Default value. Not enable TProxy at all.
  • "redirect": Enable TProxy with Redirect mode. Supports TCP/IPv4 and UDP traffic.
  • "tproxy": Enable TProxy with TProxy mode. Supports TCP and UDP traffic.

Transparent proxy requires Root or CAP_NET_ADMIN permission.

If TProxy is not set, and allowRedirect is set in dokodemo-door, the value of TProxy will be set to "redirect" automatically.

================================================ FILE: en/developer/tools.html ================================================ Tools · Project V Official

Tools

Third Party SDK

Automation

V2Ray uses the following automation tools for build and releases.

================================================ FILE: en/gitbook/gitbook-plugin-anchors/plugin.css ================================================ a.plugin-anchor { color: inherit !important; display: none; margin-left: -30px; padding-left: 40px; cursor: pointer; position: absolute; top: 0; left: 0; bottom: 0; } a.plugin-anchor i { margin-left: -30px; font-size: 15px !important; } h1, h2, h3, h4, h5, h6 { position: relative; } h1:hover a.plugin-anchor, h2:hover a.plugin-anchor, h3:hover a.plugin-anchor, h4:hover a.plugin-anchor, h5:hover a.plugin-anchor, h6:hover a.plugin-anchor { display: inline-block; } .book .book-body .page-wrapper .page-inner section.normal { overflow: visible; } ================================================ FILE: en/gitbook/gitbook-plugin-ga/plugin.js ================================================ require(["gitbook"], function(gitbook) { // Load analytics.js gitbook.events.bind("start", function(e, config) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); var cfg = config.ga; ga('create', cfg.token, cfg.configuration); }); // Notify pageview gitbook.events.bind("page.change", function() { ga('send', 'pageview', window.location.pathname+window.location.search); }); }); ================================================ FILE: en/gitbook/gitbook-plugin-hints/plugin-hints.css ================================================ .hints-icon { display: table-cell; padding-right: 15px; padding-left: 5px; } .hints-container { display: table-cell; } ================================================ FILE: en/gitbook/gitbook-plugin-mermaid-gb3/book/plugin.js ================================================ require([ 'gitbook' ], function (gitbook) { gitbook.events.bind('page.change', function () { mermaid.init(); }); }); ================================================ FILE: en/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #ECECFF; stroke: #CCCCFF; stroke-width: 1px; } .arrowheadPath { fill: #333333; } .edgePath .path { stroke: #333333; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #ffffde !important; rx: 4 !important; stroke: #aaaa33 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #CCCCFF; fill: #ECECFF; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #CCCCFF; fill: #ECECFF; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #CCCCFF; } .note { stroke: #aaaa33; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: rgba(102, 102, 255, 0.49); } .section2 { fill: #fff400; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #8a90dd; stroke: #534fbc; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #bfc7ff; stroke: #534fbc; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #bfc7ff; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #9370DB; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #ECECFF; stroke: #9370DB; } g.classGroup line { stroke: #9370DB; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #ECECFF; opacity: 0.5; } svg .classLabel .label { fill: #9370DB; font-size: 10px; } .relation { stroke: #9370DB; stroke-width: 1; fill: none; } .composition { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .aggregation { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationStart { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationEnd { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #dependencyStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #dependencyEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #ffffde; border: 1px solid #aaaa33; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: en/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.forest.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { font-family: 'trebuchet ms', verdana, arial; color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #cde498; stroke: #13540c; stroke-width: 1px; } .arrowheadPath { fill: green; } .edgePath .path { stroke: green; stroke-width: 1.5px; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #cdffb2 !important; rx: 4 !important; stroke: #6eaa49 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #13540c; fill: #cde498; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #326932; fill: #cde498; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #326932; } .note { stroke: #6eaa49; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: #6eaa49; } .section2 { fill: #6eaa49; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #487e3a; stroke: #13540c; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #cde498; stroke: #13540c; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #cde498; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #13540c; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #cde498; stroke: #13540c; } g.classGroup line { stroke: #13540c; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #cde498; opacity: 0.5; } svg .classLabel .label { fill: #13540c; font-size: 10px; } .relation { stroke: #13540c; stroke-width: 1; fill: none; } .composition { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .aggregation { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationStart { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationEnd { fill: #cde498; stroke: #13540c; stroke-width: 1; } #dependencyStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #dependencyEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #cdffb2; border: 1px solid #6eaa49; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-a11y-dark.css ================================================ /** * a11y-dark theme for JavaScript, CSS, and HTML * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css * @author ericwbailey */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: 0.5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #d4d0ab; } .token.punctuation { color: #fefefe; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ffa07a; } .token.boolean, .token.number { color: #00e0e0; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #abe338; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #00e0e0; } .token.atrule, .token.attr-value, .token.function { color: #ffd700; } .token.keyword { color: #00e0e0; } .token.regex, .token.important { color: #ffd700; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } @media screen and (-ms-high-contrast: active) { code[class*="language-"], pre[class*="language-"] { color: windowText; background: window; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: window; } .token.important { background: highlight; color: window; font-weight: normal; } .token.atrule, .token.attr-value, .token.function, .token.keyword, .token.operator, .token.selector { font-weight: bold; } .token.attr-value, .token.comment, .token.doctype, .token.function, .token.keyword, .token.operator, .token.property, .token.string { color: highlight; } .token.attr-value, .token.url { font-weight: normal; } } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-atom-dark.css ================================================ /** * atom-dark theme for `prism.js` * Based on Atom's `atom-dark` theme: https://github.com/atom/atom-dark-syntax * @author Joe Gibson (@gibsjose) */ code[class*="language-"], pre[class*="language-"] { color: #c5c8c6; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #1d1f21; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #7C7C7C; } .token.punctuation { color: #c5c8c6; } .namespace { opacity: .7; } .token.property, .token.keyword, .token.tag { color: #96CBFE; } .token.class-name { color: #FFFFB6; text-decoration: underline; } .token.boolean, .token.constant { color: #99CC99; } .token.symbol, .token.deleted { color: #f92672; } .token.number { color: #FF73FD; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #A8FF60; } .token.variable { color: #C6C5FE; } .token.operator { color: #EDEDED; } .token.entity { color: #FFFFB6; /* text-decoration: underline; */ } .token.url { color: #96CBFE; } .language-css .token.string, .style .token.string { color: #87C38A; } .token.atrule, .token.attr-value { color: #F9EE98; } .token.function { color: #DAD085; } .token.regex { color: #E9C062; } .token.important { color: #fd971f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-base16-ateliersulphurpool.light.css ================================================ /* Name: Base16 Atelier Sulphurpool Light Author: Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) Prism template by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/prism/) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #f5f7ff; color: #5e6687; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #dfe2f1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #dfe2f1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #898ea4; } .token.punctuation { color: #5e6687; } .token.namespace { opacity: .7; } .token.operator, .token.boolean, .token.number { color: #c76b29; } .token.property { color: #c08b30; } .token.tag { color: #3d8fd1; } .token.string { color: #22a2c9; } .token.selector { color: #6679cc; } .token.attr-name { color: #c76b29; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #22a2c9; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #ac9739; } .token.statement, .token.regex, .token.atrule { color: #22a2c9; } .token.placeholder, .token.variable { color: #3d8fd1; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #202746; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c94922; } .token.entity { cursor: help; } pre > code.highlight { outline: 0.4em solid #c94922; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #dfe2f1; } .line-numbers-rows > span:before { color: #979db4; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(107, 115, 148, 0.2); background: -webkit-linear-gradient(left, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); background: linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-cb.css ================================================ /* * Based on Plugin: Syntax Highlighter CB * Plugin URI: http://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js * Description: Highlight your code snippets with an easy to use shortcode based on Lea Verou's Prism.js. * Version: 1.0.0 * Author: c.bavota * Author URI: http://bavotasan.comhttp://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js/ */ /* http://cbavota.bitbucket.org/syntax-highlighter/ */ /* ===== ===== */ code[class*="language-"], pre[class*="language-"] { color: #fff; text-shadow: 0 1px 1px #000; font-family: Menlo, Monaco, "Courier New", monospace; direction: ltr; text-align: left; word-spacing: normal; white-space: pre; word-wrap: normal; line-height: 1.4; background: none; border: 0; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"] code { float: left; padding: 0 15px 0 0; } pre[class*="language-"], :not(pre) > code[class*="language-"] { background: #222; } /* Code blocks */ pre[class*="language-"] { padding: 15px; margin: 1em 0; overflow: auto; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 5px 10px; line-height: 1; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797979; } .token.selector, .token.operator, .token.punctuation { color: #fff; } .token.namespace { opacity: .7; } .token.tag, .token.boolean { color: #ffd893; } .token.atrule, .token.attr-value, .token.hex, .token.string { color: #B0C975; } .token.property, .token.entity, .token.url, .token.attr-name, .token.keyword { color: #c27628; } .token.regex { color: #9B71C6; } .token.entity { cursor: help; } .token.function, .token.constant { color: #e5a638; } .token.variable { color: #fdfba8; } .token.number { color: #8799B0; } .token.important, .token.deliminator { color: #E45734; } /* Line highlight plugin */ pre[data-line] { position: relative; padding: 1em 0 1em 3em; } .line-highlight { position: absolute; left: 0; right: 0; margin-top: 1em; /* Same as .prism's padding-top */ background: rgba(255,255,255,.2); pointer-events: none; line-height: inherit; white-space: pre; } .line-highlight:before, .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .3em; left: .6em; min-width: 1em; padding: 0 .5em; background-color: rgba(255,255,255,.3); color: #fff; font: bold 65%/1.5 sans-serif; text-align: center; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; text-shadow: none; } .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } /* for line numbers */ .line-numbers-rows { margin: 0; } .line-numbers-rows span { padding-right: 10px; border-right: 3px #d9d336 solid; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-darcula.css ================================================ /** * Darcula theme * * Adapted from a theme based on: * IntelliJ Darcula Theme (https://github.com/bulenkov/Darcula) * * @author Alexandre Paradis * @version 1.0 */ code[class*="language-"], pre[class*="language-"] { color: #a9b7c6; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { color: inherit; background: rgba(33,66,131,.85); } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { color: inherit; background: rgba(33,66,131,.85); } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.cdata { color: #808080; } .token.delimiter, .token.boolean, .token.keyword, .token.selector, .token.important, .token.atrule { color: #cc7832; } .token.operator, .token.punctuation, .token.attr-name { color: #a9b7c6; } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: #e8bf6a; } .token.entity, .token.number, .token.symbol { color: #6897bb; } .token.property, .token.constant, .token.variable { color: #9876aa; } .token.string, .token.char { color: #6a8759; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: #ffc66d; } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #294436; } .token.deleted { background: #484a4a; } /*code.language-css .token.punctuation { color: #cc7832; }*/ code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-dracula.css ================================================ /** * Dracula Theme originally by Zeno Rocha [@zenorocha] * https://draculatheme.com/ * * Ported for PrismJS by Albert Vallverdu [@byverdu] */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #282a36; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6272a4; } .token.punctuation { color: #f8f8f2; } .namespace { opacity: .7; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ff79c6; } .token.boolean, .token.number { color: #bd93f9; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #50fa7b; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #f8f8f2; } .token.atrule, .token.attr-value, .token.function, .token.class-name { color: #f1fa8c; } .token.keyword { color: #8be9fd; } .token.regex, .token.important { color: #ffb86c; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-duotone-dark.css ================================================ /* Name: Duotone Dark Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-evening-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2734; color: #9a86fd; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6a51e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6a51e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6c6783; } .token.punctuation { color: #6c6783; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #e09142; } .token.property, .token.function { color: #9a86fd; } .token.tag-id, .token.selector, .token.atrule-id { color: #eeebff; } code.language-javascript, .token.attr-name { color: #c4b9fe; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #ffcc99; } .token.placeholder, .token.variable { color: #ffcc99; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #eeebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c4b9fe; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #8a75f5; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c2937; } .line-numbers-rows > span:before { color: #3c3949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(224, 145, 66, 0.2); background: -webkit-linear-gradient(left, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); background: linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-duotone-earth.css ================================================ /* Name: Duotone Earth Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-earth-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #322d29; color: #88786d; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6f5849; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6f5849; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6a5f58; } .token.punctuation { color: #6a5f58; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #bfa05a; } .token.property, .token.function { color: #88786d; } .token.tag-id, .token.selector, .token.atrule-id { color: #fff3eb; } code.language-javascript, .token.attr-name { color: #a48774; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fcc440; } .token.placeholder, .token.variable { color: #fcc440; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #fff3eb; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #a48774; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #816d5f; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #35302b; } .line-numbers-rows > span:before { color: #46403d; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(191, 160, 90, 0.2); background: -webkit-linear-gradient(left, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); background: linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-duotone-forest.css ================================================ /* Name: Duotone Forest Author: by Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-forest-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2d2a; color: #687d68; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #435643; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #435643; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #535f53; } .token.punctuation { color: #535f53; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #a2b34d; } .token.property, .token.function { color: #687d68; } .token.tag-id, .token.selector, .token.atrule-id { color: #f0fff0; } code.language-javascript, .token.attr-name { color: #b3d6b3; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #e5fb79; } .token.placeholder, .token.variable { color: #e5fb79; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #f0fff0; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #b3d6b3; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #5c705c; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c302c; } .line-numbers-rows > span:before { color: #3b423b; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(162, 179, 77, 0.2); background: -webkit-linear-gradient(left, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); background: linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-duotone-light.css ================================================ /* Name: Duotone Light Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-morning-light.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #faf8f5; color: #728fcb; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #faf8f5; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #faf8f5; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #b6ad9a; } .token.punctuation { color: #b6ad9a; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #063289; } .token.property, .token.function { color: #b29762; } .token.tag-id, .token.selector, .token.atrule-id { color: #2d2006; } code.language-javascript, .token.attr-name { color: #896724; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #728fcb; } .token.placeholder, .token.variable { color: #93abdc; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #2d2006; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #896724; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #896724; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #ece8de; } .line-numbers-rows > span:before { color: #cdc4b1; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(45, 32, 6, 0.2); background: -webkit-linear-gradient(left, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); background: linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-duotone-sea.css ================================================ /* Name: Duotone Sea Author: by Simurai, adapted from DuoTone themes by Simurai for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-sea-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #1d262f; color: #57718e; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #004a9e; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #004a9e; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #4a5f78; } .token.punctuation { color: #4a5f78; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #0aa370; } .token.property, .token.function { color: #57718e; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebf4ff; } code.language-javascript, .token.attr-name { color: #7eb6f6; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #47ebb4; } .token.placeholder, .token.variable { color: #47ebb4; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebf4ff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #7eb6f6; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #34659d; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #1f2932; } .line-numbers-rows > span:before { color: #2c3847; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(10, 163, 112, 0.2); background: -webkit-linear-gradient(left, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); background: linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-duotone-space.css ================================================ /* Name: Duotone Space Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-space-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #24242e; color: #767693; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #5151e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #5151e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #5b5b76; } .token.punctuation { color: #5b5b76; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #dd672c; } .token.property, .token.function { color: #767693; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebebff; } code.language-javascript, .token.attr-name { color: #aaaaca; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fe8c52; } .token.placeholder, .token.variable { color: #fe8c52; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #aaaaca; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #7676f4; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #262631; } .line-numbers-rows > span:before { color: #393949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(221, 103, 44, 0.2); background: -webkit-linear-gradient(left, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); background: linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-ghcolors.css ================================================ /** * GHColors theme by Avi Aryan (http://aviaryan.in) * Inspired by Github syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #b3d4fc; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #999988; font-style: italic; } .token.namespace { opacity: .7; } .token.string, .token.attr-value { color: #e3116c; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.entity, .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.property, .token.regex, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-name, .language-autohotkey .token.selector { color: #00a4db; } .token.function, .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.tag, .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.function, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-hopscotch.css ================================================ @import url(https://fonts.googleapis.com/css?family=Fira+Mono); /* * Hopscotch * by Jan T. Sott * https://github.com/idleberg/Hopscotch * * This work is licensed under the Creative Commons CC0 1.0 Universal License */ code[class*="language-"], pre[class*="language-"] { color: #ffffff; font-family: "Fira Mono", Menlo, Monaco, "Lucida Console","Courier New", Courier, monospace; font-size: 16px; line-height: 1.375; direction: ltr; text-align: left; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; background: #322931; color: #b9b5b8; } pre > code[class*="language-"] { font-size: 1em; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797379; } .token.punctuation { color: #b9b5b8; } .namespace { opacity: .7; } .token.null, .token.operator, .token.boolean, .token.number { color: #fd8b19; } .token.property { color: #fdcc59; } .token.tag { color: #1290bf; } .token.string { color: #149b93; } .token.selector { color: #c85e7c; } .token.attr-name { color: #fd8b19; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #149b93; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #8fc13e; } .token.statement, .token.regex, .token.atrule { color: #149b93; } .token.placeholder, .token.variable { color: #1290bf; } .token.important { color: #dd464c; font-weight: bold; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid red; outline-offset: .4em; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-material-dark.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #eee; background: #2f2f2f; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #a5e844; } .token.attribute { color: #a5e844; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.comment { color: #616161; } .token.constant { color: #c792ea; } .token.deleted { color: #ff6666; } .token.doctype { color: #616161; } .token.entity { color: #ff6666; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #616161; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #a5e844; } .token.pseudo-element { color: #a5e844; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #ff6666; } .token.string { color: #a5e844; } .token.symbol { color: #c792ea; } .token.tag { color: #ff6666; } .token.unit { color: #fd9170; } .token.url { color: #ff6666; } .token.variable { color: #ff6666; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-material-light.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #90a4ae; background: #fafafa; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #cceae7; color: #263238; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #cceae7; color: #263238; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #f76d47; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #7c4dff; } .token.attr-name { color: #39adb5; } .token.attr-value { color: #f6a434; } .token.attribute { color: #f6a434; } .token.boolean { color: #7c4dff; } .token.builtin { color: #39adb5; } .token.cdata { color: #39adb5; } .token.char { color: #39adb5; } .token.class { color: #39adb5; } .token.class-name { color: #6182b8; } .token.comment { color: #aabfc9; } .token.constant { color: #7c4dff; } .token.deleted { color: #e53935; } .token.doctype { color: #aabfc9; } .token.entity { color: #e53935; } .token.function { color: #7c4dff; } .token.hexcode { color: #f76d47; } .token.id { color: #7c4dff; font-weight: bold; } .token.important { color: #7c4dff; font-weight: bold; } .token.inserted { color: #39adb5; } .token.keyword { color: #7c4dff; } .token.number { color: #f76d47; } .token.operator { color: #39adb5; } .token.prolog { color: #aabfc9; } .token.property { color: #39adb5; } .token.pseudo-class { color: #f6a434; } .token.pseudo-element { color: #f6a434; } .token.punctuation { color: #39adb5; } .token.regex { color: #6182b8; } .token.selector { color: #e53935; } .token.string { color: #f6a434; } .token.symbol { color: #7c4dff; } .token.tag { color: #e53935; } .token.unit { color: #f76d47; } .token.url { color: #e53935; } .token.variable { color: #e53935; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-material-oceanic.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #c3cee3; background: #263238; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #c3e88d; } .token.attribute { color: #c3e88d; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.color { color: #f2ff00; } .token.comment { color: #546e7a; } .token.constant { color: #c792ea; } .token.deleted { color: #f07178; } .token.doctype { color: #546e7a; } .token.entity { color: #f07178; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; font-style: italic; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #546e7a; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #c3e88d; } .token.pseudo-element { color: #c3e88d; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #f07178; } .token.string { color: #c3e88d; } .token.symbol { color: #c792ea; } .token.tag { color: #f07178; } .token.unit { color: #f07178; } .token.url { color: #fd9170; } .token.variable { color: #f07178; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-pojoaque.css ================================================ /* * Pojoaque Style by Jason Tate * http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html * Based on Solarized Style from http://ethanschoonover.com/solarized * http://softwaremaniacs.org/media/soft/highlight/test.html */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 15px; line-height: 1.5; color: #dccf8f; text-shadow: 0; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre) > code[class*="language-"] { border-radius: 5px; border: 1px solid #000; color: #DCCF8F; background: #181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top; } pre[class*="language-"] { padding: 12px; overflow: auto; } :not(pre) > code[class*="language-"] { padding: 2px 6px; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #586e75; font-style: italic; } .token.number, .token.string, .token.char, .token.builtin, .token.inserted { color: #468966; } .token.attr-name { color: #b89859; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #dccf8f; } .token.selector, .token.regex { color: #859900; } .token.atrule, .token.keyword { color: #cb4b16; } .token.attr-value { color: #468966; } .token.function, .token.variable, .token.placeholder { color: #b58900; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol { color: #b89859; } .token.tag { color: #ffb03b; } .token.important, .token.statement, .token.deleted { color: #dc322f; } .token.punctuation { color: #dccf8f; } .token.entity { cursor: help; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } /* .pojoaque-colors { color: #586e75; color: #b64926; color: #468966; color: #ffb03b; color: #b58900; color: #b89859; color: #dccf8f; color: #d3a60c; color: #cb4b16; color: #dc322f; color: #073642; color: #181914; } */ ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-shades-of-purple.css ================================================ /** * Shades of Purple Theme for Prism.js * * @author Ahmad Awais * @support Follow/tweet at https://twitter.com/MrAhmadAwais/ */ code[class*='language-'], pre[class*='language-'] { color: #9efeff; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; font-family: 'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-weight: 400; font-size: 17px; line-height: 25px; letter-spacing: 0.5px; text-shadow: 0 1px #222245; } pre[class*='language-']::-moz-selection, pre[class*='language-'] ::-moz-selection, code[class*='language-']::-moz-selection, code[class*='language-'] ::-moz-selection, pre[class*='language-']::selection, pre[class*='language-'] ::selection, code[class*='language-']::selection, code[class*='language-'] ::selection { color: inherit; background: #a599e9; } /* Code blocks. */ pre[class*='language-'] { padding: 2em; margin: 0.5em 0; overflow: auto; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #1e1e3f; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; } .token { font-weight: 400; } .token.comment, .token.prolog, .token.cdata { color: #b362ff; } .token.delimiter, .token.keyword, .token.selector, .token.important, .token.atrule { color: #ff9d00; } .token.operator, .token.attr-name { color: rgb(255, 180, 84); } .token.punctuation { color: #ffffff; } .token.boolean { color: rgb(255, 98, 140); } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: rgb(255, 157, 0); } .token.entity, .token.symbol { color: #6897bb; } .token.number { color: #ff628c; } .token.property, .token.constant, .token.variable { color: #ff628c; } .token.string, .token.char { color: #a5ff90; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: rgb(250, 208, 0); } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #00ff00; } .token.deleted { background: #ff000d; } code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } .token.class-name { color: #fb94ff; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { background: none; } pre .line-highlight, pre .line-highlight.line-highlight, pre > code.line-highlight { margin-top: 36px; background: linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent); } pre .line-highlight:before, pre > code.line-highlight:before, pre .line-highlight[data-end]:after, pre > code.line-highlight[data-end]:after { content: ''; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-synthwave84.css ================================================ /* * Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code * Demo: https://marc.dev/demo/prism-synthwave84 * * Ported for PrismJS by Marc Backes [@themarcba] */ code[class*="language-"], pre[class*="language-"] { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background-color: transparent !important; background-image: linear-gradient(to bottom, #2a2139 75%, #34294f); } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.block-comment, .token.prolog, .token.doctype, .token.cdata { color: #8e8e8e; } .token.punctuation { color: #ccc; } .token.tag, .token.attr-name, .token.namespace, .token.number, .token.unit, .token.hexcode, .token.deleted { color: #e2777a; } .token.property, .token.selector { color: #72f1b8; text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475; } .token.function-name { color: #6196cc; } .token.boolean, .token.selector .token.id, .token.function { color: #fdfdfd; text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975; } .token.class-name { color: #fff5f6; text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75; } .token.constant, .token.symbol { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; } .token.important, .token.atrule, .token.keyword, .token.selector .token.class, .token.builtin { color: #f4eee4; text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575; } .token.string, .token.char, .token.attr-value, .token.regex, .token.variable { color: #f87c32; } .token.operator, .token.entity, .token.url { color: #67cdcc; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } .token.inserted { color: green; } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-vs.css ================================================ /** * VS theme by Andrew Lock (https://andrewlock.net) * Inspired by Visual Studio syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #C1DEF1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #C1DEF1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #008000; font-style: italic; } .token.namespace { opacity: .7; } .token.string { color: #A31515; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, .language-json .token.number, code[class*="language-css"]{ color: #0000ff; } .token.function { color: #393A34; } .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.class-name, .language-json .token.property { color: #2B91AF; } .token.tag, .token.selector { color: #800000; } .token.attr-name, .token.property, .token.regex, .token.entity { color: #ff0000; } .token.directive.tag .tag { background: #ffff00; color: #393A34; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #a5a5a5; } .line-numbers-rows > span:before { color: #2B91AF; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(193, 222, 241, 0.2); background: -webkit-linear-gradient(left, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); background: linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); } ================================================ FILE: en/gitbook/gitbook-plugin-prism/prism-xonokai.css ================================================ /** * xonokai theme for JavaScript, CSS and HTML * based on: https://github.com/MoOx/sass-prism-theme-base by Maxime Thirouin ~ MoOx --> http://moox.fr/ , which is Loosely based on Monokai textmate theme by http://www.monokai.nl/ * license: MIT; http://moox.mit-license.org/ */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 2; -o-tab-size: 2; tab-size: 2; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-wrap: normal; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 14px; color: #76d9e6; text-shadow: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre)>code[class*="language-"] { background: #2a2a2a; } pre[class*="language-"] { padding: 15px; border-radius: 4px; border: 1px solid #e1e1e8; overflow: auto; } pre[class*="language-"] { position: relative; } pre[class*="language-"] code { white-space: pre; display: block; } :not(pre)>code[class*="language-"] { padding: 0.15em 0.2em 0.05em; border-radius: .3em; border: 0.13em solid #7a6652; box-shadow: 1px 1px 0.3em -0.1em #000 inset; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6f705e; } .token.operator, .token.boolean, .token.number { color: #a77afe; } .token.attr-name, .token.string { color: #e6d06c; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #e6d06c; } .token.selector, .token.inserted { color: #a6e22d; } .token.atrule, .token.attr-value, .token.keyword, .token.important, .token.deleted { color: #ef3b7d; } .token.regex, .token.statement { color: #76d9e6; } .token.placeholder, .token.variable { color: #fff; } .token.important, .token.statement, .token.bold { font-weight: bold; } .token.punctuation { color: #bebec5; } .token.entity { cursor: help; } .token.italic { font-style: italic; } code.language-markup { color: #f9f9f9; } code.language-markup .token.tag { color: #ef3b7d; } code.language-markup .token.attr-name { color: #a6e22d; } code.language-markup .token.attr-value { color: #e6d06c; } code.language-markup .token.style, code.language-markup .token.script { color: #76d9e6; } code.language-markup .token.script .token.keyword { color: #76d9e6; } /* Line highlight plugin */ pre[class*="language-"][data-line] { position: relative; padding: 1em 0 1em 3em; } pre[data-line] .line-highlight { position: absolute; left: 0; right: 0; padding: 0; margin-top: 1em; background: rgba(255, 255, 255, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } pre[data-line] .line-highlight:before, pre[data-line] .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .4em; left: .6em; min-width: 1em; padding: 0.2em 0.5em; background-color: rgba(255, 255, 255, 0.4); color: black; font: bold 65%/1 sans-serif; height: 1em; line-height: 1em; text-align: center; border-radius: 999px; text-shadow: none; box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); } pre[data-line] .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } ================================================ FILE: en/gitbook/gitbook.js ================================================ !function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=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)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,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(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(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(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!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,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.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:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.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 A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(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&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(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&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.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):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.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=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.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)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.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,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,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":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.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 de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de("

Project V

Project V is a set of tools to help you build your own privacy network over internet. The core of Project V, named V2Ray, is responsible for network protocols and communications. It can work alone, as well as combine with other tools.

This website is mainly a manual for V2Ray, with some additional information regarding the whole project.

Features

  • Multiple inbound/outbound proxies: one V2Ray instance supports in parallel multiple inbound and outbound protocols. Each protocol works independently.
  • Customizable routing: incoming traffic can be sent to different outbounds based on routing configuration. It is easy to route traffic by target region or domain.
  • Multiple protocols: V2Ray supports multiple protocols, including Socks, HTTP, Shadowsocks, VMess etc. Each protocol may have its own transport, such as TCP, mKCP, WebSocket etc.
  • Obfuscation: V2Ray has built in obfuscation to hide traffic in TLS, and can run in parallel with web servers.
  • Reverse proxy: General support of reverse proxy. Can be used to build tunnels to localhost.
  • Multiple platforms: V2Ray runs natively on Windows, Mac OS, Linux, etc. There is also third party support on mobile.

Sponsors

v2net

This site is generated by GitBook, and host on GitHub. If you'd like to modify its content, please send pull request to this repo.

================================================ FILE: en/styles/website.css ================================================ .book-summary { font-family: "Helvetica Neue", "Open Sans", sans-serif; font-size: 14px; } .book-header .btn { padding: 0 5px; } .markdown-section { font-family: "Helvetica Neue", "Open Sans", sans-serif; font-weight: 400; font-size: 14px; } .markdown-section pre>code { font-family: "Source Code Pro", monospace; font-weight: 400; font-size: 14px; } .markdown-section code:not([class]) { white-space: nowrap; padding: 0; } .markdown-section blockquote { margin: 0; margin-bottom: .85em; padding: 0 15px; border-left: 4px solid #64b5f6; border-top: 1px solid #64b5f6; color: #000000; margin-top: 10px; } ================================================ FILE: en/welcome/command.html ================================================ Commandline · Project V Official

Commandline

V2Ray

V2Ray has the following commandline parameters:

v2ray [-version] [-test] [-config=config.json] [-format=json]

-version

Print the version of V2Ray only, and then exit.

-test

Test configuration, output any errors and then exit.

-config

URI of the configuration. Avilable formats are:

  • Path to the local config file. May be a relative path or absolute path.
  • "stdin:": Indicates V2Ray to read configuration from standard input. Caller must close stdin after writing out configuration.
  • Value begins with http:// or https:// (lowercase): V2Ray tries to load configuration from the remote address.

-format

Configuration format. Choices are:

  • json: JSON format.
  • pb or protobuf: Protobuf format.

When -config is not specified, V2Ray first tries to load configuration from config.json under working directory, then from the directory specified by environment variable v2ray.location.asset.

V2Ctl

V2Ctl is a collection of commandline tools. It runs in the following way:

v2ctl <command> <options>

command

Subcommand. Available values are below:

  • api: Invoke remote control commands in V2Ray instances.
  • config: Convert configuration from JSON format to protobuf.
  • cert: Generate TLS certificates.
  • fetch: Fetch remove resources.
  • tlsping: (V2Ray 4.17+) Test TLS handshake.
  • verify: Verify the signature of V2Ray releases.
  • uuid: Generate UUID.

V2Ctl Api

v2ctl api [--server=127.0.0.1:8080] <Service.Method> <Request>

Invoke remote control commands in V2Ray instances. Example:

v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger ''

V2Ctl Config

v2ctl config

No option for this command. It reads JSON configuration from stdin, and print out corresponding Protobuf to stdout, if succeeds.

V2Ctl Cert

v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h] [--name="V2Ray Inc"] [--org="V2Ray Inc] [--json] [--file=v2ray]

Generates a TLS certificate based on options.

--ca

If specified, the certificate will be a CA certificate.

--domain

Alternative Names in the certificate. This option can be used multiple times for multiple domains. For example: --domain=v2ray.com --domain=v2ray.cool.

--expire

Expire date of the certificate. Value is a Golang duration.

--name

Command Name in the certificate.

--org

Orgnization in the certificate.

--json

If specified, the certificate will be printed to stdout in the JSON format that is used in V2Ray.

--file

Prints the certificate into files. When --file=a, two files named a_cert.pem and a_key.pem will be generated.

V2Ctl Fetch

v2ctl fetch <url>

Fetch remove resources and print to stdout. Only HTTP and HTTPS URL are supported.

V2Ctl TlsPing

v2ctl tlsping <domain> --ip=[ip]

Test TLS handlshake with specific domain.

domain

Target domain for the TLS handshake.

--ip

The IP address of the domain. If not specifed, V2Ctl resolves it through system DNS.

V2Ctl Verify

v2ctl verify [--sig=/path/to/sigfile] <filepath>

To verify the signature of a V2Ray binary.

--sig

Path to signature file. Default value is the ".sig" file to the path to be verified.

filepath

The file to be verified.

V2Ctl UUID

v2ctl uuid

No options. This command prints a random UUID.

================================================ FILE: en/welcome/donate.html ================================================ Donation · Project V Official

Donation

V2Ray is a nonprofit project. The source code and its release binary can be used freely (mainly) under MIT licence. If you like this project, you may buy us a cup of coffee.

Your donation has no direct connection to Project V's development and service. Our development will not be influenced by your donation. However, we will send a thank-you email for every donor. If you wish not to receive such email, please leave a note in your donation.

For any donation worth more than $50, you may choose one of the following:

  • Your name or your company log shown on our front page for one month.
  • Modify our codebase as you wish. Restrictions: No user facing functionlity changes; no documentation changes. Your change will stay for a month.

The Usual Way

Paypal

You may donate through internal Paypal transfer or credit card

Please kindly note that Paypal charges high service fee. Any donation less than 1 USD is meaningless.

Patreon

Patreon is a platform for regular donations. You may use Patreon if you want to donate frequently.

Giftcard

For now we only receive giftcard for Amazon US. You may purchase it at Amazon.com and then send to love@v2ray.com.

Cryptocurrency

Cryptocurrency is a more reliable way for international transactions. Crypto-wallet is usually anonymous and your donation is not traceable.

Due to the anonymity natural of cryptocurrenty, please send us an email before your donation, if you want to receive the thank-you email.

Bitcoin

Address: 3GctrB7R5sMhJ73N4AKo56Bdf9RE3RJsuM

View stats or QR-Code at BlockChain

Bitcoin Cash

Address: 15oATKUq5mEfuzasPnsJ58TjJU5SvDJK97

View stats or QR-Code at BlockChain

Ethereum

Address: 0x112ee71189704fe04cabed4aa045f4461c8c8696

View stats or QR-Code at BlockChain. You may also send the following ERC20 tokens to this address: OMG, REP, GNT, DGD

EOS

Address: EOS8Civdok4CBN3jCpsaGQijzesjKof1eyaRFuBU5mLMtWVkLsy8a

Litecoin

Address: LVdeH2HkCgGRs8ZEpan7fkAEEPbiJ4McoR

Monero

Address: 48kA4NyLRCWQvB7U2A77G66Z25uWbyzmoZSYjxJfrMR1J4dRFW6fWFLDn3wirAqP8ySnR4rnvoXWxfkNFhrK5ZxY1WyBqKg

Ripple

Address: r439fPk8DzCf4nSxkpfodEuE2cG4KVZQHq

Tag not required

Other

Please send us an email at love@v2ray.com if you want to donate other kind of coins.

================================================ FILE: en/welcome/faq.html ================================================ FAQ · Project V Official

Frequently Asked Questions (FAQ)

V2Ray Usage

How to upgrade V2Ray

  • Download latest package, or
  • Re-run installation script (Linux only)

V2Ray Crashes

  • If you are using Linux with systemd, you can see panic log using command journalctl -u v2ray.
  • In general you can run command v2ray -config=<config-file> -test to see error information.

Backward Compatibility

  • For configuration file (e.g., JSON), backward compatibility applies to at least one major releases. For example, V2Ray 4.x supports config files from V2Ray 3.x.
  • For Protobuf based communication protocols, such as Api, backward compatibility applies to at least one major releases.
  • For binary based commnunication protocols, such as Shadowsocks and VMess, it is always backward compatible when server version is not older than clients. When client version is newer, backward compatibility applies to at least 12 minor releases.

V2Ray Errors

Socks: Unknown Socks version: 67

Possible causes

  • You are using socks inbound in V2Ray, but your browser is configured to use HTTP proxy.

Solution

  • Add a HTTP inbound in V2Ray, and then update your browser proxy settings to use this proxy.

License of this project

Project V uses the following license.

V2Ray

Source code and official releases are licensed under MIT license, including the source code and releases in the following repository.

V2Ray.Com

Official website, v2ray.com, is licensed under Creative Commons Attribution 4.0 International License.

  • Including all visible text and pictures on the website.
  • Including Project V logo.
  • Including all source code that is used for generating the website, i.e., v2ray/manual.

Screenshot and other files

All third party files listed below belong to their creator. Whoever creates the file owns the file.

  • Including all screenshots of Project V.
  • Including all configuration files that are used to run Project V.
  • Including all logs generated by Project V during runtime.

Other content

All content that are not mentioned above will be licensed case by case.

================================================ FILE: en/welcome/help.html ================================================ Support · Project V Official

Support

Project V provides multiple methods for communications.

Project V team supports Chinese and English. Please choose either one that you are familiar with for questions.

Github issues

We uses several repositories for different type of discussions.

Telegram

Project V provides the following groups for different type of discussions.

  • Usage
    • Only for Project V related topics.
  • Others
    • For other topics.

Topics in these groups are mainly in Chinese. Feel free to setup groups in your own language and let us know.

All discussion groups forbid the following topics: adult content, politics, hate speeches. Senders of these topics will be banned immedietely.

Please also follow Project V Announcement for news.

Twitter

ProjectV2Ray for regular communications.

Email

Please send a message to one of the address below, if you'd like to talk to V2Ray team privately.

love@v2ray.com: Main email address for communication. Checked every day.

v2ray@protonmail.com: A ProtonMail mailbox which employs end to end encryption. It is difficult to use, and only being checked occasionally.

Sadly due to high workload, it is not promised that every email gets replied. Sorry for the inconvenience. For general questions, please use discussion groups above for quick response.

You may get PGP public key by searching love@v2ray.com, or use the public key below.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org

mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu
3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85
c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs
0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w
EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk
CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj
OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY
cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m
uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV
va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF
5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB
tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP
eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu
ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY
WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM
iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG
1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5
iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm
ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM
otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe
3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q
dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT
swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh
SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc
tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt
kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB
8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/
ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y
1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO
SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+
GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/
KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/
b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy
ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN
dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP
eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV
9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB
TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt
6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ
IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+
2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT
tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH
iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6
U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD
WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B
X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt
PeRpd1GUXXeoGCw=
=To5T
-----END PGP PUBLIC KEY BLOCK-----
================================================ FILE: en/welcome/install.html ================================================ Install · Project V Official

Download & Install

Platform

V2Ray is available on the following platforms:

  • Windows 7 and later (x86 / amd64)
  • Mac OS X 10.10 Yosemite and later (amd64)
  • Linux 2.6.23 and later (x86 / amd64 / arm / arm64 / mips64 / mips)
    • Including but not limited to Debian 7 / 8, Ubuntu 12.04 / 14.04 and later, CentOS 6 / 7, Arch Linux
  • FreeBSD (x86 / amd64)
  • OpenBSD (x86 / amd64)
  • Dragonfly BSD (amd64)

Download

Pre-built packages can be found here:

  1. Github Release: github.com/v2ray/v2ray-core
  2. Redistribution: github.com/v2ray/dist
  3. Homebrew: github.com/v2ray/homebrew-v2ray
  4. Arch Linux: packages/community/x86_64/v2ray/
  5. Snapcraft: snapcraft.io/v2ray-core

All packages are in ZIP format. Download and unzip corresponding packages to your system.

Verify

There are 2 ways to verify packages.

  1. Each .zip file has a corresponding .dgst file for SHA digests.
  2. The GPG signature file for executables (v2ray / v2ray.exe) can be found in v2ray.sig (or v2ray.exe.sig) in the same package. Public key is in the repository.

Install on Windows or Mac OS

Run v2ray / v2ray.exe after unzip the packages.

Install on Linux

We provide a script to install on Linux. This script detects previous installed v2ray and then upgrade or install a new one accordingly. If there is a previous version, the config file in /etc/v2ray will not be overwritten during upgrade.

The following command assumes root permission.

Run the following command to install V2Ray. If yum or apt is available, the script will install unzip and daemon / systemd. They are required to run V2Ray as a service. You need to install them manually if your Linux system doesn't support yum or apt.

curl -Ls https://install.direct/go.sh | sudo bash

The script installs the following files.

  • /usr/bin/v2ray/v2ray: V2Ray executable
  • /usr/bin/v2ray/v2ctl: Utility
  • /etc/v2ray/config.json: Config file
  • /usr/bin/v2ray/geoip.dat: IP data file
  • /usr/bin/v2ray/geosite.dat: domain data file

This script also configures V2Ray to run as service, if systemd is available.

Configurations are at the following places.

  • /etc/systemd/system/v2ray.service: Systemd
  • /etc/init.d/v2ray: SysV

After installation, we will need to:

  1. Update /etc/v2ray/config.json file for your own scenario.
  2. Run service v2ray start command to start V2Ray.
  3. Optionally run service v2ray start|stop|status|reload|restart|force-reload to control V2Ray service.

go.sh

go.sh supports the following parameters.

  • -p or --proxy: Use a proxy to download V2Ray packages. Same as curl format, such as "socks5://127.0.0.1:1080" or "http://127.0.0.1:3128".
  • -f or --force: Force installation. The script will assume V2Ray was not installed at all.
  • --version: The version to be installed, such as "v1.13". Default value is the latest stable release.
  • --local: Use a local package for installation.

Examples:

  • Use SOCKS proxy 127.0.0.1:1080 to install the latest package: ./go.sh -p socks5://127.0.0.1:1080
  • Install v1.13 from local file:./go.sh --version v1.13 --local /path/to/v2ray.zip

Docker

V2Ray provides 2 docker images:

The 2 images has the same structure as the Linux installation.

================================================ FILE: en/welcome/start.html ================================================ Quick Start · Project V Official

Quick Start

You need to configure V2Ray after installing it. Here is a quick configuration for a demo run. Please see configuration overview for more advanced setup.

Client

On your PC (or mobile), run V2Ray with the following configuration.

{
  "inbounds": [{
    "port": 1080,  // Port of socks5 proxy. Point your browser to use this port.
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "server", // Address of your V2Ray server. May be IP or domain address.
        "port": 10086,  // Port of your V2Ray server.
        "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
      }]
    }
  },{
    "protocol": "freedom",
    "tag": "direct",
    "settings": {}
  }],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [{
      "type": "field",
      "ip": ["geoip:private"],
      "outboundTag": "direct"
    }]
  }
}

Please modify the IP address of your V2Ray server as mentioned above. After that, the V2Ray process on your PC will proxy all traffic to V2Ray server except intranet traffic.

Server

You need another computer to run V2Ray as a server. Usually this computer is located outside firewall. Here is a sample configuration.

{
  "inbounds": [{
    "port": 10086, // Port of the server. Must be the same as above.
    "protocol": "vmess",
    "settings": {
      "clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  }]
}

Please make sure the id field is the same between client and server.

Running

  • On Windows and macOS, configuration file is located in the same directory as V2Ray binary. You may run v2ray or v2ray.exe without additional parameters.
  • On Linux, configuration file is usually located at /etc/v2ray/config.json. Run v2ray --config=/etc/v2ray/config.json in foreground or use other tools such as systemd to run V2Ray as background process.

See Overview for more detail of the configuration.

================================================ FILE: en/welcome/versions.html ================================================ Version History · Project V Official

Version History

This page lists regular releases with feature updates. If a Github release doesn't appear here, it usually only contains bug fixes.

2019.03.01 v4.18

  • Port list in routing rules now supports mixed format.
  • Updated geosite information in routing, and description for static hosts in DNS.
  • Option to not use system root CAs for TLS handshake.
  • New routing rule for traffic attributes.

2019.02.22 v4.17

  • New sub-command tlsping in V2Ctl.

2019.02.15 v4.16

For end users:

  • DNS outbound proxy now supports to modify DNS server info.

For developers:

  • 'ext' repository is now deprecated. #1541

2019.02.08 v4.15

  • DNS outbound proxy.

2019.02.01 v4.14

  • Static DNS mapping now supports domain to domain mapping.

2019.01.18 v4.13

  • Quic lib updated. It is not compatible with previous versions.
  • DNS now have tag settings.

2019.01.11 v4.11

For developers:

2018.12.07 v4.8

For end users:

  • Bug fixes

For developers:

2018.11.30 v4.7

  • Freedom now supports for dialing IPv4 or IPv6 address only.
  • New QUIC transport.

2018.11.23 v4.6

  • Freedom now can automatically choose between IPv4 and IPv6 destination address, based on SendThrough settings.

2018.11.16 v4.4

  • Load balancer rules in routing.
  • Memory usage gets optimized.

2018.11.05 v4.1

  • JSON configuration format changes. Old format is still suported.
  • Performance on GeoIP matching is improved.

2018.11.02 v4.0

  • Reverse proxy.
  • Release packages for ppc64 and ppc64le.

2018.10.12 v3.47

  • Migrate to a new continuous delivery pipeline

2018.09.28 v3.44

  • Dokodemo-door now supports TProxy in Linux.

2018.09.21 v3.43

  • DNS now supports on-demand queries by domain.

2018.09.14 v3.40

  • New socket options in transport configuration. It can be used to setup VPNs.
  • New TCP Fast Open option in transport configuration.

2018.09.03 v3.38

  • mKCP has a new WireGuard header.
  • Fix softfloat binaries in mips/mips64.

2018.08.31 v3.37

  • Performance of reading network connection in optilized. See Environment Variables
  • VMess uses AES-128-GCM by default on ARM64.
  • Built by Go 1.11.

2018.08.24 v3.36

  • Great performance improvement on subdomain matching (domain:) in routing.
  • Full domain matching is now supported in routing.

2018.08.07 v3.34

  • Better memory management on most devices.

2018.07.27 v3.32

  • BitTorrent traffic can now be sniff'ed.
  • New protocol option in routing rules for protocol-based routing.
  • New geosite:speedtest option in routing rules to match all public servers of speedtest.net.

2018.07.20 v3.31

2018.07.13 v3.30

  • Fix an issue that may cause broken connections in mKCP.
  • Thanks to our friends who speak Russian. Now our documents are in Russian.

2018.07.06 v3.29

  • New inbound and outbound for MTProto proxy.

2018.06.29 v3.27

  • DNS now supports EDNS client subnet.
  • DNS static host now supports sub-domain matching.

2018.06.15 v3.26

  • Add Dragonfly BSD release.

2018.06.01 v3.24

  • Internal buffer size (per connection) can now be configured in JSON configuration.
  • mKCP now supports DTLS 1.2 header.
  • TLS transport now only support cipher suites in TLS 1.3 spec.

2018.05.25 v3.23

  • In JSON configuration, port can now be specified from env variables.
  • JSON config now supports to load domains and IPs from specified files.

2018.04.20 v3.19

  • Traffic stats for inbound proxies.

2018.04.13 v3.17

  • V2Ray can load config file from HTTP(s).
  • TLS in V2Ray can issue new certificates by provided CA certificates for domains in incoming requests.
  • HTTP/2 transport.

2018.04.06 v3.16

  • Statistics.
  • Shadowsocks inbound now can be configured to only listen on UDP. Strongly recommend to not listen on both TCP and UDP on the same port.

2018.03.02 v3.11

  • A new settings is introduced in VMess inbound, to forbid client using insecure encryption methods.
  • Offers ARMv7 release.
  • Offers MIPS release that doesn't require FPU.

2018.02.23 v3.10

  • Log entries now contain session ID to distinguish proxy sessions.
  • Bug fixes.

2018.02.15 v3.9

  • Happy New Year!
  • Bug fixes.

2018.02.09 v3.7

2017.12.29 v3.5

  • Geoip now supports private network address under name "private".

2017.12.22 v3.4

  • Websocket nows uses value of X-Forwarded-For header as source address.
  • Support s390x CPU architecture.

2017.12.08 v3.1

  • Support policy.
  • Config file location can be specified via environment variable.

2017.12.01 v3.0

  • Support Shadowsocks AEAD

2017.11.18 v2.50

  • v2ray now tried to use v2ctl for configuration parsing. Please make sure these 2 files are in the same directory.
  • New IPOnDemand strategy in routing.

2017.11.10 v2.47

  • geosite data is now in geosite.dat file.
  • Bug fixes.

2017.11.03 v2.46

  • Router now supports geosite:cn, equivalent to existing chinasites, but more flexible.
  • Router now supports geoip.
    • File geoip.dat is added to release packages. This file contains all geoip information and has to stay in the same directory of v2ray program. Due to delayed update of installation script, you may have to copy the file manually.
  • Program v2ctl is added to release packages. You may run v2ctl verify /path/to/v2ray to verify the signature of v2ray program.

2017.10.27 v2.44

  • HTTP now supports Basic Authentication.
  • Some bugs are fixed.

2017.10.06 v2.40

  • Fix an issue that causes memory leak.

2017.09.29 v2.39

  • Inbound proxies now close connections more quickly when remote server closes them.
  • Default connection timeout changes to 5 minutes.

2017.05.12 v2.27

  • New domain mode in router.

2017.05.05 v2.26

  • Stability fixes.

2017.04.28 v2.25

  • Simple sniffing on HTTP and TLS traffic for the actual domain on request.

2017.04.21 v2.24

  • Stabilize Mux.
  • Improves memory efficiency.

2017.04.15 v2.23

  • Performance improvement in Mux.
  • Max number of connections can be configured in Mux now.
  • Performance improvement in HTTP inbound.
  • connectionReuse setting is removed in favor of Mux.

2017.04.08 v2.22

  • Mux.Cool protocol.

2017.02.25 v2.20

  • GPG signature is added to download package.
  • New binary wv2ray.exe is added to Windows package, which runs as a background application.

2017.02.18 v2.19

  • A new mechanism for anti reply attack is now enforced on server side.
    • No impact to existing clients.
  • Upgrade of VMess AES-128-GCM / Chacha20-Poly1305 / None encryption methods.
    • Please upgrade client and server at once.
    • AES-128-CFB is not affected.
  • Built with Golang 1.8. Add 32-bit MIPS support.

2017.02.11 v2.18

  • Cleanup WebSocket code.
  • Remove allowPassive option. Now passive connections are always allowed.
  • Bug fixes

2017.02.04 v2.17

  • Bug fixes.

2017.01.28 v2.16

  • New 'redirect' option in freedom. It can be used to adapt tools like Shadowsocks Obfs.
  • Performance improvement in VMess non-encryption mode. Not compatible with previous versions.
  • Happy New Year!

2017.01.16 v2.15

  • All proxies can use mKCP and WebSocket now.

2017.01.09 v2.14

  • Socks 5 outbound.
  • Bug fixes.

2017.01.02 v2.13

  • Bug fixes.

2016.12.26 v2.12

  • Bug fixes.

2016.12.19 v2.11

  • JSON config file now supports comment.

2016.12.12 v2.10

  • VMess now supports AES-GCM and ChaCha20-Poly1305 encryption methods.

2016.12.05 v2.9

  • Fix compatibility with Alpine Linux.

2016.11.28 v2.8

  • Shadowsocks server now accepts OTA settings.
  • Bug fixes.

2016.11.21 v2.7

  • Main inbound and outbound connection handler can be tagged now.
  • Bug fixes.

2016.11.14 v2.6

  • Data sent by one outbound can be proxied to another outbound.
  • Routing can be based on inbound tag.

2016.11.07 v2.5

  • New Shadowsocks outbound;
  • New TCP header: HTTP;

2016.10.24 v2.4

  • TCP / mKCP / WebSocket can be configured per inbound / outbound;
  • Routing can be done on source IP;

2016.10.17 v2.3

  • Introduce new Protobuf-based configuration;
  • OpenBSD binaries;
  • Small fixes;

2016.09.19 v2.2

2016.09.19 v2.1

  • mKCP performance improvement;

2016.08.20 v2.0

  • One year;

2016.08.15 v1.24

  • New mKCP header: utp;
  • New option in inbound connection config "allowPassive" to allow passive connection;

2016.08.08 v1.23

  • Optimize mKCP packet format. This version of mKCP is NOT compatible with previous ones;
  • mKCP can now be configured to disguise as video data.

2016.08.01 v1.22

  • Fix a memory leak in mKCP;
  • Add FreeBSD release;

2016.07.25 v1.21

  • High performance Chacha20 (Thanks to aead@);
  • Bug fixes;

2016.07.18 v1.20

  • New KCP options: readBufferSize and writeBufferSize;
  • Bug fixes;

2016.07.11 v1.19

  • Enable TLS option for all proxies;
  • Fix a performance issue in KCP;
  • Fix an issue in KCP that could cause EOF response;

2016.07.04 v1.18

  • Fix a "too many open files" issue in KCP;
  • KCP now uses fewer CPU;
  • Other bug fixes;

2016.06.19 v1.17

2016.06.12 v1.16

  • TCP connection reuse is now enabled by default;
  • Dokodemo-door is able to recognize TCP connection redirected by iptables;
  • Blackhole is able to send back HTTP forbidden data;

2016.06.05 v1.15

  • Optionally reuse TCP connection for better performance;
  • Allow listening on a specific IP address;
  • Allow sending data through a specific IP address;
  • Fix an issue in HTTP proxy that may exhaust memory;

2016.05.29 v1.14

  • Fix a panic issue in http proxy;
  • More functionalies in install script;
  • Static route in DNS;
  • Official server address change;

2016.05.16 v1.13

  • Internal DNS server, to provide better routing results combined with chinasites and chinaip;
  • Fix an issue in UDP relay;

2016.05.01 v1.12.1

  • Fix a bug in VMess.

2016.05.01 v1.12

  • Second try to fix the memory usage issue;
  • Improve Shadowsocks performance;
  • New option "none" in loglevel;

2016.04.18 v1.11

  • Try to fix the memory usage issue.

2016.03.07 v1.10

  • Fix an performance issue when dynamic ports refreshes.

2016.02.29 v1.9.1

  • Fix Shadowsocks one-time authentication (OTA) issue.

2016.02.29 v1.9

  • Support for Shadowsocks ChaCha20 encryption;
  • Add more direct connection sites to the default configuration file;
  • Dynamic ports now automatically create an account.

2016.02.22 v1.8

  • Update installation script install-release.sh (thanks, @netcookies):
    • You can now automatically stop the V2Ray process and update automatically after the completion of V2Ray;
    • The install-release.sh accepts the --proxy argument and V2Ray specified proxy download;
  • Use Go 1.6 compiler to improve the performance of AES encryption;
  • Minor fixes;
  • Update the official server IP (please re-download the installation package to get the latest configuration).

2016.02.08 v1.7

  • UDP relay performance improved;
  • Shadowsocks security improved;
  • Minor fixes;
  • Happy new year!
================================================ FILE: en/welcome/workflow.html ================================================ Workflow · Project V Official

Workflow

Single Server

Same as other proxies, you need a proxy server which runs V2Ray. Then you can connect to internet through that server from you PC, mobile or other devices.

graph LR; A(PC) -.- B(Firewall); B -.-> C(Blocked Website); A --> D(V2Ray/VPS); D --> C; A --> E(Normal Website);

V2Ray supports connections from multiple devices at the same time, with optionally different protocols. In the mean time, the local routing mechanism can smartly proxy necessary connections only.

Server Bridge

In the case you don't want configuration V2Ray on each of your devices, you may setup a server within the firewall, and then all traffic go through that server. The server does routing itself.

graph LR; A(PC) -.-> B(Firewall); B -.-> C(Blocked Website); A --> D(VPS 1); D --> E(VPS 2); E --> C; D --> F(Normal Website);

Internal

The internal of V2Ray looks like below. It supports multiple inbound proxies, and multiple outbounds. Each of them are independent from others.

graph LR; A1(inbound) --> D(Dispatcher / Router / DNS); A2(inbound) --> D; A3(inbound) --> D; A4(inbound) --> D; D --> B1(outbound); D --> B2(outbound); D --> B3(outbound); D --> B4(outbound);

Notes:

  • You have to configure at least one inbound and one outbound to make V2Ray work properly.
  • The inbound proxy communicates with client software such as browser.
  • The outbound proxy communicates with remote server, such as Apache for a website.
  • The dispatcher is responsible for choosing a outbound for a given connection, based on configurable rules.

Detailed configuration can be found here.

================================================ FILE: ext/index.html ================================================ Nothing here Nothing to see here; move along. ================================================ FILE: fa/awesome/ads.html ================================================ With Ads · Project V

Some Advertisement

The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V.

Self Hosting

Let's Encrypt

Free TLS certificates

Vultr

VPS

2019 limited promotion, $50 free credit

BlueHost

VPS, web hosting

ClouDNS

Domain registration, DNS, SSL certificate

Bandwagon

Well-known VPS provider. Low price for good product.

VPN

BabyDriver

Supports V2Ray. Coupon code: bcb518

喵帕斯

V2Ray support (beta)

Lanan

V2Ray based VPN service. Coupon code: v2ray

V2Net

Customized V2Ray service. Promo code: v2ray.com

Cryptocurrency

LocalBitcoins

Trade Bitcoins offline

CoinCola

OTC market to trade BTC, ETH, BCH, USDT.

Binance

Trading market for crypto currencies.

Coinex

Trading market for crypto currencies.

CoinPayment

Online crypto currency wallet

================================================ FILE: fa/awesome/tools.html ================================================ Awesome V · Project V

Awesome V

Graphic Client

V2RayW

Download: Github

V2RayN

Download: Github

Clash for Windows

Download: Github

V2RayX

Download: Github

V2RayU

Download: Github

V2RayC

Download: Github

ClashX

Download: Github

Qv2ray

Qv2ray: v2ray Cross-Platform GUI written in Qt, supports multi-language, connection edit and auto-check updates

Download: GitHub

Website (Chinese): https://lhy0403.github.io/Qv2ray

Mellow

Mellow is a rule-based global transparent proxy client for Windows, macOS and Linux.

Download: Github

Kitsunebi

Kitsunebi is an iOS app based on V2Ray. It provides full functionality as V2Ray. It also supports importing and exporting V2Ray compatible JSON configuration.

Download: iTunes

i2Ray

i2Ray is another iOS app based on V2Ray with easy-to-use UI design.

Download: iTunes

Shadowrocket

Shadowrocket is a generic VPN app. Is supports multiple protocols such as Shadowsocks, VMess, SSR etc.

Download: iTunes

Pepi (was ShadowRay)

Pepi is V2Ray compatible app. Is is able create VPN connections based on VMess protocol, and communicate with any V2Ray servers.

Download: iTunes

Quantumult

Download: iTunes

BifrostV

BifrostV is an Android app based on V2Ray core. It supports VMess, Shadowsocks, socks protocols.

Download: Play Store | APK Pure

V2RayNG

V2RayNG is an Android app based on V2Ray. It provides same feature set as V2Ray core.

Download: Play Store | GitHub

Online services

Configuration generator

Online configuration generator.

UUID Generator

UUID generator for VMess users.

================================================ FILE: fa/configuration/api.html ================================================ API · Project V

API

V2Ray برخی از API ها را برای دسترسی از راه دور فراهم می کند. این API ها بر اساس gRPC.

هنگامی که API فعال می شود، V2Ray یک پروکسی خروجی را به صورت خودکار ایجاد می کند، برچسب به عنوان برچسبنشان می دهد. کاربر باید مسیر تمام اتصالات gRPC را به این خروجی.

ApiObject

ApiObject به عنوان api فیلد در پیکربندی سطح بالا استفاده می شود.

{
  "tag": "api",
  "services": [
    "HandlerService",
    "LoggerService",
    "StatsService"
  ]
}

برچسب: رشته

برچسب پروکسی خروجی

خدمات: \ [رشته ]

فهرست API های فعال شده.

لیست API پشتیبانی شده

HandlerService

API برای مدیریت پروکسی های ورودی و خروجی ویژگی های زیر ارائه شده است:

  • یک پروکسی جدید ورودی / خروجی اضافه کنید
  • پروکسی ورودی / خروجی موجود را حذف کنید.
  • یک کاربر جدید را به پروکسی ورودی اضافه کنید (تنها VMessage).
  • یک کاربر موجود را از یک پروکسی ورودی حذف کنید (فقط VMess).

LoggerService

برای راه اندازی مجدد logger داخلی می توانید با logrotate برای فایل های ورودی کار کنید.

StatsService

پشتیبانی از داخلی آمار.

================================================ FILE: fa/configuration/dns.html ================================================ DNS · Project V

DNS

V2Ray دارای یک سرور DNS داخلی است که رله DNS را برای اجزای دیگر فراهم می کند.

با توجه به پیچیدگی پروتکل DNS، V2Ray در حال حاضر تنها از درخواستهای IP اصلی (A و AAAA) پشتیبانی می کند. توصیه می کنیم از DNS حرفه ای (مانند CoreDNS) برای V2Ray استفاده کنید.

پرسش های DNS که توسط این سرویس DNS رله می شود نیز براساس تنظیمات مسیریابی ارسال می شود. هیچ پیکربندی اضافی لازم نیست.

DnsObject

DnsObject به عنوان dns فیلد در پیکربندی سطح بالا استفاده می شود.

{
  "hosts": {
    "baidu.com": "127.0.0.1"
  },
  "servers": [
    {
      "address": "1.2.3.4",
      "port": 5353,
      "domains": [
        "domain:v2ray.com"
      ]
    },
    "8.8.8.8",
    "8.8.4.4",
    "localhost"
  ],
  "clientIp": "1.2.3.4",
  "tag": "dns_inbound"
}

hosts: map{string: address}

A list of static addresses, in the form of domain:address. Each entry has a domain name as key and IP or domain address as value. If a DNS query targets one of the domains in this list, the corresponding IP will be returned immediately and DNS query will not be relayed, or the corresponding domain address will be used for further DNS queries, instead of the previous one.

The format of domains is:

  • Plaintext: When the targeting domain is exactly the value, the rule takes effect. Example: rule "v2ray.com" matches "v2ray.com", but not "www.v2ray.com".
  • Regular expression: Begining with "regexp:", the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule "regexp:\\.goo.*\\.com$" matches "www.google.com" and "fonts.googleapis.com", but not "google.com".
  • Subdomain (recommended): Begining with "domain:" and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule "domain:v2ray.com" matches "www.v2ray.com", "v2ray.com", but not "xv2ray.com".
  • Keyword: Begining with "keyword:" and the rest is a pattern. If this string matches any part of the targeting domain, this rule takes effet. Example: rule "keyword:sina.com" matches targeting domain "sina.com", "sina.com.cn" and "www.sina.com", but not "sina.cn".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.

سرور: \ [رشته | ServerObject | "localhost" ]

فهرست سرورهای DNS. هر سرور ممکن است در سه فرمت مشخص شود: آدرس IP، ServerObjectیا "localhost".

هنگامی که یک سرور یک آدرس IP است، مانند "8.8.8.8"، V2Ray در DNS UDP روی 53 آدرس در این آدرس نمایش داده می شود.

هنگامی که یک سرور "localhost"، V2Ray میزبان محلی DNS را نمایش می دهد.

هنگامی که "localhost" استفاده می شود، ترافیک در حال انجام DNS توسط V2Ray کنترل نمی شود. با این وجود، شما می توانید پرس و جوهای DNS را با تنظیمات اضافی به V2Ray هدایت کنید.

clientIp: string

آدرس آی پی دستگاه فعلی. اگر مشخص شود، V2Ray از این IP به عنوان EDNS-Client-Subnet استفاده می کند. این IP نمی تواند یک آدرس خصوصی باشد.

tag: string

(V2Ray 4.13+) All traffic initiated from this DNS, except to localhost, will have this tag as inbound. It can be used for routing.

ServerObject

{
  "address": "1.2.3.4",
  "port": 5353,
  "domains": [
    "domain:v2ray.com"
  ],
}

address: address

Address of the DNS server. For now only UDP servers are supported.

port: number

Port of the DNS server. Usually it is 53 or 5353.

domains: [string]

A list of domains. If the domain of enquire matches one of the list, this DNS server will be prioritized for DNS query for this domain.

Domain name format is the same as in routing.

When a DNS server has the domain in its domain list, the domain will be queried in this server first, and then other servers. Otherwise DNS queries are sent to DNS servers in the order they appear in the config file.

================================================ FILE: fa/configuration/env.html ================================================ متغیرهای Env · Project V

متغیرهای محیطی

V2Ray متغیرهای محیط زیر را می خواند.

اندازه کش در هر اتصال

  • نام: v2ray.ray.buffer.size یا V2RAY_RAY_BUFFER_SIZE
  • واحد: MBytes
  • مقدار پیش فرض: 2 در x86، amd64، arm64 و s390x. این حافظه پنهان در سایر سیستم عاملها غیرفعال است.
  • مقدار ویژه: 0 برای اندازه حافظه پنهان نامحدود

Deprecated. Use bufferSize in Policy.

For each connection, when there is a difference in speed between inbound and outbound traffic, V2Ray will cache some data for larger throughput. This setting controls the size of the cache. The larger the cache, the better the performance.

محل دارایی V2Ray

  • نام: v2ray.location.asset یا V2RAY_LOCATION_ASSET
  • مقدار پیش فرض: همان پوشه ای است که v2ray است.

This variable specifies a directory where geoip.dat and geosite.dat files are.

محل پیکربندی V2Ray

  • نام: v2ray.location.config یا V2RAY_LOCATION_CONFIG
  • مقدار پیش فرض: همان پوشه ای است که v2ray است.

This variable specifies a directory where config.json is.

پراکندگی خواندن

  • نام: v2ray.buf.readv یا V2RAY_BUF_READV
  • مقدار پیش فرض: خودکار

V2Ray 3.37 uses Scatter/Gather IO. This feature will use less memory when connection speed is over 100 MByte/s. Possible values are: auto, enable and disable.

  • فعال کردن: فعال کردن خواندن پراکنده
  • غیر فعال کردن: غیر فعال کردن خواندن پراکنده.
  • خودکار: در ویندوز، MacOS، لینوکس فعال می شود، زمانی که پردازنده x86، AMD64 یا s390x است.

When connection speed is less than 100 MByte/s, no matter whether this is enabled or not, there is no obvious difference in terms of memory usage.

================================================ FILE: fa/configuration/index.html ================================================ پیکربندی · Project V

پیکربندی

V2Ray با استفاده از پروتوبف پیکربندی مبتنی بر. به عنوان فرمت protobuf کمتر قابل خواندن است، V2Ray همچنین از پیکربندی در JSON پشتیبانی می کند. قبل از اجرای V2Ray، به طور خودکار پیکربندی JSON را به protobuf تبدیل می کند. این گفته می شود، دیگر فرمت های پیکربندی ممکن است در furture معرفی شود.

در اینجا ما پیکربندی مبتنی بر JSON را معرفی می کنیم.

JSON، یا نشانگر جاوا اسکریپت، به طور خلاصه، اشیا در Javascript هستند. یک فایل JSON حاوی یک و تنها یک شیء JSON است، شروع از "{" و پایان دادن با "}".

یک شی JSON حاوی لیستی از جفت های کلیدی مهم است. یک کلید یک رشته است و مقدار ممکن است انواع مختلفی از قبیل رشته، عدد، رشته ای، آرایه یا یک شی دیگر باشد. یک شیء معمولی زیر است:

{
  "stringValue": "This is a string.",
  "numberValue": 42,
  "boolValue": true,
  "arrayValue": ["this", "is", "a", "string", "array"],
  "objectValue": {
    "another": "object"
  }
}

V2Ray از نظرات در JSON پشتیبانی می کند، حاوی "یا" یا "/ \ \ /" حاشیه نویسی شده است. در یک ویرایشگر که نظرات را پشتیبانی نمی کند، ممکن است به عنوان اشتباه نمایش داده شود، اما نظرات واقعا در V2Ray کار می کنند.

انواع داده JSON

در اینجا یک معرفی مختصر از انواع داده JSON است. آنها در بقیه اسناد ارجاع خواهند شد.

boolean: true | نادرست

مقدار boolean باید درست باشد یا falseبدون علامت نقل قول.

عدد

عدد صحيح غیر منفی، بدون علامت نقل قول.

رشته

دنباله ای از شخصیت ها، توسط علامت نقل قول احاطه شده است.

آرایه: []

آرایه ای از عناصر نوع عناصر آن معمولا یکسان است، مثلا [string] آرایه ای از رشته.

شی: {}

هدف - شی. با لیستی از جفت های ارزش کلیدی همراه می شود.

یک جفت ارزش کلیدی معمولا با کاما "،" به پایان می رسد، اما نباید با کاما به پایان برسد، اگر آخرین عنصر از شی است.

انواع داده های مشترک V2Ray

نقشه: object \ {string، string }

یک شی که کلید ها و مقادیر نوع ثابت دارند.

آدرس: رشته

یک آدرس IP یا دامنه در شکل رشته، مانند "8.8.8.8" یا "www.v2ray.com"

آدرس_پورت: رشته

آدرس با پورت، مانند "8.8.8.8:53" یا "www.v2ray.com:80". در برخی از استفاده ها، بخش آدرس می تواند حذف شود، مانند ": 443".

================================================ FILE: fa/configuration/mux.html ================================================ mux · Project V

چندگانه شدن

Multiplexing، یا Mux، استفاده از یک اتصال TCP فیزیکی برای چندین اتصال TCP مجازی است.

Mux برای کاهش زمان تاخیر دستکاری TCP طراحی شده است. این برای توان بالا نیست هنگامی که برای دانلود فایل های بزرگ یا اندازه گیری سرعت استفاده می شود، Mux معمولا از اتصال معمولی TCP کندتر است.

MuxObject

{
  "enabled": false,
  "concurrency": 8
}

فعال: true | نادرست

آیا Mux را در خروجی فعال کنید یا خیر

هم زمان: شماره

حداکثر تعداد اتصالات چندگانه که یک اتصال فیزیکی در یک زمان می تواند اداره کند. حداکثر مقدار 1024، دقیقه ارزش 1، به طور پیش فرض 8.

================================================ FILE: fa/configuration/overview.html ================================================ بررسی اجمالی · Project V

بررسی پیکربندی

V2Ray همان ساختار پیکربندی را بین طرف سرور و سمت سرویس گیرنده نشان می دهد که در زیر نشان داده شده است. تنظیمات سرور و مشتری در بخش های مختلف متفاوت هستند.

در زیر ساختار سطح بالای پیکربندی است. هر بخش فرمت خاص خود را دارد.

{
  "log": {},
  "api": {},
  "dns": {},
  "stats": {},
  "routing": {},
  "policy": {},
  "inbounds": [],
  "outbounds": [],
  "transport": {}
}

log: LogObject

ورودی پیکربندی برای کنترل خروجی های ورودی.

api: ApiObject

API RPC برای کنترل نمونه V2Ray. مشاهده API پیکربندی برای جزئیات بیشتر.

dns: DnsObject

پیکربندی برای تنظیمات داخلی DNS سرور. اگر این قسمت حذف شود، V2Ray از پیکربندی DNS سیستم شما استفاده خواهد کرد. برای جزئیات، تنظیمات DNS.

آمار: StatsObject

هنگامی که مشخص شده، داخلی آمار را فعال کنید.

سیاست: PolicyObject

تنظیمات برای مجوزها و دیگر راهبردهای امنیتی. برای جزئیات بیشتر، به سیاست محلی.

مسیریابی: RoutingObject

پیکربندی برای داخلی مسیریابی استراتژی.

inbounds: \ [ InboundObject]

آرایه ای از InboundObject به عنوان پیکربندی برای پروکسی های ورودی.

خروجی: \ [ OutboundObject]

آرایه ای از OutboundObject به عنوان پیکربندی برای پروکسی های خروجی. اولین خروجی در آرایه یکی از اصلیترین آنهاست. این پیش فرض خروجی در تصمیم مسیریابی است.

حمل و نقل: TransportObject

پیکربندی پروتکل حمل و نقل پایین. برای جزئیات، پروتکل گزینه های حمل و نقل.

LogObject

{
  "access": "/path/to/file",
  "error": "/path/to/file",
  "loglevel": "warning"
}

دسترسی به: رشته

مسیر ورود به سیستم اگر خالی نیست، باید یک مسیر فایل قانونی باشد مانند "/tmp/v2ray/_access.log"(لینوکس)، یا "C: \\ Temp \\ v2ray \\ _ access.log"(ویندوز ) اگر خالی باشد، V2Ray ورود به سیستم را به stdoutمی نویسد.

خطا: رشته

مسیر ورود به خطا اگر خالی نباشد، باید مسیر فایل قانونی باشد. اگر خالی باشد، V2Ray log log را به stdoutمی نویسد.

loglevel: "debug" | "اطلاعات" | "هشدار" | "خطا" | "هیچ یک"

سطح سیاهههای مربوط به نوشته شده است سطوح ورودی مختلف نشان دهنده محتوای مختلف سیاهههای مربوط است. مقدار پیش فرض "هشدار".

سطوح ورودی:

  • "debug": اطلاعات فقط برای توسعه دهندگان. همچنین شامل همه "اطلاعات" سیاهههای مربوط.
  • "info": اطلاعات برای وضعیت فعلی V2Ray. کاربران مجبور نیستند از آن ها مراقبت کنند. همچنین شامل همه "هشدار" سیاهههای مربوط.
  • "هشدار": چیزی با محیط زیست اشتباه است، معمولا خارج از V2Ray، به عنوان مثال، شکستن شبکه. V2Ray همچنان اجرا می شود، اما کاربران ممکن است برخی از شکست ها را تجربه کنند. همچنین شامل همه "خطا" سیاهههای مربوط.
  • "خطا": چیزی شدیدا اشتباه است، که V2Ray نمی تواند اجرا شود.
  • "none": همه ورود به سیستم غیر فعال هستند.

InboundObject

InboundObject یک پروکسی ورودی را تعریف می کند. این ارتباطات ورودی به V2Ray را مدیریت می کند. پراکسی های موجود در اینجا لیست شده است.

{
  "port": 1080,
  "listen": "127.0.0.1",
  "protocol": "protocol_name",
  "settings": {},
  "streamSettings": {},
  "tag": "inbound_tag_name",
  "sniffing": {
    "enabled": false,
    "destOverride": ["http", "tls"]
  },
  "allocate": {
    "strategy": "always",
    "refresh": 5,
    "concurrency": 3
  },
}

پورت: شماره | "env: متغیر" | رشته

پورت که پروکسی در حال گوش دادن است فرمت های پذیرفته شده عبارتند از:

  • صحیح: شماره پورت واقعی.
  • متغیر محیطی: شروع با "env:"، متغیر env پورت فرمت رشته را مشخص می کند، مانند "env: PORT". V2Ray متغیر را به عنوان رشته رمزگشایی می کند.
  • String: یک مقدار رشته عدد، مانند "1234"، یا طیف وسیعی از پورتها، مانند "5-10" برای 6 پورت در مجموع.

پورت های واقعی برای باز کردن نیز بستگی به تخصیص تنظیمات. زیر را ببینید

گوش دادن: آدرس

آدرس برای گوش دادن به مقدار پیش فرض "0.0.0.0" برای اتصالات ورودی در تمام رابط های شبکه است. در غیر این صورت، ارزش باید آدرس یک رابط شبکه موجود باشد.

پروتکل: رشته

نام پروتکل ورودی هر فردی را برای مقادیر موجود مشاهده کنید.

تنظیمات: InboundConfigurationObject

تنظیمات خاص پروتکل InboundConfigurationObject در هر پروتکل تعریف کنید.

streamSettings: [StreamSettingsObject]

مشاهده پروتکل گزینه های حمل و نقل برای جزئیات.

برچسب: رشته

برچسب پروکسی ورودی این می تواند برای تصمیم گیری مسیریابی استفاده شود. اگر خالی نباشد، باید در میان تمام پروکسی های ورودی منحصر به فرد باشد.

sniffing: SniffingObject

پیکربندی محتویات محتوا

تخصیص: AllocateObject

پیکربندی برای تخصیص پورت

SniffingObject

{
  "enabled": false,
  "destOverride": ["http", "tls"]
}

فعال: true | نادرست

آیا محتوا را مجذوب میکنید یا نه

destOverride: \ ["http" | "TLS" ]

آرایه ای از نوع محتوا. اگر نوع محتوا از ترافیک ورودی در لیست مشخص شده باشد، مقصد اتصال با مقدار sniffed رونویسی خواهد شد.

AllocateObject

{
  "strategy": "always",
  "refresh": 5,
  "concurrency": 3
}

استراتژی: "همیشه" | "تصادفی"

استراتژی تخصیص پورت هنگامی که آن را به "همیشه"، تمام پورت در قسمت پورت برای شنیدن اختصاص داده می شود. اگر «تصادفی» تنظیم شده باشد، V2Ray بر تعداد همزمان پورت گوش می دهد و لیست پورت ها هر بازخوانی دقیقه رد می شود.

تازه کردن: شماره

تعداد دقیقه برای تازه کردن بنادر گوش دادن. مقدار حداقل 2. این تنظیم تنها زمانی موثر است که استراتژی به "تصادفی".

هم زمان: شماره

تعداد پورت ها برای گوش دادن مقدار حداقل 1. حداکثر مقدار یک سوم کل محدوده بندر است.

OutboundObject

OutboundObject یک پروکسی خروجی را برای مدیریت اتصالات خروجی تعریف می کند. پروتکل های موجود ذکر شده در اینجا.

{
  "sendThrough": "0.0.0.0",
  "protocol": "protocol_name",
  "settings": {},
  "tag": "this_outbound_tag_name",
  "streamSettings": {},
  "proxySettings": {
    "tag": "another_outbound_tag_name"
  },
  "mux": {}
}

طریق: آدرس

آدرس آی پی برای ارسال ترافیک. مقدار پیش فرض، "0.0.0.0" برای انتخاب تصادفی یک IP موجود در میزبان است. در غیر این صورت، ارزش باید یک آدرس IP از رابط های شبکه موجود باشد.

پروتکل: رشته

نام پروتکل این خروجی مشاهده پروتکل برای تمام مقادیر موجود.

تنظیمات: OutboundConfigurationObject

تنظیمات خاص پروتکل مشاهده OutboundConfigurationObject در هر پروتکل های فردی است.

برچسب: رشته

برچسب این خروجی اگر خالی نباشد، باید در میان تمام خروجی ها منحصر به فرد باشد.

streamSettings: StreamSettingsObject

تنظیمات حمل و نقل در سطح پایین. گزینه های پروتکل حمل و نقل را مشاهده کنید..

proxySettings: ProxySettingsObject

پیکربندی برای نمایندگی ترافیک از این خروجی به دیگری. هنگامی که این تنظیم می شود، جریان تنظیمات این خروجی بی تاثیر خواهد بود.

mux: MuxObject

مشاهده کنید Mux پیکربندی برای جزئیات.

ProxySettingsObject

{
  "tag": "another-outbound-tag"
}

برچسب: رشته

وقتی برچسب به تگ خروجی دیگر تنظیم می شود، ترافیک خروجی خروجی فعلی به یک مشخص شده منتقل می شود.

================================================ FILE: fa/configuration/policy.html ================================================ سیاست · Project V

سیاست محلی

خط مشی محلی سیاست تنظیمات فعلی V2Ray را مدیریت می کند، مانند وقفه اتصال. پلیس میتواند به هر سطح کاربری یا کل سیستم اعمال شود.

PolicyObject

PolicyObject به عنوان فیلد سیاست در پیکربندی سطح بالا استفاده می شود.

{
  "levels": {
    "0": {
      "handshake": 4,
      "connIdle": 300,
      "uplinkOnly": 2,
      "downlinkOnly": 5,
      "statsUserUplink": false,
      "statsUserDownlink": false
    }
  },
  "system": {
    "statsInboundUplink": false,
    "statsInboundDownlink": false
  }
}

level: map{string: LevelPolicyObject}

A list of key value pairs. Each key is a string of integer (restricted by JSON), such as "0", "1", etc. The numeric value is for a certain user level.

User level can be set on each inbound and outbound proxy. V2Ray will apply different policies based on user level.

system: SystemPolicyObject

System-wide policy

LevelPolicyObject

{
  "handshake": 4,
  "connIdle": 300,
  "uplinkOnly": 2,
  "downlinkOnly": 5,
  "statsUserUplink": false,
  "statsUserDownlink": false,
  "bufferSize": 10240
}

handshake: number

Timeout for establishing a connection, in seconds. Default value 4. At the handshake stage of an inbound proxy dealing with a new connection, say VMess reading request header, if it takes longer than handshake time, V2Ray aborts the connection.

connIdle: number

Timeout for idle connections, in seconds. Default value 300. If there is no data passed through the connection in connIdle time, V2Ray aborts the conneciton.

uplinkOnly: number

Time for keeping connections open after the uplink of the connection is closed, in seconds. Default value 2. After remote (server) closes the downlink of the connection, V2Ray aborts the connection after uplinkOnly times.

downlinkOnly: number

Time for keeping connections open after the downlink of the connection is closed, in seconds. Default value 5. After client (browser) closes the uplink of the connection, V2Ray aborts the connection after downlinkOnly time.

In a simple webpage browser scenario, it is safe to set uplinkOnly and downlinkOnly both to 0, for better performance.

statsUserUplink: true | false

When set to true, V2Ray enables stat counter to uplink traffic for all users in this level.

statsUserDownlink: true | false

When set to true, V2Ray enables stat counter to downlink traffic for all users in this level.

bufferSize: number

Size of internal buffer per connection, in kilo-bytes. Default value is 10240. When it is set to 0, the internal buffer is disabled.

Default value (V2Ray 4.4+):

  • 0 on ARM, MIPS and MIPSLE.
  • 4 on ARM64, MIPS64 and MIPS64LE.
  • 512 on other platforms.

Default value (V2Ray 4.3-):

  • 16 on ARM, ARM64, MIPS, MIPS64, MIPSLE and MIPS64LE.
  • 2048 on other platforms.

bufferSize overrides v2ray.ray.buffer.size settings in env variables.

SystemPolicyObject

{
  "statsInboundUplink": false,
  "statsInboundDownlink": false
}

statsInboundUplink: true | false

When set to true, V2Ray enables stat counter for all uplink traffic in all inbound proxies.

statsInboundDownlink: true | false

When set to true, V2Ray enables stat counter for all downlink traffic in all inbound proxies.

================================================ FILE: fa/configuration/protocols/blackhole.html ================================================ Blackhole · Project V

Blackhole

  • نام: blackhole
  • نوع: خروجی

Blackhole یک پروتکل برای ارتباطات خروجی است. این همه اتصالات با پاسخ های از پیش تعیین شده را مسدود می کند. همراه با مسیریابی، این می تواند برای جلوگیری از دسترسی به برخی از وب سایت ها استفاده شود.

ConfigurationObject

{
  "response": {
    "type": "none"
  }
}

response: ResponseObject

پاسخ از پیش تعیین شده Blockhole بلافاصله برای هر ارتباطی که به آن انتقال داده می شود (اگر داده شده است) داده شود و اتصال را متوقف کند.

ResponseObject

{
  "type": "none"
}

type: "none" | "http"

نوع پاسخ، گزینه های موجود عبارتند از:

  • "none": مقدار پیش فرض. پاسخ خالی
  • "http": پاسخ معتبر HTTP 403.
================================================ FILE: fa/configuration/protocols/dns.html ================================================ DNS · Project V

DNS

  • Name: dns
  • Type: Outbound

DNS is an outbound proxy. It is mainly used for intercept and proxy DNS queries and responses. This outbound proxy can only accept DNS traffic, including both TCP and UDP based DNS queries. Other type of traffic will result in errors.

When proxying DNS queries, DNS outbound will redirect IP queries (A and AAAA) to internal DNS server. It will send other type of queries directly to its original destination.

DNS outbound proxy is introduced in V2Ray 4.15.

OutboundConfigurationObject

{
    "network": "tcp",
    "address": "1.1.1.1",
    "port": 53
}

network: "tcp" | "udp"

(V2Ray 4.16+) Modify the transport protocol of the DNS traffic. The value may be either "tcp" or "udp". If it is not specified, the original protocol remains unchanged.

address: address

(V2Ray 4.16+) Modify the DNS server address in the request. If it is not specified, the original DNS server address remain unchanged.

port: number

(V2Ray 4.16+) Modify the DNS server port in the request. If it is not specified, the original DNS server port remain unchanged.

================================================ FILE: fa/configuration/protocols/dokodemo.html ================================================ Dokodemo · Project V

refcn: chapter_02/protocols/dokodemo refen: configuration/protocols/dokodemo


Dokodemo-door

  • نام: dokodemo-door
  • نوع: ورودی

Dokodemo درب یک پروتکل برای اتصالات ورودی است. هر ارتباطی را می گیرید و آنها را به مقصد مشخص شده منتقل می کنید.

Dokodemo درب همچنین (اگر پیکربندی شده) به عنوان یک پروکسی شفاف کار می کند.

ConfigurationObject

{
  "address": "8.8.8.8",
  "port": 53,
  "network": "tcp",
  "followRedirect": false,
  "userLevel": 0
}

address: address

آدرس سرور مقصد ممکن است یک IPv4، IPv6 یا یک دامنه در فرم رشته باشد. هنگامی که followRedirect (زیر را ببینید) true، آدرس می تواند خالی باشد.

port: number

پورت سرور مقصد

network: "tcp" | "udp" | "tcp,udp"

نوع شبکه قابل قبول اگر "tcp" مشخص شود، تمام ترافیک UDP فرستاده شده به این door doko-door حذف خواهد شد.

followRedirect: true | false

هنگامی که به trueتنظیم می شود، dokodemo-door مقصد را از TProxy تشخیص می دهد و از آن به عنوان مقصد استفاده می کند. TProxy در حمل و نقل برای جزئیات مشاهده کنید.

userLevel: number

سطح کاربر همه اتصالات این سطح را به اشتراک میگذارند. برای جزئیات بیشتر به سیاست مراجعه کنید.

نمونه هایی برای پروکسی شفاف

ورودی dokodemo door را به صورت زیر وارد کنید.

{
  "network": "tcp,udp",
  "timeout": 30,
  "followRedirect": true
}

پیکربندی iptables را به صورت زیر انجام دهید.

# ایجاد زنجیره ای جدید
iptables -t nat -N V2RAY
iptables -t انسداد -N V2RAY
iptables -t انحنا -N V2RAY_MARK

# آدرس سرور شما V2Ray را نادیده بگیرید
# بسیار مهم است، فقط مراقب باشید.
iptables -t nat -a V2RAY -d 123.123.123.123 -j بازگردانی

# نادیده گرفتن LAN ها و هر آدرس دیگری که می خواهید از پروکسی دور بشوید
# برای مشاهده لیست کامل شبکه های رزرو شده به ویکیپدیا و RFC5735 مراجعه کنید.
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -a V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -a V2RAY -d 192.168 .0.0 / 16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN

# هر چیز دیگری باید هدایت شود به پورت محلی Dokodemo درب
iptables -t nat -A V2RAY -p tcp -j REDIRECT -to-ports 12345

# اضافه کردن هر قاعده UDP
مسیر IP اضافه کردن محلی محلی به طور پیش فرض lo loo 100
قانون آی پی اضافه کردن 1 جستجو 100
iptables -t mangle -A V2RAY -p udp -dport 53 -j TPROXY -on-port 12345 -tproxy-mark 0x01 / 0x01
iptables -t mangle -A V2RAY_MARK -p udp --dport 53 -j MARK -set-mark 1

# قوانین را اعمال می کند
iptables -t nat -A OUTPUT -p tcp -j V2RAY
iptables -t انسداد -A PREROUTING -j V2RAY
iptables -t انسداد -A OUTPUT -j V2RAY_MARK
================================================ FILE: fa/configuration/protocols/freedom.html ================================================ Freedom · Project V

Freedom

  • نام: آزادی45.77.33.69
  • نوع: خروجی

آزادی یک پروتکل برای ارتباطات خروجی است این تمام اتصال TCP یا UDP را به مقصد خود منتقل می کند. این خروجی زمانی استفاده می شود که می خواهید ترافیک را به مقصد واقعی خود ارسال کنید.

ConfigurationObject

{
  "domainStrategy": "AsIs",
  "redirect": "127.0.0.1:3366",
  "userLevel": 0
}

domainStrategy: "AsIs" | "UseIP"

استراتژی برای حل و فصل نام دامنه. گزینه ها عبارتند از:

  • "AsIs": مقدار پیش فرض. تعیین نام دامنه توسط سیستم
  • "UseIP": استفاده از DNS داخلی برای وضوح نام دامنه.
  • "UseIPv4": Use IPv4 address only, after resolved by internal DNS.
  • "UseIPv6": Use IPv6 address only, after resolved by internal DNS.

(V2Ray 4.6+) In UseIP mode, when sendThrough is specified in OutboundObject, Freedom will automatically choose between IPv4 and IPv6 address for destination based on sendThrough settings.

(V2Ray 4.7+) If sendThrough address conflicts with "UseIPv4" or "UseIPv6", Freedom will fail to dial out-going connections.

redirect: address_port

Redirect all connections to this address, in form like "127.0.0.1:80" or ":1234".

  • وقتی آدرس خالی است، به عنوان مثال ": 443"، Freedom از آدرس اصلی اصلی استفاده می کند.
  • هنگامی که پورت 0، به عنوان مثال "v2ray.com:0"، آزادی را به پورت اصلی استفاده کنید.

userLevel: number

User level. All connections share this level.

================================================ FILE: fa/configuration/protocols/http.html ================================================ HTTP · Project V

HTTP

  • نام: http
  • نوع: ورودی

HTTP یک پروتکل برای اتصالات ورودی است. این سازگار با HTTP / 1.1 است.

InboundConfigurationObject

{
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "allowTransparent": false,
  "userLevel": 0
}

accounts: [AccountObject]

آرایه ای که هر ورودی یک حساب است. به طور پیش فرض خالی است. اگر خالی نباشد، HTTP Basic Authentication برای درخواست های ورودی مورد نیاز است.

allowTransparent: true | false

اگر به trueتنظیم شده باشد، تمام درخواست HTTP برای این ورودی ارسال خواهد شد پروکسی، از جمله درخواست غیر پروکسی.

userLevel: number

سطح کاربر همه اتصالات این سطح را به اشتراک میگذارند.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

نام کاربری برای تأیید هویت HTTP

pass: string

رمز عبور برای احراز هویت HTTP.

از تنظیمات زیر در لینوکس برای استفاده از پروکسی HTTP در جلسه فعلی استفاده کنید.

  • صادرات http_proxy = HTTP: //127.0.0.1: 8080/ (URL است با توجه به پیکربندی خود را برای تغییر)
  • صادرات https_proxy =$http_proxy

================================================ FILE: fa/configuration/protocols/mtproto.html ================================================ MTProto · Project V

MTProto

  • نام: mtproto
  • نوع: ورودی / خروجی

پروکسی MTProto ویژه ویژه برای Telegram است. این شامل یک جفت پروکسی های ورودی و خروجی در V2Ray است. آنها معمولا برای ساخت یک پروکسی برای Telegram استفاده می شوند

در حال حاضر V2Ray تنها آدرس IPv4 سرور Telegram را پشتیبانی می کند.

InboundConfigurationObject

{
  "users": [{
    "email": "love@v2ray.com",
    "level": 0,
    "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
  }]
}

کاربر: \ [UserObject]

آرایه ای از کاربران. در حال حاضر فقط اولین کاربر موثر است.

UserObject

{
  "email": "love@v2ray.com",
  "level": 0,
  "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}

ایمیل: رشته

ایمیل کاربر مورد استفاده برای اهداف ردیابی دیدن آمار.

سطح: شماره

سطح کاربر

مخفی: رشته

مخفی کاربر در Telegram، رمزعبور باید 32 حرف طول داشته باشد و فقط شامل صفات بین 0 تا 9و Aتا فباشد.

شما می توانید از دستور زیر برای ایجاد مخفی MTProto استفاده کنید: openssl rand -hex 16

پیکربندی خروجی

{
}

نمونه

MTProto تنها می تواند برای ترافیک Telegram استفاده شود. شما ممکن است نیاز به یک قانون مسیریابی برای ترکیب ورودی و خروجی مربوطه داشته باشید. در اینجا یک نمونه ناقص است.

ورودی:

{
  "tag": "tg-in",
  "port": 443,
  "protocol": "mtproto",
  "settings": {
    "users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
  }
}

خروجی:

{
  "tag": "tg-out",
  "protocol": "mtproto",
  "settings": {}
}

مسیریابی:

{
  "type": "field",
  "inboundTag": ["tg-in"],
  "outboundTag": "tg-out"
}

برنامه Telegram خود را برای اتصال به port 443 در این دستگاه پیکربندی کنید.

================================================ FILE: fa/configuration/protocols/shadowsocks.html ================================================ Shadowsocks · Project V

Shadowsocks

  • Name: shadowsocks
  • نوع: ورودی / خروجی

Shadowsocks پروتکل، برای هر دو اتصالات ورودی و خروجی.

سازگاری با نسخه رسمی:

  • پشتیبانی از هر دو اتصال TCP و UDP، جایی که UDP می تواند اختیاری خاموش شود.
  • پشتیبانی می کند OTA؛
    • مشتری ممکن است انتخاب کند که روشن یا خاموش شود.
    • سرور ممکن است فعال، غیرفعال یا خودکار را انتخاب کند.
  • روش های رمزنگاری (AEAD رمزهای اضافه شده در V2Ray 3.0):
    • aes-256-cfb
    • aes-128-cfb
    • chacha20
    • chacha20-ietf
    • aes-256-gcm
    • aes-128-gcm
    • chacha20-poly1305 aka chacha20-ietf-poly1305
  • پلاگینها:
    • پشتیبانی obfs از طریق حالت مستقل.

InboundConfigurationObject

{
  "email": "love@v2ray.com",
  "method": "aes-128-cfb",
  "password": "password",
  "level": 0,
  "ota": true,
  "network": "tcp"
}

ایمیل: رشته

آدرس ایمیل. برای شناسایی کاربر استفاده می شود.

روش: رشته

ضروری. مراجعه کنید به روش رمزگذاری برای مقادیر موجود.

رمز عبور: رشته

ضروری. رمز عبور در پروتکل Shadowsocks. می تواند هر رشته باشد

سطح: شماره

سطح کاربر پیش فرض به 0. سیاست.

ota: true | غلط

آیا OTA مجبور است یا نه اگر true و اتصال ورودی OTA را فعال نکنند، V2Ray این اتصال را رد می کند. برعکس

اگر این فیلد مشخص نشده باشد، V2Ray خودکار تنظیمات OTA را از اتصالات ورودی تشخیص می دهد.

هنگامی که استفاده از رمزنگاری AEAD استفاده می شود ota تاثیری ندارد.

شبکه: "tcp" | "udp" | "tcp، udp"

نوع شبکه های پشتیبانی شده پیش فرض به "tcp".

OutboundConfigurationObject

{
  "servers": [
    {
      "email": "love@v2ray.com",
      "address": "127.0.0.1",
      "port": 1234,
      "method": "method",
      "password": "password",
      "ota": false,
      "level": 0
    }
  ]
}

جایی که:

  • ایمیل: آدرس ایمیل. برای شناسایی کاربر استفاده می شود.
  • آدرس: آدرس سرور Shadowsocks. می تواند IPv4، IPv6 یا دامنه باشد.
  • پورت: Port of Shadowsocks server.
  • روش: روش رمزگذاری مقدار پیش فرض ندارد گزینه ها عبارتند از:
    • "aes-256-cfb"
    • "aes-128-cfb"
    • "chacha20"
    • "chacha20-ietf"
    • "aes-256-gcm"
    • "aes-128-gcm"
    • "chacha20-poly1305" یا "chacha20-ietf-poly1305"
  • رمز عبور: رمز عبور. می تواند هر رشته باشد
  • ota: استفاده یا عدم استفاده از OTA.
    • وقتی AEAD استفاده می شود، ota تاثیری ندارد.
  • سطح: سطح کاربر.

سرور: \ [ServerObject]

آرایه ای از ServerObjectثانیه.

ServerObject

{
  "email": "love@v2ray.com",
  "address": "127.0.0.1",
  "port": 1234,
  "method": "加密方式",
  "password": "密码",
  "ota": false,
  "level": 0
}

ایمیل: رشته

آدرس ایمیل. برای شناسایی کاربر استفاده می شود.

آدرس: آدرس

ضروری. آدرس سرور Shadowsocks. ممکن است IPv4، IPv6 یا آدرس دامنه باشد.

پورت: شماره

ضروری. پورت سرور Shadowsocks.

روش: رشته

ضروری. مراجعه کنید به روش رمزگذاری برای مقادیر موجود.

رمز عبور: رشته

ضروری. رمز عبور در پروتکل Shadowsocks. می تواند هر رشته باشد

ota: true | نادرست

استفاده یا عدم استفاده از OTA مقدار پیش فرض است کاذب.

وقتی رمزگذاری AEAD استفاده می شود، این فیلد تاثیری ندارد.

سطح: شماره

سطح کاربر

روش های رمزگذاری

  • "aes-256-cfb"
  • "aes-128-cfb"
  • "chacha20"
  • "chacha20-ietf"
  • "aes-256-gcm"
  • "aes-128-gcm"
  • "chacha20-poly1305" یا "chacha20-ietf-poly1305"
================================================ FILE: fa/configuration/protocols/socks.html ================================================ SOCKS · Project V

Socks

  • نام: جوراب
  • نوع: ورودی / خروجی

جوراب اجرای یک پروتکل SOCKS استاندارد است، سازگار با Socks 4، Socks 4a و Socks 5.

Socks configuration consists of two parts, InboundConfigurationObject and OutboundConfigurationObject, for inbound and outbound respectively.

OutboundConfigurationObject

OutboundConfigurationObject is used as settings field in OutboundObject in top level configuration.

{
  "servers": [{
    "address": "127.0.0.1",
    "port": 1234,
    "users": [
      {
        "user": "test user",
        "pass": "test pass",
        "level": 0
      }
    ]
  }]
}

servers: [ ServerObject ]

An array of Socks servers.

ServerObject

{
  "address": "127.0.0.1",
  "port": 1234,
  "users": [
    {
      "user": "test user",
      "pass": "test pass",
      "level": 0
    }
  ]
}

address: address

Socks server address. May be IPv4, IPv6 or domain address.

Only support Socks 5 servers.

port: number

Socks server port.

users: [ UserObject ]

An array of users. Each element in the array is an user. If the list is not empty. Socks inbound will force user authentication. Otherwise, anonymous user is allowed.

UserObject

{
  "user": "test user",
  "pass": "test pass",
  "level": 0
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

level: number

User level for tracking and policy purpose. Default value is 0.

InboundConfigurationObject

{
  "auth": "noauth",
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "udp": false,
  "ip": "127.0.0.1",
  "userLevel": 0
}

auth: "noauth" | "password"

Socks autentication method. "noauth" is for anonymous authentication, and "password" for authentication with username and password. Default value is "noauth".

accounts: [ AccountObject ]

An array of user accounts, for authenication purpose. Only take effect when auth is set to "password".

udp: true | false

Whether or not to enable UDP. Default value is false.

ip: address

When UDP is enabled, V2Ray needs to know the IP address of current host. Default value is "127.0.0.1". This must be set to the public IP address of the host, if you want to allow public UDP traffic.

userLevel: number

User level. All incoming connections share this user level.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

================================================ FILE: fa/configuration/protocols/vmess.html ================================================ VMess · Project V

VMess

  • Name: shadowsocks
  • Type: Inbound / Outbound

VMess یک پروتکل برای ارتباطات رمز شده است. این شامل پروکسی ورودی و خروجی است.

VMess به زمان سیستم بستگی دارد. لطفا اطمینان حاصل کنید که زمان سیستم شما همگام با زمان UTC است. منطقه زمانی مهم نیست ممکن است یک سرویس ntp در لینوکس برای تنظیم زمان سیستم به طور خودکار نصب شود.

OutboundConfigurationObject

{
  "vnext": [
    {
      "address": "127.0.0.1",
      "port": 37192,
      "users": [
        {
          "id": "27848739-7e62-4138-9fd3-098a63964b6b",
          "alterId": 4,
          "security": "auto",
          "level": 0
        }
      ]
    }
  ]
}

vnext: \ [ ServerObject]

یک آرایه، که هر عنصر یک سرور از راه دور را ارائه می دهد

ServerObject

{
  "address": "127.0.0.1",
  "port": 37192,
  "users": []
}

آدرس: آدرس

آدرس سرور، ممکن است IPv4، IPv6 یا نام دامنه باشد.

پورت: شماره

پورت سرور

کاربر: \ [ UserObject]

آرایه ای که هر عنصر یک کاربر VMess است

UserObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "alterId": 16,
  "security": "auto",
  "level": 0
}

id: رشته

شناسه کاربر، به شکل یک UUID U .

alterId: شماره

Number of alternative IDs. The alternative IDs will be generated in a deterministic way. Default to 0. Maximum 65535. Recommend 4. Its value must be not larger than the one in corresponding Inbound.

سطح: شماره

سطح کاربر برای کسب اطلاعات بیشتر به سیاست مراجعه کنید.

امنیت: "aes-128-gcm" | "chacha20-poly1305" | "خودکار" | "هیچ یک"

روش رمزگذاری بار. این تنظیم فقط در خارج از دسترس است. ورودی VMess به طور خودکار این تنظیم را تشخیص داده و سپس مقدار رمزگشایی را رمزگشایی می کند. گزینه ها عبارتند از:

  • "aes-128-gcm": توصیه شده برای کامپیوتر.
  • "chacha20-poly1305": توصیه شده برای موبایل.
  • "auto": مقدار پیش فرض. استفاده از aes-128-gcm در AMD64، ARM64 و S390x یا chacha20-poly1305 در غیر این صورت.
  • "none": ترافیک در همه رمزگذاری نشده است.

از سازگاری بهتر برای استفاده از "خودکار" استفاده کنید.

InboundConfigurationObject

{
  "clients": [
    {
      "id": "27848739-7e62-4138-9fd3-098a63964b6b",
      "level": 0,
      "alterId": 4,
      "email": "love@v2ray.com"
    }
  ],
  "default": {
    "level": 0,
    "alterId": 4
  },
  "detour": {
    "to": "tag_to_detour"
  },
  "disableInsecureEncryption": false
}

مشتری: \ [ ClientObject]

یک آرایه برای حساب کاربری معتبر. ممکن است هنگام استفاده از ویژگی پورت پویا خالی باشد.

تور: DetourObject

ویژگی اختیاری برای نشان دادن مشتری برای دور زدن. اگر مشخص شود، این ورودی، خروجی را برای استفاده از ورودی دیگر هدایت می کند.

طور پیش فرض: DefaultObject

پیکربندی مشتری پیش فرض اختیاری معمولا با دور.

disableInsecureEncryption: true | نادرست

مشتری را برای استفاده از روش های رمزنگاری ناامن ممنوع می کند. هنگامی که به true، اتصالات بلافاصله فسخ خواهند شد اگر رمزگذاری زیر استفاده شود. مقدار پیش فرض false.

  • هیچ یک
  • aes-128-cfb

ClientObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "level": 0,
  "alterId": 4,
  "email": "love@v2ray.com"
}

id: رشته

شناسه کاربر، به شکل UUID.

سطح: شماره

سطح کاربر برای استفاده از آن سیاست ببینید.

alterId: شماره

تعداد شناسه های جایگزین همانطور که در خارج از کشور است.

ایمیل: رشته

آدرس ایمیل برای شناسایی کاربر

DetourObject

{
  "to": "tag_to_detour"
}

تا: رشته

برچسب یک پروکسی ورودی مشاهده بررسی. در صورت پیکربندی، VMess مشتری خود را پیشنهاد می دهد که از اتصال برای ارتباطات بیشتر استفاده کند.

DefaultObject

{
  "level": 0,
  "alterId": 4
}

سطح: شماره

سطح کاربر

alterId: شماره

Number of alternative IDs. Default value 64. Recommend 4.

================================================ FILE: fa/configuration/protocols.html ================================================ پروتکل ها · Project V

پروتکل ها

V2Ray از پروتکل های زیر پشتیبانی می کند. هر پروتکل ممکن است یک پروتکل ورودی یا یک پروتکل خروجی یا هر دو باشد.

================================================ FILE: fa/configuration/reverse.html ================================================ معکوس · Project V

معکوس پروکسی

معکوس پروکسی یک ویژگی اختیاری در V2Ray است. این ترافیک را از یک سرور به یک مشتری منتقل می کند. بنابراین پروکسی معکوس معکوس است.

معکوس پروکسی در V2Ray 4.0+ در دسترس است. این در حال حاضر در بتا است و ممکن است در آینده نزدیک بهبود یابد.

معکوس پروکسی به روش زیر عمل می کند:

  • فرض کنید یک دستگاه A است که یک سرور وب را اجرا می کند. دستگاه A هیچ آدرس IP عمومی ندارد و نمی تواند از طریق اینترنت دسترسی پیدا کند. یک دستگاه دیگر B وجود دارد، می گوید یک سرور ابر، که می تواند از اینترنت دسترسی داشته باشد. ما نیاز به استفاده از B به عنوان پورتال، جهت هدایت تراکنش به A
  • حالا ما V2Ray را بر روی دستگاه A نصب می کنیم که پل. و سپس V2Ray را بر روی دستگاه B نصب کنید، به نام پورت.
  • پل اتصال به پورتالرا باز می کند. هدف خود را می توان برای مقصد مسیریابی سفارشی. پورتال ، این اتصالات، و همچنین اتصالات از دیگر کاربردهای اینترنتی را دریافت خواهد کرد. پورتال این دو نوع اتصالات را "اتصال" می کند. سپس ترافیک داخلی به پلتونل می شود.
  • پس از پل ترافیک از اینترنت را از طریق پورتدریافت می کند، این ترافیک را به سرور وب در localhost ارسال می کند. شما همچنین می توانید مسیریابی را برای این ترافیک نیز پیکربندی کنید.
  • پل توازن بار را براساس میزان ترافیک کنترل می کند.

معکوس پروکسی در حال حاضر قدرت Mux. لازم نیست دوباره Mux را روی خروجی آن پیکربندی کنید.

ReverseObject

ReverseObject به عنوان معکوس فیلد در پیکربندی سطح بالا استفاده می شود.

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }],
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"
  }]
}

پل: \ [BridgeObject]

آرایه ای از پلثانیه. هر پل است BridgeObject.

پورتال: \ [PortalObject]

آرایه ای از پورتالثانیه. هر پورتال است PortalObject.

BridgeObject

{
  "tag": "bridge",
  "domain": "test.v2ray.com"
}

برچسب: رشته

تگ تمام ترافیک آغاز شده توسط این پل این برچسب را دارند. این می تواند برای مسیر ، که به عنوان inboundTag.

دامنه: رشته

دامنه تمام اتصالات آغاز شده توسط پل به سمت پورتال از این دامنه به عنوان هدف استفاده می کنند. این دامنه فقط برای ارتباط بین پل و پورتال. لازم نیست در واقع ثبت نام شود.

PortalObject

برچسب: رشته

یک برچسب شما نیاز به تغییر مسیر تمام ترافیک به این پورتال، با هدف قرار دادن outboundTag این تگ. ترافیک شامل اتصالات از پلو همچنین ترافیک اینترنتی است.

دامنه: رشته

دامنه هنگامی که یک ارتباط با هدف قرار دادن این دامنه، پورتال ، این ارتباط از پل، در غیر این صورت اتصال به اینترنت است.

مانند دیگر کاربرد، یک نمونه V2Ray می تواند به عنوان استفاده پل، و یا یک پورتال، یا هر دو به عنوان همان زمان.

پیکربندی مثال

پل معمولا نیاز به دو خروجی دارد. یکی برای اتصال پورتالو دیگری برای اتصال سرور محلی محلی.

معکوس:

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }]
}

خروجی:

{
  "tag": "out"
  "protocol": "freedom",
  "settings": {
    "redirect": "127.0.0.1:80" // Send traffic to local web server
  }
},
{
  "protocol": "vmess",
  "settings": {
    "vnext": [{
      "address": "portal的IP地址",
      "port": 1024,
      "users": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
    }]
  },
  "tag": "interconn"
}

مسیریابی:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["bridge"],
    "domain": ["full:test.v2ray.com"],
    "outboundTag": "interconn"
  },{
    "type": "field",
    "inboundTag": ["bridge"],
    "outboundTag": "out"
  }]
}

پورتال معمولا نیاز به دو inbounds دارد. یکی برای اتصالات از پلو دیگری برای اتصال به اینترنت.

معکوس:

{
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"  // Must be the same as in bridge
  }]
}

Inbound:

{
  "tag": "external",
  "port": 80,  // Open port 80 for internet HTTP traffic
  "protocol": "dokodemo-door",
  "settings": {
    "address": "127.0.0.1",
    "port": 80,
    "network": "tcp"
  }
},
{
  "port": 1024, // For bridge connections
  "tag": "interconn",
  "protocol": "vmess",
  "settings": {
    "clients": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
  }
}

Routing:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["external"],
    "outboundTag": "portal"
  },{
    "type": "field",
    "inboundTag": ["interconn"],
    "outboundTag": "portal"
  }]
}

در عمل، شما ممکن است بخواهید اول پل و سپس پورت.

================================================ FILE: fa/configuration/routing.html ================================================ مسیریابی · Project V

مسیریابی

V2Ray دارای مکانیزم مسیریابی داخلی است. این ارتباطات ورودی به خروجی های مختلف را براساس قوانین انجام می دهد. یک سناریو معمول این است که تقسیم ترافیک به وسیله کشور انجام شود. V2Ray می تواند کشور مقصد (توسط Geo IP) یک اتصال را شناسایی کند و سپس اتصال به پروکسی خروجی مربوطه را ارسال کند.

RoutingObject

RoutingObject به عنوان مسیریابی در پیکربندی سطح بالا استفاده می شود.

{
  "domainStrategy": "AsIs",
  "rules": [],
  "balancers": []
}

domainStrategy: "AsIs" | "IPIfNonMatch" | "IPOnDemand"

استراتژی قطعنامه دامنه انتخاب ها عبارتند از:

  • "AsIs": فقط از دامنه برای مسیریابی استفاده کنید. مقدار پیش فرض.
  • "IPIfNonMatch": زمانی که هیچ قاعده ای با دامنه فعلی منطبق نیست، V2Ray آن را به آدرس های IP (A یا AAAA) رفع می کند و دوباره تمام قوانین را امتحان می کند.
    • اگر یک دامنه دارای چندین آدرس IP باشد، V2Ray تمام آنها را انجام می دهد.
    • IP های حل شده تنها برای تصمیم گیری مسیریابی استفاده می شوند، ترافیک هنوز به آدرس دامنه اصلی ارسال می شود.
  • "IPOnDemand": تا زمانی که یک قانون مبتنی بر IP وجود دارد، V2Ray بلافاصله دامنه را به IP حل خواهد کرد.

قوانین: \ [RuleObject]

An array of rules. For each inbound connection, V2Ray tries these rules from top down one by one. If a rule takes effect, the connection will be routed to the outboundTag (or balancerTag, V2Ray 4.4+) of the rule.

balancers: [ BalancerObject ]

(V2Ray 4.4+) An array of load balancers. When a routing rule points to a load balancer, the balancer will select an outbound based on configuration. Then traffic will be sent to that outbound.

RuleObject

{
  "type": "field",
  "domain": [
    "baidu.com",
    "qq.com",
    "geosite:cn"
  ],
  "ip": [
    "0.0.0.0/8",
    "10.0.0.0/8",
    "fc00::/7",
    "fe80::/10",
    "geoip:cn"
  ],
  "port": "53,443,1000-2000",
  "network": "tcp",
  "source": [
    "10.0.0.1"
  ],
  "user": [
    "love@v2ray.com"
  ],
  "inboundTag": [
    "tag-vmess"
  ],
  "protocol":["http", "tls", "bittorrent"],
  "attrs": "attrs[':method'] == 'GET'",
  "outboundTag": "direct",
  "balancerTag": "balancer"
}

When multiple fields are specified, these fields have to be all satisfied, in order to make the rule effective. If you need both domain and ip rules, it is highly likely you need put them into separate rules.

type: "field"

The only valid value for now is "field".

domain: [ string ]

An array of domains. Available formats are:

  • متن ساده: اگر این رشته با هر بخش از دامنه هدفمندی منطبق باشد، این قانون به عهده می گیرد. مثال: rule "sina.com" مطابقت دامنه "sina.com"، "sina.com.cn" و "www.sina.com"، اما نه "sina.cn".
  • عبارت منظم: شروع با "regexp:"، بقیه یک عبارت منظم است. هنگامی که Regexp با هدف دامنه مطابقت می کند، این قانون به اجرا در می آید. مثال: rule "regexp: \\. goo. * \\. com $" برابر "www.google.com" و "fonts.googleapis.com"، اما نه "google.com".
  • Subdomain (توصیه می شود): شروع با "domain:" و بقیه یک دامنه است. هنگامی که دامنه هدفمند دقیقا همان مقدار است یا یک زیر دامنه از مقدار است، این قانون در حال اجرا است. مثال: قانون "دامنه: v2ray.com" مسابقه "www.v2ray.com"، "v2ray.com"، اما نه "xv2ray.com".
  • دامنه کامل: شروع با "full:" و بقیه یک دامنه است. هنگامی که دامنه هدفمند دقیقا همان ارزش است، این قانون اثر می گذارد. مثال: قانون "دامنه: v2ray.com" مطابق با "v2ray.com"، اما نه "www.v2ray.com".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.
  • Domains from file: Such as "ext:file:tag". The value must begin with ext: (lowercase), and followed by filename and tag. The file is placed in resource directory, and has the same format of geosite.dat. The tag must exist in the file.

ip: [string]

An array of IP ranges. When the targeting IP is in one of the ranges, this rule takes effect. Available formats:

  • IP: مانند "127.0.0.1".
  • CIDR: مانند "127.0.0.0/8".
  • GeoIP: مانند "geoip: cn". با شروع می شود geoip: (حروف کوچک) و دو حرف از کد کشور را دنبال می کند.
    • مقدار ویژه "geoip: خصوصی": برای تمام آدرس های خصوصی مانند 127.0.0.1.
  • IP ها از فایل: مانند "ext: file: tag". مقدار باید با ext: (کوچک) شروع شود و با نام فایل و تگ همراه است. فایل در قرار داده شده دایرکتوری منبع، و همان فرمت از geoip.dat. برچسب باید در فایل موجود باشد.

"ext:geoip.dat:cn" is equivalent to "geoip:cn".

port:number | string

Port range. Formats are:

  • "a-b": Both a and b are positive integers and less than 65536. When the targeting port is in [a, b), this rule takes effect.
  • a: a is a positive integer, and less than 65536. When the targeting port is a, this rule takes effect.
  • Mix of the two above, separated by ",". Such as "53,443,1000-2000".

network: "tcp" | "udp" | "tcp,udp"

When the connection has in the chosen network, this rule take effect.

source: [string]

An array of IP ranges. Same format as ip. When the source IP of the connection is in the IP range, this rule takes effect.

user: [string]

An array of email address. When the inbound connection uses an user account of the email address, this rule takes effect. For now Shadowsocks and VMess support user with email.

inboundTag: [string]

An array of string as inbound proxy tags. When the connection comes from one of the specified inbound proxy, this rule takes effect.

protocol: [ "http" | "tls" | "bittorrent" ]

An array of string as protocol types. When the connection uses one of the protocols, this rule takes effect. To recognize the protocol of a connection, one must enable sniffing option in inbound proxy.

attrs: string

(V2Ray 4.18+) A Starlark script, used for detecting traffic attributes. When this script returns true, this rule takes effect.

Starlark is a subset of Python. The script takes a global varible named attrs. It contains all attributes of the traffic.

At the moment, only http inbound sets attrs.

Examples:

  • Detect HTTP GET: "attrs[':method'] == 'GET'"
  • Detect HTTP Path: "attrs[':path'].startswith('/test')"
  • Detect Content Type: "attrs['accept'].index('text/html') >= 0"

outboundTag string

Tag of the outbound that the connection will be sent to, if this rule take effect.

balancerTag: string

Tag of an load balancer. Then this rule takes effect, V2Ray will use the balancer to select an outbound. Either outboundTag or balancerTag must be specified. When both are specified, outboundTag takes priority.

BalancerObject

Configuration for a load balancer. When a load balancer takes effective, it selects one outbound from matching outbounds. This outbound will be used for send out-going traffic.

{
  "tag": "balancer",
  "selector": []
}

tag: string

Tag of this BalancerObject, to be matched from balancerTag in RuleObject.

selector: [ string ]

An array of strings. These strings are used to select outbounds with prefix matching. For example, with the following outbound tags: [ "a", "ab", "c", "ba" ],selector ["a"] matches [ "a", "ab" ].

When multiple outbounds are selected, load balancer for now picks one final outbound at random.

Pre-defined domain lists

This is a domain lists maintained by domain-list-community project. It provides a file named geosite.dat for some predefined domain lists. Notably:

  • category-ads: Common ads domains.
  • category-ads-all: Common ads domains and ads providers' domains.
  • cn: Equivalent to an union of geolocation-cn and tld-cn.
  • google: All Google domains.
  • facebook: All Facebook domains.
  • geolocation-cn: Common domains that serve in China.
  • geolocation-!cn: Common domains that don't serve in China
  • speedtest: All domains used by Speedtest.
  • tld-cn: All .cn and .中国 domains.
================================================ FILE: fa/configuration/stats.html ================================================ آمار · Project V

آمار

V2Ray برخی از اطلاعات مربوط به درون آن را فراهم می کند.

StatsObject

StatsObject به عنوان آمار فیلد در پیکربندی سطح بالا استفاده می شود.

{
}

در حال حاضر هیچ پارامتری در تنظیمات آمار وجود ندارد. آمار در صورت فعال بودن StatsObject در پیکربندی سطح بالا فعال می شود. شما همچنین باید تنظیمات متناظر را در خط مشیفعال کنید تا بتوانید از کاربر یا آمار سیستم پیگیری کنید.

کلیه آمار شمارنده در زیر ذکر شده است:

ترافیک کاربر

اگر کاربر آدرس ایمیل را در تنظیمات پروتکل تنظیم نکند، آمار ترافیک فعال نخواهد شد.

کاربر>>>[email]>>>ترافیک>>>uplink

ترافیک uplink مرتبط با کاربر خاص در بایت.

کاربر>>>[email]>>>ترافیک>>>downlink

ترافیک downlink پیوسته از کاربر خاص، در بایت.

ترافیک جهانی

ورودی>>>[tag]>>>ترافیک>>>uplink

ترافیک uplink متصل شده از ورودی خاص، در بایت.

ورودی>>>[tag]>>>ترافیک>>>downlink

ترافیک downlink پیوسته از ورودی خاص، در بایت.

================================================ FILE: fa/configuration/transport/domainsocket.html ================================================ DomainSocket · Project V

سوکت دامنه حمل و نقل

سوکت دامنه از سوکت دامنه یونیکس استاندارد برای انتقال اطلاعات استفاده می کند. سوکت دامنه کانال tranfer سیستم تعاملی است. این بافر شبکه را مسدود نمیکند و ممکن است کمی سریعتر از ترافون کردن از طریق شبکه loopback محلی باشد.

سوکت دامنه تنها می تواند در سیستم عامل هایی که سوکت دامنه یونیکس را پشتیبانی می کنند، مانند macOS و لینوکس استفاده شود. این در ویندوز موجود نیست

هنگام استفاده از سوکت دامنه، IP و پورت مشخص شده در پروکسی ورودی / خروجی نادیده گرفته خواهند شد. تمام ترافیک از طریق سوکت دامنه تونل شده است.

DomainSocketObject

DomainSocketObject در dsSettings فیلد در TransportObject و StreamSettingsObject.

{
  "path": "/path/to/ds/file"
}

مسیر: رشته

یک مسیر فایل کامل معتبر قبل از اجرای V2Ray، فایل در این مسیر نباید وجود داشته باشد.

================================================ FILE: fa/configuration/transport/h2.html ================================================ HTTP/2 · Project V

HTTP / 2 حمل و نقل

حمل و نقل HTTP / 2 در V2Ray 3.17 اضافه شده است. این بر اساس استاندارد HTTP / 2 است و می تواند از طریق دیگر سرور HTTP، مانند Nginx، پروکسی باشد.

با توجه به recommandation HTTP / 2، ورودی و خروجی های پاسخ دهنده باید TLS را برای استفاده از این حمل و نقل فعال کنند.

HttpObject

DomainSocketObject در فیلد httpSettings در TransportObject و StreamSettingsObject.

{
  "host": ["v2ray.com"],
  "path": "/random/path"
}

میزبان: \ [رشته ]

یک آرایه رشته ای هر عنصر یک دامنه است. مشتری برای هر درخواست یک دامنه را به طور تصادفی می برد. سرور بررسی می کند که آیا دامنه در درخواست ورودی در لیست است.

مسیر: رشته

مسیر HTTP مشتری و سرور باید همان مقدار داشته باشند.

================================================ FILE: fa/configuration/transport/mkcp.html ================================================ mKCP · Project V

mKCP حمل و نقل

mKCP حمل و نقل قابل اعتماد است. این یک پروتکل UDP است. mKCP ترافیک بیشتری برای زمان تاخیر پایین می فرستد. برای انتقال همان مقدار داده ها، mKCP معمولا نیاز به توان بیشتر از TCP دارد.

KcpObject

{
  "mtu": 1350,
  "tti": 20,
  "uplinkCapacity": 5,
  "downlinkCapacity": 20,
  "congestion": false,
  "readBufferSize": 1,
  "writeBufferSize": 1,
  "header": {
    "type": "none"
  }
}

mtu: شماره

واحد انتقال حداکثر این نشان می دهد که بایت تعداد حداکثر که یک بسته UDP می تواند حمل کند. مقدار توصیه شده بین 576 و 1460. مقدار پیش فرض 1350.

tti: شماره

فاصله زمانی انتقال، در میلی ثانیه. mKCP داده ها را در این فاصله ارسال می کند. مقدار توصیه شده بین 10 و 100. مقدار پیش فرض 50.

uplinkCapacity: number

پهنای باند بالا، در MB / ثانیه. حداکثر پهنای باند برای نمونه V2Ray برای بارگذاری داده ها به یک از راه دور. مقدار پیش فرض 5. لطفا توجه داشته باشید که این بایت (در MB / s) است نه کمی. ممکن است ارزش استفاده کنید 0 برای پهنای باند کوچک است.

downlinkCapacity: number

پهنای باند Downlink، در MB / s. حداکثر پهنای باند برای نمونه V2Ray برای دانلود داده ها. مقدار پیش فرض 20. لطفا توجه داشته باشید که این بایت (در MB / s) است نه کمی. ممکن است ارزش استفاده کنید 0 برای پهنای باند کوچک است.

uplinkCapacity و downlinkCapacity سرعت mKCP را تعیین می کند. در سمت مشتری، uplinkCapacity سرعت برای ارسال مشتری به سرور را مشخص می کند. در سمت راست، downlinkCapacity سرعت سرور دریافت اطلاعات را مشخص می کند. حداقل این جفت در یک اتصال واقعی موثر است.

تراکم: واقعی | نادرست

این که آیا کنترل احتمالی را فعال کنید یا نه. مقدار پیش فرض است کاذب. وقتی کنترل احتمالی فعال می شود، V2Ray کیفیت شبکه را تشخیص می دهد. بسته های کمتری هنگام ارسال بسته های سخت افزاری ارسال می شوند، و یا داده های بیشتر هنگامی که شبکه به طور کامل پر نمی شود.

readBufferSize: شماره

اندازه حافظه برای یک اتصال فقط در MB خوانده شده است. مقدار پیش فرض 2.

writeBufferSize: number

اندازه حافظه برای یک اتصال واحد را در MB بنویسید. مقدار پیش فرض 2.

header: HeaderObject

پیکربندی برای سوء استفاده از هدر بسته.

HeaderObject

{
  "نوع": "هیچ"
}

نوع: رشته

نوع مبهم بودن پروکسی ورودی و خروجی باید تنظیمات مشابه داشته باشد. انتخاب ها عبارتند از:

  • "none": مقدار پیش فرض. بدون سوء استفاده مورد استفاده قرار می گیرد.
  • "srtp": به عنوان ترافیک SRTP تسخیر شده است. ممکن است به عنوان تماس های ویدئویی مانند Facetime شناخته شود.
  • "utp": Obfuscated به عنوان ترافیک uTP. ممکن است به عنوان ترافیک Bittorrent شناخته شود.
  • "wechat-video": مسدود شده به ترافیک WeChat.
  • "dtls": به عنوان DTLS 1.2 بسته شده است.
  • "wireguard": Obfuscated به عنوان WireGuard بسته. (پروتکل WireGuard درست نیست)

وام

  • @ skywind3000 پروتکل اصلی KCP را اختراع کرد و در C اجرا شد
  • @ xtaci دوباره پیاده سازی پروتکل KCP در برو.
  • @ xiaokangwang یکپارچه KCP را به V2Ray.
================================================ FILE: fa/configuration/transport/quic.html ================================================ QUIC · Project V

QUIC

QUIC, or Quick UDP Internet Connection, is a multiplexing transport based on UDP, initially designed, implemented, and deployed by Google.

QUIC has the following advantages:

  1. Reduced number of roundtrips in handshake phase. (1-RTT or 0-RTT)
  2. Multiplexing without head of line blocking as in TCP
  3. Connection migration, especially for clients. For example, connections don't break when device moves from Wi-Fi to 4G.

QUIC is now an experiment in V2Ray. It implements IETF specification. As the spec is still being standardized, compatibility can't be guaranteed.

Update History

V2Ray 4.7:

  • Initial version to support QUIC.
  • Default settings:
    • 12 byte Connection ID
    • Connection timeout in 30 seconds if no data traffic. (May have impact on some long HTTP connections)

QuicObject

QUIC is used as quicSettings in transport settings. The configuration must be exactly the same between connecting peers.

QUIC requires TLS. If TLS is not enabled in transport settings, V2Ray will automatically issue a TLS certificate for it. When QUIC transport is used, encryption in VMess can be turned off.

{
  "security": "none",
  "key": "",
  "header": {
    "type": "none"
  }
}

security: "none" | "aes-128-gcm" | "chacha20-poly1305"

Extra encryption over entire QUIC packet, include the frame head part. Default value is "none" for no encryption. After being encrypted, QUIC packets can't be sniff'ed.

key: string

Key for the encryption above. Can be any string. Only effective when security is not "none".

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

type: string

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "none": Default value. No obfuscation is used.
  • "srtp": Obfuscated as SRTP traffic. It may be recognized as video calls such as Facetime.
  • "utp": Obfuscated as uTP traffic. It may be recognized as Bittorrent traffic.
  • "wechat-video": Obfuscated to WeChat traffic.
  • "dtls": Obfuscated as DTLS 1.2 packets.
  • "wireguard": Obfuscated as WireGuard packets. (NOT true WireGuard protocol)

When neither encryption nor obfuscation is enabled, QUIC transport is compatible with other QUIC tools. However it is recommended to enable either or both for better undetectable communication.

================================================ FILE: fa/configuration/transport/tcp.html ================================================ TCP · Project V

TCP حمل و نقل

TcpObject

{
  "header": {
    "type": "none"
  }
}

header: NoneHeaderObject | HttpHeaderobject

Header obfuscation. Default value is NoneHeaderObject.

NoneHeaderObject

No header obfuscation.

{
  "type": "none"
}

type: "none"

Disable header obfuscation.

HttpHeaderObject

HTTP header obfuscation. The configuration must be the same between connecting inbound and outbound.

{
  "type": "http",
  "request": {},
  "response": {}
}

type: "http"

Enable HTTP header obfuscation.

request: HTTPRequestObject

HTTP request template.

response: HTTPResponseObject

HTTP response template.

HTTPRequestObject

{
  "version": "1.1",
  "method": "GET",
  "path": ["/"],
  "headers": {
    "Host": ["www.baidu.com", "www.bing.com"],
    "User-Agent": [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
    ],
    "Accept-Encoding": ["gzip, deflate"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

method: string

HTTP method. Default value is "GET"

path: [ string ]

HTTP path. An array is string. The path will be chosen randomly for every connection.

headers: map{string, [ string ] }

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

HTTPResponseObject

{
  "version": "1.1",
  "status": "200",
  "reason": "OK",
  "headers": {
    "Content-Type": ["application/octet-stream", "video/mpeg"],
    "Transfer-Encoding": ["chunked"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

status: string

HTTP status. Default value is "200"

reason: string

HTTP status message. Default value is "OK".

headers: map{string, string}

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

================================================ FILE: fa/configuration/transport/websocket.html ================================================ WebSocket · Project V

وبسایت

از WebSocket استاندارد برای انتقال اطلاعات استفاده کنید. اتصالات Websocket می تواند توسط HTTP سرور مانند Nginx پروکسی.

WebSocketObject

WebSocketObject به عنوان wsSettings در TransportObject یا StreamSettingsObject.

Websocket HTTP header X-Forwarded-For را شناسایی می کند و از آن به عنوان آدرس منبع ورودی استفاده می کند.

{
  "مسیر": "/"،
  "هدر": {
    "میزبان": "v2ray.com"
  }
}

مسیر: رشته

مسیر مورد استفاده برای WebSocket. پیش فرض برای ریشه، به عنوان "/".

هدر: نقشه{string, string}

هدر سفارشی HTTP آرایه ای که هر ورودی یک جفت ارزش کلیدی در رشته است، برای هدر و مقدار در هدر HTTP. پیش فرض خالی است

================================================ FILE: fa/configuration/transport.html ================================================ حمل و نقل · Project V

تنظیمات حمل و نقل

حمل و نقل این است که چگونه V2Ray ارسال و دریافت داده ها از همتایان خود را. The responsibility of a transport is to reliably transfer data to a peer. معمولا یک ارتباط با ترانسپورت در هر دو نقطه انتهایی دارد. به عنوان مثال، اگر یک خروجی V2Ray با استفاده از WebSocket به عنوان حمل و نقل آن، ورودی آن صحبت می کند، همچنین باید از WebSocket استفاده کند، در غیر این صورت یک اتصال نمی تواند برقرار شود.

تنظیمات حمل و نقل به دو قسمت تقسیم می شود: تنظیمات جهانی و تنظیمات پراکسی. تنظیمات هر پروکسی مشخص می کند که چگونه هر یک از پروکسی ها اطلاعات خود را مدیریت می کند، در حالی که تنظیمات جهانی برای همه پروکسی ها است. معمولا پروکسی های ورودی و خروجی بین همتراز اتصال باید تنظیمات حمل و نقل مشابه داشته باشند. هنگامی که یک پروکسی هیچ تنظیمات حمل و نقل ندارد، تنظیمات جهانی اعمال می شود.

TransportObject

TransportObject به عنوان انتقال فیلد در پیکربندی سطح بالا استفاده می شود.

{
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {}
}

tcpSettings: TcpObject

تنظیمات TCP transport.

kcpSettings: KcpObject

تنظیمات حمل و نقل mKCP.

wsSettings: WebSocketObject

تنظیمات برای حمل و نقل WebSocket.

httpSettings: HttpObject

تنظیمات HTTP / 2 حمل و نقل.

dsSettings: DomainSocketObject

تنظیمات برای Domain Socket Transport.

quicSettings: QUICObject

(V2Ray 4.7+) Settings for QUIC transport.

StreamSettingsObject

Each inbound and outbound proxy may has its own transport settings, as specified in streamSettings field in top level configuration.

{
  "network": "tcp",
  "security": "none",
  "tlsSettings": {},
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {},
  "sockopt": {
    "mark": 0,
    "tcpFastOpen": false,
    "tproxy": "off"
  }
}

network: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"

Network type of the stream transport. Default value "tcp".

security: "none" | "tls"

Type of security. Choices are "none" (default) for no extra security, or "tls" for using TLS.

tlsSettings: TLSObject

TLS settings. TLS is provided by Golang. Support up to TLS 1.2. DTLS is not supported.

tcpSettings: TcpObject

TCP transport configuration for current proxy. Effective only when the proxy uses TCP transport. Configuration is the same as it is in global configuration.

kcpSettings: KcpObject

mKCP transport configuration for current proxy. Effective only when the proxy uses mKCP transport. Configuration is the same as it is in global configuration.

wsSettings: WebSocketObject

WebSocket transport configuration for current proxy. Effective only when the proxy uses WebSocket transport. Configuration is the same as it is in global configuration.

httpSettings: HttpObject

HTTP/2 transport configuration for current proxy. Effective only when the proxy uses HTTP/2 transport. Configuration is the same as it is in global configuration.

dsSettings: DomainSocketObject

Domain socket transport configuration for current proxy. Effective only when the proxy uses domain socket transport. Configuration is the same as it is in global configuration.

quicSettings: QUICObject

(V2Ray 4.7+) QUIC transport configuration for current proxy. Effective only when the proxy uses QUIC transport. Configuration is the same as it is in global configuration.

sockopt: SockoptObject

Socket options for incoming and out-going connections.

TLSObject

{
  "serverName": "v2ray.com",
  "allowInsecure": false,
  "alpn": ["http/1.1"],
  "certificates": [],
  "disableSystemRoot": false
}

serverName: string

Server name (usually domain) used for TLS authentication. Typically this is used when corressponding inbound/outbound uses IP for communication.

When domain name is specified from inbound proxy, or get sniffed from the connection, it will be automatically used for connection. It is not necessary to set serverName in such case.

alpn: [ string ]

An array of strings, to specifiy the ALPN value in TLS handshake. Default value is ["http/1.1"].

allowInsecure: true | false

If true, V2Ray allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.

allowInsecureCiphers: true | false

Whehter or not to allow insecure cipher suites. By default TLS only uses cipher suites from TLS 1.3 spec. Turn on this option to allow cipher suites with static RSA keys.

disableSystemRoot: true | false

(V2Ray 4.18+) Whether or not to disable system root CAs for TLS handshake. Default value is false. If set to true, V2Ray will use only certificates for TLS handshake.

certificates: [ CertificateObject ]

List of TLS certificates. Each entry is one certificate.

CertificateObject

{
  "usage": "encipherment",

  "certificateFile": "/path/to/certificate.crt",
  "keyFile": "/path/to/key.key",

  "certificate": [
    "-----BEGIN CERTIFICATE-----",
    "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
    "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
    "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
    "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
    "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
    "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
    "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
    "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
    "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
    "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
    "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
    "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
    "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
    "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
    "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
    "-----END CERTIFICATE-----"
  ],
  "key": [
    "-----BEGIN RSA PRIVATE KEY-----",
    "MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
    "bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
    "GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
    "jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
    "itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
    "IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
    "qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
    "C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
    "/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
    "aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
    "/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
    "bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
    "8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
    "pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
    "L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
    "3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
    "az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
    "gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
    "TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
    "eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
    "64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
    "8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
    "GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
    "ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
    "cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
    "-----END RSA PRIVATE KEY-----"
  ]
}

usage: "encipherment" | "verify" | "issue"

Purpose of the certificate. Default value "encipherment". Choices are:

  • "رمزگذاری": گواهی برای احراز هویت و رمزگذاری TLS استفاده می شود.
  • "verify": گواهی برای اعتبار سنجی گواهی TLS از همکار راه دور استفاده می شود. در این مورد گواهی باید یک گواهینامه CA باشد.
  • "issue": گواهی برای صدور گواهی های دیگر استفاده می شود. در این مورد گواهی باید یک گواهینامه CA باشد.

On Windows, you have to install your CA certificate to system, in order to verify cerificates issued from the CA.

When there is a new client request, say for serverName = "v2ray.com", V2Ray will find a certificate for "v2ray.com" first. If not found, V2Ray will try to issue a new certificate using any existing certificate whose usage is "issue" for "v2ray.com". The new certificate expires in one hour, and will be added to certificate pool for later reuse.

certificateFile: string

File path to the certificate. If the certificate is generated by OpenSSL, the path ends with ".crt".

Use v2ctl cert -ca command to generate a new CA certificate.

certificate: [ string ]

List of strings as content of the certificate. See the example above. Either certificate or certificateFile must not be empty.

keyFile: string

File path to the private key. If generated by OpenSSL, the file usually ends with ".key". Key file with password is not supported.

key: [ string ]

List of strings as content of the private key. See the example above. Either key or keyFile must not be empty.

When certificateFile and certificate are both filled in. V2Ray uses certificateFile. Same for keyFile and key.

When usage is "verify", both keyFile and key can be empty.

SockoptObject

{
  "mark": 0,
  "tcpFastOpen": false,
  "tproxy": "off"
}

mark: number

An integer. If non-zero, the value will be set to out-going connections via socket option SO_MARK. This mechanism only applies on Linux and requires CAP_NET_ADMIN permission.

tcpFastOpen: true | false

Whether or not to enable TCP Fast Open. When set to true, V2Ray enables TFO for current connection. When set to false, V2Ray disables TFO. If this entry doesn't exist, V2Ray uses default settings from operating system.

  • فقط در سیستم عامل های زیر اعمال می شود:
    • ویندوز 10 (1604) یا بعدا
    • سیستم عامل مک 10.11 / iOS 9 یا بالاتر
    • لینوکس 3.16 یا بالاتر: به طور پیش فرض توسط سیستم فعال شده است.
  • قابل اجرا برای اتصالات ورودی و خروجی.

tproxy: "redirect" | "tproxy" | "off"

Whether or not to enable transparent proxy on Linux. Choices are:

  • "خاموش": مقدار پیش فرض. TProxy را فعال نکنید.
  • "redirect": فعال کردن TProxy با حالت Redirect پشتیبانی از ترافیک TCP / IPv4 و UDP.
  • "tproxy": TProxy را با حالت TProxy فعال کنید. پشتیبانی از ترافیک TCP و UDP.

Transparent proxy requires Root or CAP_NET_ADMIN permission.

If TProxy is not set, and allowRedirect is set in dokodemo-door, the value of TProxy will be set to "redirect" automatically.

================================================ FILE: fa/developer/tools.html ================================================ Tools · Project V

Tools

Third Party SDK

Automation

V2Ray uses the following automation tools for build and releases.

================================================ FILE: fa/gitbook/gitbook-plugin-anchors/plugin.css ================================================ a.plugin-anchor { color: inherit !important; display: none; margin-left: -30px; padding-left: 40px; cursor: pointer; position: absolute; top: 0; left: 0; bottom: 0; } a.plugin-anchor i { margin-left: -30px; font-size: 15px !important; } h1, h2, h3, h4, h5, h6 { position: relative; } h1:hover a.plugin-anchor, h2:hover a.plugin-anchor, h3:hover a.plugin-anchor, h4:hover a.plugin-anchor, h5:hover a.plugin-anchor, h6:hover a.plugin-anchor { display: inline-block; } .book .book-body .page-wrapper .page-inner section.normal { overflow: visible; } ================================================ FILE: fa/gitbook/gitbook-plugin-ga/plugin.js ================================================ require(["gitbook"], function(gitbook) { // Load analytics.js gitbook.events.bind("start", function(e, config) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); var cfg = config.ga; ga('create', cfg.token, cfg.configuration); }); // Notify pageview gitbook.events.bind("page.change", function() { ga('send', 'pageview', window.location.pathname+window.location.search); }); }); ================================================ FILE: fa/gitbook/gitbook-plugin-hints/plugin-hints.css ================================================ .hints-icon { display: table-cell; padding-right: 15px; padding-left: 5px; } .hints-container { display: table-cell; } ================================================ FILE: fa/gitbook/gitbook-plugin-mermaid-gb3/book/plugin.js ================================================ require([ 'gitbook' ], function (gitbook) { gitbook.events.bind('page.change', function () { mermaid.init(); }); }); ================================================ FILE: fa/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #ECECFF; stroke: #CCCCFF; stroke-width: 1px; } .arrowheadPath { fill: #333333; } .edgePath .path { stroke: #333333; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #ffffde !important; rx: 4 !important; stroke: #aaaa33 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #CCCCFF; fill: #ECECFF; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #CCCCFF; fill: #ECECFF; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #CCCCFF; } .note { stroke: #aaaa33; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: rgba(102, 102, 255, 0.49); } .section2 { fill: #fff400; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #8a90dd; stroke: #534fbc; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #bfc7ff; stroke: #534fbc; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #bfc7ff; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #9370DB; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #ECECFF; stroke: #9370DB; } g.classGroup line { stroke: #9370DB; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #ECECFF; opacity: 0.5; } svg .classLabel .label { fill: #9370DB; font-size: 10px; } .relation { stroke: #9370DB; stroke-width: 1; fill: none; } .composition { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .aggregation { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationStart { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationEnd { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #dependencyStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #dependencyEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #ffffde; border: 1px solid #aaaa33; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: fa/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.forest.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { font-family: 'trebuchet ms', verdana, arial; color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #cde498; stroke: #13540c; stroke-width: 1px; } .arrowheadPath { fill: green; } .edgePath .path { stroke: green; stroke-width: 1.5px; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #cdffb2 !important; rx: 4 !important; stroke: #6eaa49 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #13540c; fill: #cde498; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #326932; fill: #cde498; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #326932; } .note { stroke: #6eaa49; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: #6eaa49; } .section2 { fill: #6eaa49; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #487e3a; stroke: #13540c; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #cde498; stroke: #13540c; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #cde498; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #13540c; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #cde498; stroke: #13540c; } g.classGroup line { stroke: #13540c; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #cde498; opacity: 0.5; } svg .classLabel .label { fill: #13540c; font-size: 10px; } .relation { stroke: #13540c; stroke-width: 1; fill: none; } .composition { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .aggregation { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationStart { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationEnd { fill: #cde498; stroke: #13540c; stroke-width: 1; } #dependencyStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #dependencyEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #cdffb2; border: 1px solid #6eaa49; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-a11y-dark.css ================================================ /** * a11y-dark theme for JavaScript, CSS, and HTML * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css * @author ericwbailey */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: 0.5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #d4d0ab; } .token.punctuation { color: #fefefe; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ffa07a; } .token.boolean, .token.number { color: #00e0e0; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #abe338; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #00e0e0; } .token.atrule, .token.attr-value, .token.function { color: #ffd700; } .token.keyword { color: #00e0e0; } .token.regex, .token.important { color: #ffd700; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } @media screen and (-ms-high-contrast: active) { code[class*="language-"], pre[class*="language-"] { color: windowText; background: window; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: window; } .token.important { background: highlight; color: window; font-weight: normal; } .token.atrule, .token.attr-value, .token.function, .token.keyword, .token.operator, .token.selector { font-weight: bold; } .token.attr-value, .token.comment, .token.doctype, .token.function, .token.keyword, .token.operator, .token.property, .token.string { color: highlight; } .token.attr-value, .token.url { font-weight: normal; } } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-atom-dark.css ================================================ /** * atom-dark theme for `prism.js` * Based on Atom's `atom-dark` theme: https://github.com/atom/atom-dark-syntax * @author Joe Gibson (@gibsjose) */ code[class*="language-"], pre[class*="language-"] { color: #c5c8c6; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #1d1f21; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #7C7C7C; } .token.punctuation { color: #c5c8c6; } .namespace { opacity: .7; } .token.property, .token.keyword, .token.tag { color: #96CBFE; } .token.class-name { color: #FFFFB6; text-decoration: underline; } .token.boolean, .token.constant { color: #99CC99; } .token.symbol, .token.deleted { color: #f92672; } .token.number { color: #FF73FD; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #A8FF60; } .token.variable { color: #C6C5FE; } .token.operator { color: #EDEDED; } .token.entity { color: #FFFFB6; /* text-decoration: underline; */ } .token.url { color: #96CBFE; } .language-css .token.string, .style .token.string { color: #87C38A; } .token.atrule, .token.attr-value { color: #F9EE98; } .token.function { color: #DAD085; } .token.regex { color: #E9C062; } .token.important { color: #fd971f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-base16-ateliersulphurpool.light.css ================================================ /* Name: Base16 Atelier Sulphurpool Light Author: Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) Prism template by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/prism/) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #f5f7ff; color: #5e6687; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #dfe2f1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #dfe2f1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #898ea4; } .token.punctuation { color: #5e6687; } .token.namespace { opacity: .7; } .token.operator, .token.boolean, .token.number { color: #c76b29; } .token.property { color: #c08b30; } .token.tag { color: #3d8fd1; } .token.string { color: #22a2c9; } .token.selector { color: #6679cc; } .token.attr-name { color: #c76b29; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #22a2c9; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #ac9739; } .token.statement, .token.regex, .token.atrule { color: #22a2c9; } .token.placeholder, .token.variable { color: #3d8fd1; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #202746; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c94922; } .token.entity { cursor: help; } pre > code.highlight { outline: 0.4em solid #c94922; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #dfe2f1; } .line-numbers-rows > span:before { color: #979db4; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(107, 115, 148, 0.2); background: -webkit-linear-gradient(left, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); background: linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-cb.css ================================================ /* * Based on Plugin: Syntax Highlighter CB * Plugin URI: http://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js * Description: Highlight your code snippets with an easy to use shortcode based on Lea Verou's Prism.js. * Version: 1.0.0 * Author: c.bavota * Author URI: http://bavotasan.comhttp://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js/ */ /* http://cbavota.bitbucket.org/syntax-highlighter/ */ /* ===== ===== */ code[class*="language-"], pre[class*="language-"] { color: #fff; text-shadow: 0 1px 1px #000; font-family: Menlo, Monaco, "Courier New", monospace; direction: ltr; text-align: left; word-spacing: normal; white-space: pre; word-wrap: normal; line-height: 1.4; background: none; border: 0; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"] code { float: left; padding: 0 15px 0 0; } pre[class*="language-"], :not(pre) > code[class*="language-"] { background: #222; } /* Code blocks */ pre[class*="language-"] { padding: 15px; margin: 1em 0; overflow: auto; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 5px 10px; line-height: 1; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797979; } .token.selector, .token.operator, .token.punctuation { color: #fff; } .token.namespace { opacity: .7; } .token.tag, .token.boolean { color: #ffd893; } .token.atrule, .token.attr-value, .token.hex, .token.string { color: #B0C975; } .token.property, .token.entity, .token.url, .token.attr-name, .token.keyword { color: #c27628; } .token.regex { color: #9B71C6; } .token.entity { cursor: help; } .token.function, .token.constant { color: #e5a638; } .token.variable { color: #fdfba8; } .token.number { color: #8799B0; } .token.important, .token.deliminator { color: #E45734; } /* Line highlight plugin */ pre[data-line] { position: relative; padding: 1em 0 1em 3em; } .line-highlight { position: absolute; left: 0; right: 0; margin-top: 1em; /* Same as .prism's padding-top */ background: rgba(255,255,255,.2); pointer-events: none; line-height: inherit; white-space: pre; } .line-highlight:before, .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .3em; left: .6em; min-width: 1em; padding: 0 .5em; background-color: rgba(255,255,255,.3); color: #fff; font: bold 65%/1.5 sans-serif; text-align: center; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; text-shadow: none; } .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } /* for line numbers */ .line-numbers-rows { margin: 0; } .line-numbers-rows span { padding-right: 10px; border-right: 3px #d9d336 solid; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-darcula.css ================================================ /** * Darcula theme * * Adapted from a theme based on: * IntelliJ Darcula Theme (https://github.com/bulenkov/Darcula) * * @author Alexandre Paradis * @version 1.0 */ code[class*="language-"], pre[class*="language-"] { color: #a9b7c6; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { color: inherit; background: rgba(33,66,131,.85); } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { color: inherit; background: rgba(33,66,131,.85); } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.cdata { color: #808080; } .token.delimiter, .token.boolean, .token.keyword, .token.selector, .token.important, .token.atrule { color: #cc7832; } .token.operator, .token.punctuation, .token.attr-name { color: #a9b7c6; } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: #e8bf6a; } .token.entity, .token.number, .token.symbol { color: #6897bb; } .token.property, .token.constant, .token.variable { color: #9876aa; } .token.string, .token.char { color: #6a8759; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: #ffc66d; } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #294436; } .token.deleted { background: #484a4a; } /*code.language-css .token.punctuation { color: #cc7832; }*/ code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-dracula.css ================================================ /** * Dracula Theme originally by Zeno Rocha [@zenorocha] * https://draculatheme.com/ * * Ported for PrismJS by Albert Vallverdu [@byverdu] */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #282a36; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6272a4; } .token.punctuation { color: #f8f8f2; } .namespace { opacity: .7; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ff79c6; } .token.boolean, .token.number { color: #bd93f9; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #50fa7b; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #f8f8f2; } .token.atrule, .token.attr-value, .token.function, .token.class-name { color: #f1fa8c; } .token.keyword { color: #8be9fd; } .token.regex, .token.important { color: #ffb86c; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-duotone-dark.css ================================================ /* Name: Duotone Dark Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-evening-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2734; color: #9a86fd; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6a51e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6a51e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6c6783; } .token.punctuation { color: #6c6783; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #e09142; } .token.property, .token.function { color: #9a86fd; } .token.tag-id, .token.selector, .token.atrule-id { color: #eeebff; } code.language-javascript, .token.attr-name { color: #c4b9fe; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #ffcc99; } .token.placeholder, .token.variable { color: #ffcc99; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #eeebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c4b9fe; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #8a75f5; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c2937; } .line-numbers-rows > span:before { color: #3c3949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(224, 145, 66, 0.2); background: -webkit-linear-gradient(left, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); background: linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-duotone-earth.css ================================================ /* Name: Duotone Earth Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-earth-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #322d29; color: #88786d; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6f5849; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6f5849; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6a5f58; } .token.punctuation { color: #6a5f58; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #bfa05a; } .token.property, .token.function { color: #88786d; } .token.tag-id, .token.selector, .token.atrule-id { color: #fff3eb; } code.language-javascript, .token.attr-name { color: #a48774; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fcc440; } .token.placeholder, .token.variable { color: #fcc440; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #fff3eb; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #a48774; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #816d5f; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #35302b; } .line-numbers-rows > span:before { color: #46403d; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(191, 160, 90, 0.2); background: -webkit-linear-gradient(left, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); background: linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-duotone-forest.css ================================================ /* Name: Duotone Forest Author: by Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-forest-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2d2a; color: #687d68; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #435643; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #435643; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #535f53; } .token.punctuation { color: #535f53; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #a2b34d; } .token.property, .token.function { color: #687d68; } .token.tag-id, .token.selector, .token.atrule-id { color: #f0fff0; } code.language-javascript, .token.attr-name { color: #b3d6b3; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #e5fb79; } .token.placeholder, .token.variable { color: #e5fb79; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #f0fff0; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #b3d6b3; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #5c705c; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c302c; } .line-numbers-rows > span:before { color: #3b423b; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(162, 179, 77, 0.2); background: -webkit-linear-gradient(left, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); background: linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-duotone-light.css ================================================ /* Name: Duotone Light Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-morning-light.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #faf8f5; color: #728fcb; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #faf8f5; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #faf8f5; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #b6ad9a; } .token.punctuation { color: #b6ad9a; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #063289; } .token.property, .token.function { color: #b29762; } .token.tag-id, .token.selector, .token.atrule-id { color: #2d2006; } code.language-javascript, .token.attr-name { color: #896724; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #728fcb; } .token.placeholder, .token.variable { color: #93abdc; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #2d2006; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #896724; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #896724; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #ece8de; } .line-numbers-rows > span:before { color: #cdc4b1; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(45, 32, 6, 0.2); background: -webkit-linear-gradient(left, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); background: linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-duotone-sea.css ================================================ /* Name: Duotone Sea Author: by Simurai, adapted from DuoTone themes by Simurai for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-sea-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #1d262f; color: #57718e; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #004a9e; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #004a9e; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #4a5f78; } .token.punctuation { color: #4a5f78; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #0aa370; } .token.property, .token.function { color: #57718e; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebf4ff; } code.language-javascript, .token.attr-name { color: #7eb6f6; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #47ebb4; } .token.placeholder, .token.variable { color: #47ebb4; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebf4ff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #7eb6f6; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #34659d; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #1f2932; } .line-numbers-rows > span:before { color: #2c3847; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(10, 163, 112, 0.2); background: -webkit-linear-gradient(left, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); background: linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-duotone-space.css ================================================ /* Name: Duotone Space Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-space-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #24242e; color: #767693; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #5151e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #5151e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #5b5b76; } .token.punctuation { color: #5b5b76; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #dd672c; } .token.property, .token.function { color: #767693; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebebff; } code.language-javascript, .token.attr-name { color: #aaaaca; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fe8c52; } .token.placeholder, .token.variable { color: #fe8c52; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #aaaaca; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #7676f4; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #262631; } .line-numbers-rows > span:before { color: #393949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(221, 103, 44, 0.2); background: -webkit-linear-gradient(left, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); background: linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-ghcolors.css ================================================ /** * GHColors theme by Avi Aryan (http://aviaryan.in) * Inspired by Github syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #b3d4fc; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #999988; font-style: italic; } .token.namespace { opacity: .7; } .token.string, .token.attr-value { color: #e3116c; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.entity, .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.property, .token.regex, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-name, .language-autohotkey .token.selector { color: #00a4db; } .token.function, .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.tag, .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.function, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-hopscotch.css ================================================ @import url(https://fonts.googleapis.com/css?family=Fira+Mono); /* * Hopscotch * by Jan T. Sott * https://github.com/idleberg/Hopscotch * * This work is licensed under the Creative Commons CC0 1.0 Universal License */ code[class*="language-"], pre[class*="language-"] { color: #ffffff; font-family: "Fira Mono", Menlo, Monaco, "Lucida Console","Courier New", Courier, monospace; font-size: 16px; line-height: 1.375; direction: ltr; text-align: left; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; background: #322931; color: #b9b5b8; } pre > code[class*="language-"] { font-size: 1em; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797379; } .token.punctuation { color: #b9b5b8; } .namespace { opacity: .7; } .token.null, .token.operator, .token.boolean, .token.number { color: #fd8b19; } .token.property { color: #fdcc59; } .token.tag { color: #1290bf; } .token.string { color: #149b93; } .token.selector { color: #c85e7c; } .token.attr-name { color: #fd8b19; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #149b93; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #8fc13e; } .token.statement, .token.regex, .token.atrule { color: #149b93; } .token.placeholder, .token.variable { color: #1290bf; } .token.important { color: #dd464c; font-weight: bold; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid red; outline-offset: .4em; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-material-dark.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #eee; background: #2f2f2f; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #a5e844; } .token.attribute { color: #a5e844; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.comment { color: #616161; } .token.constant { color: #c792ea; } .token.deleted { color: #ff6666; } .token.doctype { color: #616161; } .token.entity { color: #ff6666; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #616161; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #a5e844; } .token.pseudo-element { color: #a5e844; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #ff6666; } .token.string { color: #a5e844; } .token.symbol { color: #c792ea; } .token.tag { color: #ff6666; } .token.unit { color: #fd9170; } .token.url { color: #ff6666; } .token.variable { color: #ff6666; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-material-light.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #90a4ae; background: #fafafa; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #cceae7; color: #263238; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #cceae7; color: #263238; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #f76d47; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #7c4dff; } .token.attr-name { color: #39adb5; } .token.attr-value { color: #f6a434; } .token.attribute { color: #f6a434; } .token.boolean { color: #7c4dff; } .token.builtin { color: #39adb5; } .token.cdata { color: #39adb5; } .token.char { color: #39adb5; } .token.class { color: #39adb5; } .token.class-name { color: #6182b8; } .token.comment { color: #aabfc9; } .token.constant { color: #7c4dff; } .token.deleted { color: #e53935; } .token.doctype { color: #aabfc9; } .token.entity { color: #e53935; } .token.function { color: #7c4dff; } .token.hexcode { color: #f76d47; } .token.id { color: #7c4dff; font-weight: bold; } .token.important { color: #7c4dff; font-weight: bold; } .token.inserted { color: #39adb5; } .token.keyword { color: #7c4dff; } .token.number { color: #f76d47; } .token.operator { color: #39adb5; } .token.prolog { color: #aabfc9; } .token.property { color: #39adb5; } .token.pseudo-class { color: #f6a434; } .token.pseudo-element { color: #f6a434; } .token.punctuation { color: #39adb5; } .token.regex { color: #6182b8; } .token.selector { color: #e53935; } .token.string { color: #f6a434; } .token.symbol { color: #7c4dff; } .token.tag { color: #e53935; } .token.unit { color: #f76d47; } .token.url { color: #e53935; } .token.variable { color: #e53935; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-material-oceanic.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #c3cee3; background: #263238; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #c3e88d; } .token.attribute { color: #c3e88d; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.color { color: #f2ff00; } .token.comment { color: #546e7a; } .token.constant { color: #c792ea; } .token.deleted { color: #f07178; } .token.doctype { color: #546e7a; } .token.entity { color: #f07178; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; font-style: italic; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #546e7a; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #c3e88d; } .token.pseudo-element { color: #c3e88d; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #f07178; } .token.string { color: #c3e88d; } .token.symbol { color: #c792ea; } .token.tag { color: #f07178; } .token.unit { color: #f07178; } .token.url { color: #fd9170; } .token.variable { color: #f07178; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-pojoaque.css ================================================ /* * Pojoaque Style by Jason Tate * http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html * Based on Solarized Style from http://ethanschoonover.com/solarized * http://softwaremaniacs.org/media/soft/highlight/test.html */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 15px; line-height: 1.5; color: #dccf8f; text-shadow: 0; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre) > code[class*="language-"] { border-radius: 5px; border: 1px solid #000; color: #DCCF8F; background: #181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top; } pre[class*="language-"] { padding: 12px; overflow: auto; } :not(pre) > code[class*="language-"] { padding: 2px 6px; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #586e75; font-style: italic; } .token.number, .token.string, .token.char, .token.builtin, .token.inserted { color: #468966; } .token.attr-name { color: #b89859; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #dccf8f; } .token.selector, .token.regex { color: #859900; } .token.atrule, .token.keyword { color: #cb4b16; } .token.attr-value { color: #468966; } .token.function, .token.variable, .token.placeholder { color: #b58900; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol { color: #b89859; } .token.tag { color: #ffb03b; } .token.important, .token.statement, .token.deleted { color: #dc322f; } .token.punctuation { color: #dccf8f; } .token.entity { cursor: help; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } /* .pojoaque-colors { color: #586e75; color: #b64926; color: #468966; color: #ffb03b; color: #b58900; color: #b89859; color: #dccf8f; color: #d3a60c; color: #cb4b16; color: #dc322f; color: #073642; color: #181914; } */ ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-shades-of-purple.css ================================================ /** * Shades of Purple Theme for Prism.js * * @author Ahmad Awais * @support Follow/tweet at https://twitter.com/MrAhmadAwais/ */ code[class*='language-'], pre[class*='language-'] { color: #9efeff; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; font-family: 'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-weight: 400; font-size: 17px; line-height: 25px; letter-spacing: 0.5px; text-shadow: 0 1px #222245; } pre[class*='language-']::-moz-selection, pre[class*='language-'] ::-moz-selection, code[class*='language-']::-moz-selection, code[class*='language-'] ::-moz-selection, pre[class*='language-']::selection, pre[class*='language-'] ::selection, code[class*='language-']::selection, code[class*='language-'] ::selection { color: inherit; background: #a599e9; } /* Code blocks. */ pre[class*='language-'] { padding: 2em; margin: 0.5em 0; overflow: auto; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #1e1e3f; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; } .token { font-weight: 400; } .token.comment, .token.prolog, .token.cdata { color: #b362ff; } .token.delimiter, .token.keyword, .token.selector, .token.important, .token.atrule { color: #ff9d00; } .token.operator, .token.attr-name { color: rgb(255, 180, 84); } .token.punctuation { color: #ffffff; } .token.boolean { color: rgb(255, 98, 140); } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: rgb(255, 157, 0); } .token.entity, .token.symbol { color: #6897bb; } .token.number { color: #ff628c; } .token.property, .token.constant, .token.variable { color: #ff628c; } .token.string, .token.char { color: #a5ff90; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: rgb(250, 208, 0); } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #00ff00; } .token.deleted { background: #ff000d; } code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } .token.class-name { color: #fb94ff; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { background: none; } pre .line-highlight, pre .line-highlight.line-highlight, pre > code.line-highlight { margin-top: 36px; background: linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent); } pre .line-highlight:before, pre > code.line-highlight:before, pre .line-highlight[data-end]:after, pre > code.line-highlight[data-end]:after { content: ''; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-synthwave84.css ================================================ /* * Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code * Demo: https://marc.dev/demo/prism-synthwave84 * * Ported for PrismJS by Marc Backes [@themarcba] */ code[class*="language-"], pre[class*="language-"] { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background-color: transparent !important; background-image: linear-gradient(to bottom, #2a2139 75%, #34294f); } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.block-comment, .token.prolog, .token.doctype, .token.cdata { color: #8e8e8e; } .token.punctuation { color: #ccc; } .token.tag, .token.attr-name, .token.namespace, .token.number, .token.unit, .token.hexcode, .token.deleted { color: #e2777a; } .token.property, .token.selector { color: #72f1b8; text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475; } .token.function-name { color: #6196cc; } .token.boolean, .token.selector .token.id, .token.function { color: #fdfdfd; text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975; } .token.class-name { color: #fff5f6; text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75; } .token.constant, .token.symbol { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; } .token.important, .token.atrule, .token.keyword, .token.selector .token.class, .token.builtin { color: #f4eee4; text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575; } .token.string, .token.char, .token.attr-value, .token.regex, .token.variable { color: #f87c32; } .token.operator, .token.entity, .token.url { color: #67cdcc; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } .token.inserted { color: green; } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-vs.css ================================================ /** * VS theme by Andrew Lock (https://andrewlock.net) * Inspired by Visual Studio syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #C1DEF1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #C1DEF1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #008000; font-style: italic; } .token.namespace { opacity: .7; } .token.string { color: #A31515; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, .language-json .token.number, code[class*="language-css"]{ color: #0000ff; } .token.function { color: #393A34; } .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.class-name, .language-json .token.property { color: #2B91AF; } .token.tag, .token.selector { color: #800000; } .token.attr-name, .token.property, .token.regex, .token.entity { color: #ff0000; } .token.directive.tag .tag { background: #ffff00; color: #393A34; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #a5a5a5; } .line-numbers-rows > span:before { color: #2B91AF; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(193, 222, 241, 0.2); background: -webkit-linear-gradient(left, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); background: linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); } ================================================ FILE: fa/gitbook/gitbook-plugin-prism/prism-xonokai.css ================================================ /** * xonokai theme for JavaScript, CSS and HTML * based on: https://github.com/MoOx/sass-prism-theme-base by Maxime Thirouin ~ MoOx --> http://moox.fr/ , which is Loosely based on Monokai textmate theme by http://www.monokai.nl/ * license: MIT; http://moox.mit-license.org/ */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 2; -o-tab-size: 2; tab-size: 2; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-wrap: normal; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 14px; color: #76d9e6; text-shadow: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre)>code[class*="language-"] { background: #2a2a2a; } pre[class*="language-"] { padding: 15px; border-radius: 4px; border: 1px solid #e1e1e8; overflow: auto; } pre[class*="language-"] { position: relative; } pre[class*="language-"] code { white-space: pre; display: block; } :not(pre)>code[class*="language-"] { padding: 0.15em 0.2em 0.05em; border-radius: .3em; border: 0.13em solid #7a6652; box-shadow: 1px 1px 0.3em -0.1em #000 inset; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6f705e; } .token.operator, .token.boolean, .token.number { color: #a77afe; } .token.attr-name, .token.string { color: #e6d06c; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #e6d06c; } .token.selector, .token.inserted { color: #a6e22d; } .token.atrule, .token.attr-value, .token.keyword, .token.important, .token.deleted { color: #ef3b7d; } .token.regex, .token.statement { color: #76d9e6; } .token.placeholder, .token.variable { color: #fff; } .token.important, .token.statement, .token.bold { font-weight: bold; } .token.punctuation { color: #bebec5; } .token.entity { cursor: help; } .token.italic { font-style: italic; } code.language-markup { color: #f9f9f9; } code.language-markup .token.tag { color: #ef3b7d; } code.language-markup .token.attr-name { color: #a6e22d; } code.language-markup .token.attr-value { color: #e6d06c; } code.language-markup .token.style, code.language-markup .token.script { color: #76d9e6; } code.language-markup .token.script .token.keyword { color: #76d9e6; } /* Line highlight plugin */ pre[class*="language-"][data-line] { position: relative; padding: 1em 0 1em 3em; } pre[data-line] .line-highlight { position: absolute; left: 0; right: 0; padding: 0; margin-top: 1em; background: rgba(255, 255, 255, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } pre[data-line] .line-highlight:before, pre[data-line] .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .4em; left: .6em; min-width: 1em; padding: 0.2em 0.5em; background-color: rgba(255, 255, 255, 0.4); color: black; font: bold 65%/1 sans-serif; height: 1em; line-height: 1em; text-align: center; border-radius: 999px; text-shadow: none; box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); } pre[data-line] .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } ================================================ FILE: fa/gitbook/gitbook.js ================================================ !function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=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)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,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(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(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(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!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,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.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:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.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 A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(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&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(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&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.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):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.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=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.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)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.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,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,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":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.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 de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de("

Project V

پروژه V مجموعه ای از ابزارهایی است که به شما کمک می کند شبکه خصوصی خود را بر روی اینترنت ایجاد کنید. هسته پروژه V، به نام V2Ray، مسئول پروتکل های شبکه و ارتباطات است. این می تواند به تنهایی کار کند و همچنین با ابزارهای دیگر ترکیب شود.

این وب سایت عمدتا یک کتابچه راهنمای کاربر برای V2Ray است، با برخی اطلاعات اضافی در مورد کل پروژه.

امکانات

  • چند پروکسی ورودی / خروجی: یک نمونه V2Ray به طور موازی پروتکل های ورودی و خروجی چندگانه موازی است. هر پروتکل مستقل عمل می کند.
  • مسیریابی قابل برنامه ریزی: ترافیک ورودی می تواند به خروجی های مختلف بر اساس پیکربندی مسیریابی ارسال شود. مسیر ترافیکی را در منطقه یا دامنه هدف آسان است.
  • پروتکل های چندگانه: V2Ray از چندین پروتکل پشتیبانی می کند، از جمله Socks، HTTP، Shadowsocks، VMess و غیره. هر پروتکل ممکن است حمل و نقل خاص خود را داشته باشد، مانند TCP، mKCP، WebSocket و غیره.
  • Obfuscation: V2Ray در ترافیک برای مخفی کردن ترافیک در TLS ساخته شده است و می تواند به صورت موازی با سرورهای وب اجرا شود.
  • معکوس پروکسی: پشتیبانی عمومی پروکسی معکوس. می توان برای ساخت تونل ها به localhost استفاده کرد.
  • سیستم عامل های چندگانه: V2Ray بطور اولیه بر روی ویندوز، سیستم عامل مک، لینوکس و غیره اجرا می شود. پشتیبانی از شخص ثالث در تلفن همراه نیز وجود دارد.

Sponsors

v2net

This site is generated by GitBook, and host on GitHub. If you'd like to modify its content, please send pull request to this repo.

================================================ FILE: fa/styles/website.css ================================================ .book-summary { font-family: "Noto Sans CJK SC", "PingFang SC", "Microsoft Yahei", "Hiragino Sans GB", sans-serif; font-size: 14px; } .book-header .btn { padding: 0 5px; } .markdown-section { font-family: "Noto Sans CJK SC", "PingFang SC", "Microsoft Yahei", "Hiragino Sans GB", sans-serif; font-weight: 400; font-size: 14px; direction: rtl; } .markdown-section pre>code { font-family: "Source Code Pro", monospace; font-weight: 400; font-size: 14px; } .markdown-section code:not([class]) { white-space: nowrap; padding: 0; } .markdown-section blockquote { margin: 0; margin-bottom: .85em; padding: 0 15px; border-left: 4px solid #64b5f6; border-top: 1px solid #64b5f6; color: #000000; margin-top: 10px; } code { direction: ltr !important; } ================================================ FILE: fa/ui_client/README.md ================================================ --- refcn: ui_client/index refen: ui_client/index --- # مشتریان پروژه V علاوه بر هسته V2ray، پروژه V شامل انواع مختلفی از مشتریان GUI در بسیاری از سیستم عامل ها می باشد. لطفا لیست زیر را برای نفع خود ببینید. * [پنجره ها](windows.md) * [Mac OS X](osx.md) * [در iOS](ios.md) * [اندروید](android.md) * [خدمات آنلاین](ui_client/service.md) ================================================ FILE: fa/ui_client/android.md ================================================ --- refcn: ui_client/android refen: ui_client/android --- # مشتری Android ## BifrostV BifrostV یک برنامه آندروید بر اساس هسته V2Ray است. از VMess، Shadowsocks، پروتکل های جوراب پشتیبانی می کند. * دانلود: [فروشگاه بازی](https://play.google.com/store/apps/details?id=com.github.dawndiy.bifrostv) * دانلود: [APK خالص](https://apkpure.com/bifrostv/com.github.dawndiy.bifrostv) ## V2RayNG V2RayNG نرم افزار آندروید بر اساس V2Ray است. این ویژگی همان ویژگی را به عنوان هسته V2Ray فراهم می کند. * دانلود: [فروشگاه بازی](https://play.google.com/store/apps/details?id=com.v2ray.ang) * منبع: [GitHub](https://github.com/2dust/v2rayNG) ## V2Ray برو * دانلود: [فروشگاه بازی](https://play.google.com/store/apps/details?id=org.kkdev.v2raygo) * منبع: [Github](https://github.com/xiaokangwang/V2RayGO) ## اکتینیم * دانلود: بازی فروشگاه (در دسترس نیست) * منبع: [Github](https://github.com/V2Ray-Android/Actinium) ## ابزارهای دیگر {#other} ### JuiceSSH مشتری SSH * دانلود: [فروشگاه بازی](https://play.google.com/store/apps/details?id=com.sonelli.juicessh) * وب سایت: [JuiceSSH.com](https://juicessh.com/) ### ترموس مشتری SSH * دانلود: [فروشگاه بازی](https://play.google.com/store/apps/details?id=com.server.auditor.ssh.client) ### تلگرام بحث رمزگذاری شده * وب سایت: [telegram.org](https://telegram.org/) * دانلود: [فروشگاه بازی](https://play.google.com/store/apps/details?id=org.telegram.messenger) ================================================ FILE: fa/ui_client/ios.md ================================================ --- refcn: ui_client/ios refen: ui_client/ios --- # مشتری iOS ## Kitsunebi Kitsunebi یک برنامه iOS مبتنی بر V2Ray است. این قابلیت کامل به عنوان V2Ray را فراهم می کند. همچنین از وارد کردن و صادرات پیکربندی JSON سازگار با V2Ray پشتیبانی می کند. * Download: [iTunes](https://itunes.apple.com/us/app/kitsunebi-proxy-utility/id1446584073?mt=8) ## Kitsunebi Lite نسخه سبک Kitsunebi. * دانلود: [iTunes](https://www.v2ray.com/itunes/us/kitsunebi-lite/id1387913765/) ## Shadowrocket Shadowrocket یک برنامه VPN عمومی است. پشتیبانی از چندین پروتکل مانند Shadowsocks، VMess، SSR و غیره * دانلود: [iTunes](https://www.v2ray.com/itunes/us/shadowrocket/id932747118/) ## Pepi (ShadowRay بود) {#pepi} Pepi برنامه V2Ray سازگار است. آیا قادر است اتصال VPN را بر اساس پروتکل VMess برقرار کند و با هر سرور V2Ray ارتباط برقرار کند. * دانلود: [iTunes](https://www.v2ray.com/itunes/us/pepi/id1283082051/) ## کوانتومی * دانلود: [iTunes](https://www.v2ray.com/itunes/us/quantumult/id1252015438/) ## ابزارهای دیگر {#other} ### HyperApp یک ابزار برای ساخت سرور با docker. * دانلود: [iTunes](https://www.v2ray.com/itunes/us/hyperapp/id1179750280/) * وب سایت: [HyperApp.fun](https://www.hyperapp.fun/) ### ترموس مشتری SSH * دانلود: [iTunes](https://www.v2ray.com/itunes/us/termius/id549039908/) ### تلگرام بحث رمزگذاری شده * وب سایت: [telegram.org](https://telegram.org/) * دانلود: [iTunes](https://www.v2ray.com/itunes/us/telegram-messenger/id686449807/) ### ProtonMail ایمیل رمزگذاری شده * وب سایت: [protonmail.com](https://protonmail.com/) * دانلود: [iTunes](https://www.v2ray.com/itunes/us/protonmail-encrypted-email/id979659905/) ================================================ FILE: fa/ui_client/osx.md ================================================ --- refcn: ui_client/osx refen: ui_client/osx --- # Mac OS X ## V2RayX * دانلود: [Github](https://github.com/Cenmrev/V2RayX) ## V2RayU * Download: [Github](https://github.com/yanue/V2rayU) ## Other tools {#other} ### ویژوال استودیو کد ویرایشگر کد منبع از مایکروسافت. * Website: [code.visualstudio.com](https://code.visualstudio.com/) ### تلگرام بحث رمزگذاری شده * Website: [telegram.org](https://telegram.org/) * Download: [Mac App Store](https://www.v2ray.com/itunesm/us/telegram-desktop/id946399090/) ### مشتری Microsoft Remote Desktop Connection * Download: [Mac App Store](https://www.v2ray.com/itunesm/us/microsoft-remote-desktop/id715768417/) ================================================ FILE: fa/ui_client/service.md ================================================ --- refcn: ui_client/service refen: ui_client/service --- # خدمات آنلاین The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V. ## V2Ray مرتبط است * [ژنراتور پیکربندی](https://htfy96.github.io/v2ray-config-gen/) * [ژنراتور UUID](https://www.uuidgenerator.net/) ## VPN * [BabyDriver](http://babydriver.me/): پشتیبانی از V2Ray. کد کوپن: bcb518 * [喵 帕斯](https://xn--i2ru8q2qg.com/): حمایت V2Ray (بتا) * [Lanan](https://xn--sjt174g.com/): سرویس VPN مبتنی بر V2Ray. کد کوپن: v2ray * [多数 派](https://dspi.io/aff.php?aff=7): سرویس VPN جدید مبتنی بر V2Ray. * [V2rayPro](https://myv2.us/): VPN service based on V2Ray. Coupon code: v2ray.com * [V2Net](http://v2net.org/): Customized V2Ray service. Promo code: v2ray.com ## Hosting * [بیایید رمزگذاری](https://letsencrypt.org/): گواهینامه TLS رایگان * [Vultr](https://www.vultr.com/?ref=7269307): VPS * [2019 limited promotion, $50 free credit](https://www.vultr.com/?ref=7783021-4F) * [BlueHost](https://www.bluehost.com/track/v2ray/): VPS, web hosting * [ClouDNS](https://www.cloudns.net/aff/id/244749/): Domain registration, DNS, SSL certificate ## Cryptocurrency * [LocalBitcoins](https://localbitcoins.com/?ch=khtm): Trade Bitcoins offline * [CoinCola](https://www.coincola.com/mobile/signup?ref=QAcvfy2g): OTC market to trade BTC, ETH, BCH, USDT. * [Binance](https://www.binance.com/?ref=35382451): Trading market for crypto currencies. * [Coinex](https://www.coinex.com/account/signup?refer_code=r3fmp): Trading market for crypto currencies. * [CoinPayment](https://www.coinpayments.net/index.php?ref=abc5f542afed6b37b4b3d7fb83242d18): Online crypto currency wallet * [PrimeDice](https://primedice.com/?c=default): Dice game with bitcoin. * [OneHash](https://www.onehash.com/?ap=56d52158f7e04b169ec54d): Bet sport games with Bitcoin, including World Cup 2018. * [Bitsler](https://www.bitsler.com/?ref=VictoriaR): Casino games with Bitcoin. ================================================ FILE: fa/ui_client/windows.md ================================================ --- refcn: ui_client/windows refen: ui_client/windows --- # پنجره ها ## V2RayW * دانلود: [Github](https://github.com/Cenmrev/V2RayW) ## V2RayN * دانلود: [Github](https://github.com/2dust/v2rayN) ## V2RayS * دانلود: [Github](https://github.com/Shinlor/V2RayS) ## ابزارهای دیگر {#other} ### پوتای مشتری SSH * وب سایت: [بطری](http://www.putty.org/) ### ویژوال استودیو کد ویرایشگر کد منبع از مایکروسافت. * وب سایت: [code.visualstudio.com](https://code.visualstudio.com/) ### تلگرام بحث رمزگذاری شده * وب سایت: [telegram.org](https://telegram.org/) ================================================ FILE: fa/welcome/command.html ================================================ خط فرمان · Project V

خط فرمان

V2Ray

V2Ray دارای پارامترهای خط فرمان زیر است:

v2ray [-version] [-test] [-config=config.json] [-format=json]

-version

Print the version of V2Ray only, and then exit.

-test

Test configuration, output any errors and then exit.

-config

URI of the configuration. Avilable formats are:

  • Path to the local config file. May be a relative path or absolute path.
  • "stdin:": Indicates V2Ray to read configuration from standard input. Caller must close stdin after writing out configuration.
  • Value begins with http:// or https:// (lowercase): V2Ray tries to load configuration from the remote address.

-format

Configuration format. Choices are:

  • json: JSON format.
  • pb or protobuf: Protobuf format.

When -config is not specified, V2Ray first tries to load configuration from config.json under working directory, then from the directory specified by environment variable v2ray.location.asset.

V2Ctl

V2Ctl is a collection of commandline tools. It runs in the following way:

v2ctl <command> <options>

command

Subcommand. Available values are below:

  • api: Invoke remote control commands in V2Ray instances.
  • config: Convert configuration from JSON format to protobuf.
  • cert: Generate TLS certificates.
  • fetch: Fetch remove resources.
  • tlsping: (V2Ray 4.17+) Test TLS handshake.
  • verify: Verify the signature of V2Ray releases.
  • uuid: Generate UUID.

V2Ctl Api

v2ctl api [--server=127.0.0.1:8080] <Service.Method> <Request>

Invoke remote control commands in V2Ray instances. Example:

v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger ''

V2Ctl Config

v2ctl config

No option for this command. It reads JSON configuration from stdin, and print out corresponding Protobuf to stdout, if succeeds.

V2Ctl Cert

v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h] [--name="V2Ray Inc"] [--org="V2Ray Inc] [--json] [--file=v2ray]

Generates a TLS certificate based on options.

--ca

If specified, the certificate will be a CA certificate.

--domain

Alternative Names in the certificate. This option can be used multiple times for multiple domains. For example: --domain=v2ray.com --domain=v2ray.cool.

--expire

Expire date of the certificate. Value is a Golang duration.

--name

Command Name in the certificate.

--org

Orgnization in the certificate.

--json

If specified, the certificate will be printed to stdout in the JSON format that is used in V2Ray.

--file

Prints the certificate into files. When --file=a, two files named a_cert.pem and a_key.pem will be generated.

V2Ctl Fetch

v2ctl fetch <url>

Fetch remove resources and print to stdout. Only HTTP and HTTPS URL are supported.

V2Ctl TlsPing

v2ctl tlsping <domain> --ip=[ip]

Test TLS handlshake with specific domain.

domain

Target domain for the TLS handshake.

--ip

The IP address of the domain. If not specifed, V2Ctl resolves it through system DNS.

V2Ctl Verify

v2ctl verify [--sig=/path/to/sigfile] <filepath>

To verify the signature of a V2Ray binary.

--sig

Path to signature file. Default value is the ".sig" file to the path to be verified.

filepath

The file to be verified.

V2Ctl UUID

v2ctl uuid

No options. This command prints a random UUID.

================================================ FILE: fa/welcome/donate.html ================================================ کمک مالی · Project V

کمک مالی

V2Ray is a nonprofit project. The source code and its release binary can be used freely (mainly) under MIT licence. If you like this project, you may buy us a cup of coffee.

Your donation has no direct connection to Project V's development and service. Our development will not be influenced by your donation. However, we will send a thank-you email for every donor. If you wish not to receive such email, please leave a note in your donation.

For any donation worth more than $50, you may choose one of the following:

  • Your name or your company log shown on our front page for one month.
  • Modify our codebase as you wish. Restrictions: No user facing functionlity changes; no documentation changes. Your change will stay for a month.

راه معمول

Paypal

You may donate through internal Paypal transfer or credit card

Please kindly note that Paypal charges high service fee. Any donation less than 1 USD is meaningless.

Patreon

Patreon is a platform for regular donations. You may use Patreon if you want to donate frequently.

Giftcard

For now we only receive giftcard for Amazon US. You may purchase it at Amazon.com and then send to love@v2ray.com.

Cryptocurrency

Cryptocurrency is a more reliable way for international transactions. Crypto-wallet is usually anonymous and your donation is not traceable.

Due to the anonymity natural of cryptocurrenty, please send us an email before your donation, if you want to receive the thank-you email.

Bitcoin

Address: 3GctrB7R5sMhJ73N4AKo56Bdf9RE3RJsuM

View stats or QR-Code at BlockChain

Bitcoin Cash

Address: 15oATKUq5mEfuzasPnsJ58TjJU5SvDJK97

View stats or QR-Code at BlockChain

Ethereum

Address: 0x112ee71189704fe04cabed4aa045f4461c8c8696

View stats or QR-Code at BlockChain. You may also send the following ERC20 tokens to this address: OMG, REP, GNT, DGD

EOS

Address: EOS8Civdok4CBN3jCpsaGQijzesjKof1eyaRFuBU5mLMtWVkLsy8a

Litecoin

Address: LVdeH2HkCgGRs8ZEpan7fkAEEPbiJ4McoR

Monero

Address: 48kA4NyLRCWQvB7U2A77G66Z25uWbyzmoZSYjxJfrMR1J4dRFW6fWFLDn3wirAqP8ySnR4rnvoXWxfkNFhrK5ZxY1WyBqKg

Ripple

Address: r439fPk8DzCf4nSxkpfodEuE2cG4KVZQHq

Tag not required

Other

Please send us an email at love@v2ray.com if you want to donate other kind of coins.

================================================ FILE: fa/welcome/faq.html ================================================ سوالات متداول · Project V

سوالات متداول (FAQ)

استفاده از V2Ray

نحوه ارتقاء V2Ray

  • آخرین بسته را دانلود کنید یا
  • اجرای مجدد اسکریپت نصب (فقط لینوکس)

سقوط V2Ray

  • اگر از لینوکس با systemd استفاده می کنید، می توانید با استفاده از دستور journalctl -u v2ray.
  • به طور کلی شما می توانید دستور v2ray -config =<config-file> -test را اجرا کنید تا اطلاعات خطا ببینید.

Backward Compatibility

  • For configuration file (e.g., JSON), backward compatibility applies to at least one major releases. For example, V2Ray 4.x supports config files from V2Ray 3.x.
  • For Protobuf based communication protocols, such as Api, backward compatibility applies to at least one major releases.
  • For binary based commnunication protocols, such as Shadowsocks and VMess, it is always backward compatible when server version is not older than clients. When client version is newer, backward compatibility applies to at least 12 minor releases.

خطاهای V2Ray

Socks: Unknown Socks version: 67

علل احتمالی

  • You are using socks inbound in V2Ray, but your browser is configured to use HTTP proxy.

راه حل

  • Add a HTTP inbound in V2Ray, and then update your browser proxy settings to use this proxy.

مجوز این پروژه

پروژه V از مجوز زیر استفاده می کند.

V2Ray

کد منبع و انتشار رسمی تحت مجوز MIT، از جمله کد منبع و انتشار در مخزن زیر مجوز.

V2Ray.Com

وب سایت رسمی، v2ray.com، تحت Creative Commons Attribution 4.0 مجوز بین المللیمجاز است.

  • Including all visible text and pictures on the website.
  • Including Project V logo.
  • Including all source code that is used for generating the website, i.e., v2ray/manual.

Screenshot and other files

تمام پرونده های شخص ثالث ذکر شده در زیر به خالق آنها تعلق دارند. هر شخصی که فایل را ایجاد می کند فایل دارد

  • Including all screenshots of Project V.
  • Including all configuration files that are used to run Project V.
  • Including all logs generated by Project V during runtime.

Other content

تمام محتویاتی که در بالا ذکر نشده اند، به صورت مورد صدور مجوز خواهند بود.

================================================ FILE: fa/welcome/help.html ================================================ حمایت کردن · Project V

حمایت کردن

پروژه V چندین روش برای ارتباطات فراهم می کند.

تیم پروژه V از چینی و انگلیسی پشتیبانی می کند. لطفا یکی را انتخاب کنید که با سوالات آشنا هستید.

مسائل Github

ما از چندین مخزن برای انواع مختلف بحث استفاده می کنیم.

تلگرام

پروژه V گروه های زیر را برای انواع مختلف بحث ها فراهم می کند.

مباحث در این گروه ها به طور عمده در چینی هستند. گروه های نصب را به زبان خودتان آزاد کنید و به ما اطلاع دهید.

همه گروه های بحث، موضوعات زیر را ممنوع می کنند: محتوای بالغ، سیاست، سخنان نفرت. فرستندگان این موضوعات به طور مستقیم ممنوع می شوند.

لطفا دنبال پروژه V اطلاعیه برای اخبار.

توییتر

ProjectV2Ray برای ارتباطات منظم.

پست الکترونیک

لطفا یک پیام را به یکی از آدرس زیر ارسال کنید، اگر دوست دارید با تیم خصوصی V2Ray صحبت کنید.

love@v2ray.com: آدرس ایمیل اصلی برای ارتباطات. هر روز بررسی می شود

v2ray@protonmail.com: A ProtonMail صندوق پستی که پایان دادن به پایان دادن به رمزگذاری است. استفاده از آن دشوار است، و گاهی اوقات بررسی می شود.

متاسفانه به دلیل حجم بالای کار، وعده داده شده که هر ایمیل پاسخ داده شود. متاسفم برای ناراحتی برای سوالات کلی، لطفا برای پاسخ سریع از گروههای بحث شده در بالا استفاده کنید.

شما ممکن است کلید عمومی PGP را با جستجوی love@v2ray.comیا کلید عمومی در زیر استفاده کنید.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org

mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu
3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85
c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs
0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w
EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk
CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj
OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY
cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m
uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV
va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF
5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB
tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP
eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu
ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY
WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM
iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG
1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5
iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm
ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM
otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe
3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q
dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT
swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh
SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc
tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt
kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB
8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/
ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y
1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO
SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+
GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/
KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/
b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy
ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN
dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP
eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV
9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB
TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt
6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ
IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+
2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT
tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH
iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6
U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD
WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B
X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt
PeRpd1GUXXeoGCw=
=To5T
-----END PGP PUBLIC KEY BLOCK-----
================================================ FILE: fa/welcome/install.html ================================================ نصب · Project V

دانلود & نصب

سکو

V2Ray در سیستم عامل های زیر موجود است:

  • ویندوز 7 و بعد (x86 / amd64)
  • Mac OS X 10.10 Yosemite و بعد (amd64)
  • لینوکس 2.6.23 و بعد (x86 / amd64 / arm / arm64 / mips64 / mips)
    • شامل اما نه محدود به Debian 7/8، اوبونتو 12.04 / 14.04 و بعدا، CentOS 6/7، Arch Linux
  • FreeBSD (x86 / amd64)
  • OpenBSD (x86 / amd64)
  • سنجاقک BSD (amd64)

دانلود

بسته های پیش ساخته شده را می توان در اینجا پیدا کرد:

  1. Github انتشار: github.com/v2ray/v2ray-core
  2. Redistribution: github.com/v2ray/dist
  3. Homebrew: github.com/v2ray/homebrew-v2ray
  4. آرچ لینوکس: بسته / جامعه / x86_64 / v2ray /
  5. Snapcraft: snapcraft.io/v2ray-core

همه بسته ها در قالب ZIP هستند. بسته های مربوطه را به سیستم خود دانلود و باز کنید.

تأیید

2 روش برای بررسی بسته ها وجود دارد.

  1. هر فایل .zip فایل مربوطه .dgst برای هضم SHA دارد.
  2. فایل امضای GPG برای اجرا (v2ray / v2ray.exe) را می توان در v2ray.sig (یا v2ray.exe.sig) در همان بسته پیدا کرد. کلید عمومی در مخزن.

نصب در ویندوز یا سیستم عامل مک

پس از پاک کردن بسته ها، v2ray / v2ray.exe را اجرا کنید.

لینوکس را نصب کنید

ما یک اسکریپت برای نصب در لینوکس ارائه می دهیم. این اسکریپت v2ray نصب شده قبلی را تشخیص داده و سپس بروز رسانی یا نصب جدیدی را بر عهده دارد. اگر یک نسخه قبلی وجود دارد، فایل پیکربندی در / etc / v2ray در هنگام ارتقاء مجددا نویسی نخواهد شد.

دستور زیر اجازه دسترسی به ریشه را می دهد.

برای نصب V2Ray دستور زیر را اجرا کنید. اگر yum یا apt در دسترس باشد، اسکریپت unzip و daemon / systemd را نصب خواهد کرد. آنها نیاز به اجرای V2Ray به عنوان یک سرویس دارند. اگر سیستم لینوکس شما yum یا apt را پشتیبانی نمی کند، باید آنها را به صورت دستی نصب کنید.

curl -Ls https://install.direct/go.sh | sudo bash

اسکریپت فایل های زیر را نصب می کند.

  • / usr / bin / v2ray / v2ray: V2Ray executable
  • / usr / bin / v2ray / v2ctl: Utility
  • /etc/v2ray/config.json: فایل پیکربندی
  • /usr/bin/v2ray/geoip.dat: فایل داده های IP
  • /usr/bin/v2ray/geosite.dat: فایل داده دامنه

این اسکریپت همچنین V2Ray را به عنوان سرویس اجرا می کند، اگر systemd در دسترس باشد.

تنظیمات در مکان های زیر قرار دارند.

  • /etc/systemd/system/v2ray.service: Systemd
  • /etc/init.d/v2ray: SysV

پس از نصب، ما باید:

  1. به روز رسانی /etc/v2ray/config.json فایل برای سناریوی خودتان.
  2. اجرا سرویس v2ray شروع دستور برای شروع V2Ray.
  3. اختیاری سرویس v2ray start | stop | status | reload | restart | force-reload برای کنترل سرویس V2Ray.

برو

go.sh از پارامترهای زیر پشتیبانی می کند.

  • -p یا پروکسی: از پروکسی برای دانلود بسته های V2Ray استفاده کنید. همان فرمت Curl مانند "socks5: //127.0.0.1: 1080" یا "http://127.0.0.1:3128".
  • -f یا --force: نیروی نصب. اسکریپت فرض می کند V2Ray در همه نصب نشده است.
  • - نسخه: نسخه نصب شده، مانند "v1.13". مقدار پیش فرض آخرین نسخه پایدار است.
  • محلی: از یک بسته محلی برای نصب استفاده کنید.

مثال ها:

  • برای نصب آخرین بسته از SOCKS proxy 127.0.0.1:1080 استفاده کنید: ./go.sh -p socks5://127.0.0.1:1080
  • نصب فایل v1.13 از فایل محلی:./go.sh --version v1.13 --local /path/to/v2ray.zip

داكر

V2Ray تصاویر 2 بارانداز را فراهم می کند:

2 تصویر دارای ساختار مشابهی با نصب لینوکس است.

================================================ FILE: fa/welcome/license.md ================================================ --- refcn: chapter_00/license refen: welcome/license --- # License Project V uses the following license. ## V2Ray Source code and official releases are licensed under MIT license, including the source code and releases in the following repository. * [v2ray/v2ray-core](https://www.github.com/v2ray/v2ray-core/) * [v2ray/ext](https://www.github.com/v2ray/ext) ## V2Ray.Com Official website, [v2ray.com](https://www.v2ray.com/), is licensed under [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). * Including all visible text and pictures on the website. * Including Project V logo. * Including all source code that is used for generating the website, i.e., [v2ray/manual](https://www.github.com/v2ray/manual). ## Screenshot and other files {#screenshots} All third party files listed below belong to their creator. Whoever creates the file owns the file. * Including all screenshots of Project V. * Including all configuration files that are used to run Project V. * Including all logs generated by Project V during runtime. ## Other content {#other} All content that are not mentioned above will be licensed case by case. ================================================ FILE: fa/welcome/pgp.md ================================================ --- refcn: chapter_00/pgp refen: welcome/pgp --- # Private Communication Please send a message to one of the address below, if you'd like to talk to V2Ray team privately. 1. `love@v2ray.com` 2. `v2ray@protonmail.com` \#1 is based on Gmail. If you concern the privacy of email content, please consider using the PGP public key below. \#2 is based on ProtonMail which employs end to end encryption already. Sadly due to high workload, it is not promised that every email gets replied. Sorry for the inconvenience. For questions regarding the usage of V2Ray, please [discuss it with our community](../get_started/issue.md) for quick response. ```text -----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu 3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85 c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs 0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF 5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG 1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5 iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe 3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB 8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/ ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y 1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+ GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/ KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/ b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV 9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt 6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+ 2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6 U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt PeRpd1GUXXeoGCw= =To5T -----END PGP PUBLIC KEY BLOCK----- ``` ================================================ FILE: fa/welcome/start.html ================================================ شروع سریع · Project V

شروع سریع

شما باید V2Ray را پس از نصب آن پیکربندی کنید. در اینجا یک پیکربندی سریع برای اجرا نسخه ی نمایشی است. لطفا برای تنظیمات پیشرفته تر پیکربندی ببینید.

مشتری

در کامپیوتر شما (یا موبایل)، V2Ray را با تنظیمات زیر اجرا کنید.

{
  "inbounds": [{
    "port": 1080,  // Port of socks5 proxy. مرورگر خود را برای استفاده از این پورت بنویسید
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "server", // Address of your V2Ray server. ممکن است نشانی IP یا آدرس دامنه باشد.
        "port": 10086,  // Port of your V2Ray server.
        "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
      }]
    }
  },{
    "protocol": "freedom",
    "tag": "direct",
    "settings": {}
  }],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [{
      "type": "field",
      "ip": ["geoip:private"],
      "outboundTag": "direct"
    }]
  }
}

لطفا آدرس آی پی سرور V2Ray خود را همانطور که در بالا ذکر شد تغییر دهید. پس از آن، فرآیند V2Ray در رایانه شما تمام ترافیک سرور V2Ray را به جز ترافیک داخل شبکه پروکسی می کند.

سرور

شما برای اجرای V2Ray به عنوان یک سرور نیاز به یک رایانه دیگر دارید. معمولا این کامپیوتر در خارج از فایروال قرار دارد. در اینجا یک پیکربندی نمونه است.

{
  "inbounds": [{
    "پورت": 10086، // پورت سرور. باید همانند بالا باشد.
    "پروتکل": "vmess"،
    "تنظیمات": {
      "مشتری": [{"id": "b831381d-6324-4d53-ad4f-8cda48b30811"}]
    }
  }]،
  خروجی: [ {
    "پروتکل": "آزادی"،
    "تنظیمات": {}
  }]
}

لطفا مطمئن شوید که فیلد id بین مشتری و سرور یکسان است.

در حال اجرا

  • در ویندوز و macOS، فایل پیکربندی در دایرکتوری مشابه VineRay باینری قرار دارد. شما ممکن است v2ray یا v2ray.exe بدون پارامترهای دیگر اجرا کنید.
  • در لینوکس، فایل پیکربندی معمولا در /etc/v2ray/config.jsonواقع شده است. اجرا v2ray --config = / etc / v2ray / config.json در پیش زمینه و یا از ابزارهای دیگر مانند systemd برای اجرای V2Ray به عنوان فرایند پس زمینه استفاده کنید.

برای جزئیات بیشتر از پیکربندی، بررسی مشاهده کنید.

================================================ FILE: fa/welcome/tg.md ================================================ --- refcn: chapter_00/tg refen: welcome/tg --- # Telegram Group Project V provides the following groups for different type of discussions. 1. [Usage](https://t.me/v2fly_chat): For Project V usages. 2. [Others](https://t.me/joinchat/DNcazUIYaH80uVfeS716jg): Other topics. Please also follow [Project V Announcement](https://t.me/v2fly) for news. ## Rules Allowed/banned topics are listed as below. | / | Usage | Other | | ---------------------:|:--------------------------------:|:--------------------------------:| | Project V development | ✔ | ✔ | | Algorithm | ✔ | ✔ | | Computer network | ✔ | ✔ | | Censorship avoidance | ✔ | ✔ | | V2Ray usage | ✔ | ✔ | | V2Ray deployment | ✔ | ✔ | | Related software | ✔ | ✔ | | Nonsense pictures | ✘✘ | ✔ | | Politics | ✘ | ✔ | | Chit-chat | ✘ | ✔ | | Advertisement | ✘✘ | ✘✘ | | 18+ | ✘✘✘ | ✘✘✘ | | Hate speech | ✘✘✘ | ✘✘✘ | | Identity theft | ✘✘✘✘ | ✘✘✘✘ | ### Procedure for violations 1. All ✘ content will be delete immediately after notice. 2. Senders for all ✘✘ content will be banned for a week. 3. Senders for all ✘✘✘ content will be banned for a month. 4. Sender for all ✘✘✘✘ content will be banned for good. ================================================ FILE: fa/welcome/versions.html ================================================ تاریخچه نسخه · Project V

تاریخچه نسخه

This page lists regular releases with feature updates. If a Github release doesn't appear here, it usually only contains bug fixes.

2019.03.01 v4.18

  • Port list in routing rules now supports mixed format.
  • Updated geosite information in routing, and description for static hosts in DNS.
  • Option to not use system root CAs for TLS handshake.
  • New routing rule for traffic attributes.

2019.02.22 v4.17

  • New sub-command tlsping in V2Ctl.

2019.02.15 v4.16

For end users:

  • DNS outbound proxy now supports to modify DNS server info.

For developers:

  • 'ext' repository is now deprecated. #1541

2019.02.08 v4.15

  • DNS outbound proxy.

2019.02.01 v4.14

  • Static DNS mapping now supports domain to domain mapping.

2019.01.18 v4.13

  • Quic lib updated. It is not compatible with previous versions.
  • DNS now have tag settings.

2019.01.11 v4.11

For developers:

2018.12.07 v4.8

For end users:

  • Bug fixes

For developers:

2018.11.30 v4.7

  • Freedom now supports for dialing IPv4 or IPv6 address only.
  • New QUIC transport.

2018.11.23 v4.6

  • Freedom now can automatically choose between IPv4 and IPv6 destination address, based on SendThrough settings.

2018.11.16 v4.4

  • Load balancer rules in routing.
  • Memory usage gets optimized.

2018.11.05 v4.1

  • JSON configuration format changes. Old format is still suported.
  • Performance on GeoIP matching is improved.

2018.11.02 v4.0

  • Reverse proxy.
  • Release packages for ppc64 and ppc64le.

2018.10.12 v3.47

  • Migrate to a new continuous delivery pipeline

2018.09.28 v3.44

  • Dokodemo-door now supports TProxy in Linux.

2018.09.21 v3.43

  • DNS now supports on-demand queries by domain.

2018.09.14 v3.40

  • New socket options in transport configuration. It can be used to setup VPNs.
  • New TCP Fast Open option in transport configuration.

2018.09.03 v3.38

  • mKCP has a new WireGuard header.
  • Fix softfloat binaries in mips/mips64.

2018.08.31 v3.37

  • Performance of reading network connection in optilized. See Environment Variables
  • VMess uses AES-128-GCM by default on ARM64.
  • Built by Go 1.11.

2018.08.24 v3.36

  • Great performance improvement on subdomain matching (domain:) in routing.
  • Full domain matching is now supported in routing.

2018.08.07 v3.34

  • Better memory management on most devices.

2018.07.27 v3.32

  • BitTorrent traffic can now be sniff'ed.
  • New protocol option in routing rules for protocol-based routing.
  • New geosite:speedtest option in routing rules to match all public servers of speedtest.net.

2018.07.20 v3.31

2018.07.13 v3.30

  • Fix an issue that may cause broken connections in mKCP.
  • Thanks to our friends who speak Russian. Now our documents are in Russian.

2018.07.06 v3.29

  • New inbound and outbound for MTProto proxy.

2018.06.29 v3.27

  • DNS now supports EDNS client subnet.
  • DNS static host now supports sub-domain matching.

2018.06.15 v3.26

  • Add Dragonfly BSD release.

2018.06.01 v3.24

  • Internal buffer size (per connection) can now be configured in JSON configuration.
  • mKCP now supports DTLS 1.2 header.
  • TLS transport now only support cipher suites in TLS 1.3 spec.

2018.05.25 v3.23

  • In JSON configuration, port can now be specified from env variables.
  • JSON config now supports to load domains and IPs from specified files.

2018.04.20 v3.19

  • Traffic stats for inbound proxies.

2018.04.13 v3.17

  • V2Ray can load config file from HTTP(s).
  • TLS in V2Ray can issue new certificates by provided CA certificates for domains in incoming requests.
  • HTTP/2 transport.

2018.04.06 v3.16

  • Statistics.
  • Shadowsocks inbound now can be configured to only listen on UDP. Strongly recommend to not listen on both TCP and UDP on the same port.

2018.03.02 v3.11

  • A new settings is introduced in VMess inbound, to forbid client using insecure encryption methods.
  • Offers ARMv7 release.
  • Offers MIPS release that doesn't require FPU.

2018.02.23 v3.10

  • Log entries now contain session ID to distinguish proxy sessions.
  • Bug fixes.

2018.02.15 v3.9

  • Happy New Year!
  • Bug fixes.

2018.02.09 v3.7

2017.12.29 v3.5

  • Geoip now supports private network address under name "private".

2017.12.22 v3.4

  • Websocket nows uses value of X-Forwarded-For header as source address.
  • Support s390x CPU architecture.

2017.12.08 v3.1

  • Support policy.
  • Config file location can be specified via environment variable.

2017.12.01 v3.0

  • Support Shadowsocks AEAD

2017.11.18 v2.50

  • v2ray now tried to use v2ctl for configuration parsing. Please make sure these 2 files are in the same directory.
  • New IPOnDemand strategy in routing.

2017.11.10 v2.47

  • geosite data is now in geosite.dat file.
  • Bug fixes.

2017.11.03 v2.46

  • Router now supports geosite:cn, equivalent to existing chinasites, but more flexible.
  • Router now supports geoip.
    • File geoip.dat is added to release packages. This file contains all geoip information and has to stay in the same directory of v2ray program. Due to delayed update of installation script, you may have to copy the file manually.
  • Program v2ctl is added to release packages. You may run v2ctl verify /path/to/v2ray to verify the signature of v2ray program.

2017.10.27 v2.44

  • HTTP now supports Basic Authentication.
  • Some bugs are fixed.

2017.10.06 v2.40

  • Fix an issue that causes memory leak.

2017.09.29 v2.39

  • Inbound proxies now close connections more quickly when remote server closes them.
  • Default connection timeout changes to 5 minutes.

2017.05.12 v2.27

  • New domain mode in router.

2017.05.05 v2.26

  • Stability fixes.

2017.04.28 v2.25

  • Simple sniffing on HTTP and TLS traffic for the actual domain on request.

2017.04.21 v2.24

  • Stabilize Mux.
  • Improves memory efficiency.

2017.04.15 v2.23

  • Performance improvement in Mux.
  • Max number of connections can be configured in Mux now.
  • Performance improvement in HTTP inbound.
  • connectionReuse setting is removed in favor of Mux.

2017.04.08 v2.22

  • Mux.Cool protocol.

2017.02.25 v2.20

  • GPG signature is added to download package.
  • New binary wv2ray.exe is added to Windows package, which runs as a background application.

2017.02.18 v2.19

  • A new mechanism for anti reply attack is now enforced on server side.
    • No impact to existing clients.
  • Upgrade of VMess AES-128-GCM / Chacha20-Poly1305 / None encryption methods.
    • Please upgrade client and server at once.
    • AES-128-CFB is not affected.
  • Built with Golang 1.8. Add 32-bit MIPS support.

2017.02.11 v2.18

  • Cleanup WebSocket code.
  • Remove allowPassive option. Now passive connections are always allowed.
  • Bug fixes

2017.02.04 v2.17

  • Bug fixes.

2017.01.28 v2.16

  • New 'redirect' option in freedom. It can be used to adapt tools like Shadowsocks Obfs.
  • Performance improvement in VMess non-encryption mode. Not compatible with previous versions.
  • Happy New Year!

2017.01.16 v2.15

  • All proxies can use mKCP and WebSocket now.

2017.01.09 v2.14

  • Socks 5 outbound.
  • Bug fixes.

2017.01.02 v2.13

  • Bug fixes.

2016.12.26 v2.12

  • Bug fixes.

2016.12.19 v2.11

  • JSON config file now supports comment.

2016.12.12 v2.10

  • VMess now supports AES-GCM and ChaCha20-Poly1305 encryption methods.

2016.12.05 v2.9

  • Fix compatibility with Alpine Linux.

2016.11.28 v2.8

  • Shadowsocks server now accepts OTA settings.
  • Bug fixes.

2016.11.21 v2.7

  • Main inbound and outbound connection handler can be tagged now.
  • Bug fixes.

2016.11.14 v2.6

  • Data sent by one outbound can be proxied to another outbound.
  • Routing can be based on inbound tag.

2016.11.07 v2.5

  • New Shadowsocks outbound;
  • New TCP header: HTTP;

2016.10.24 v2.4

  • TCP / mKCP / WebSocket can be configured per inbound / outbound;
  • Routing can be done on source IP;

2016.10.17 v2.3

  • Introduce new Protobuf-based configuration;
  • OpenBSD binaries;
  • Small fixes;

2016.09.19 v2.2

2016.09.19 v2.1

  • mKCP performance improvement;

2016.08.20 v2.0

  • One year;

2016.08.15 v1.24

  • New mKCP header: utp;
  • New option in inbound connection config "allowPassive" to allow passive connection;

2016.08.08 v1.23

  • Optimize mKCP packet format. This version of mKCP is NOT compatible with previous ones;
  • mKCP can now be configured to disguise as video data.

2016.08.01 v1.22

  • Fix a memory leak in mKCP;
  • Add FreeBSD release;

2016.07.25 v1.21

  • High performance Chacha20 (Thanks to aead@);
  • Bug fixes;

2016.07.18 v1.20

  • New KCP options: readBufferSize and writeBufferSize;
  • Bug fixes;

2016.07.11 v1.19

  • Enable TLS option for all proxies;
  • Fix a performance issue in KCP;
  • Fix an issue in KCP that could cause EOF response;

2016.07.04 v1.18

  • Fix a "too many open files" issue in KCP;
  • KCP now uses fewer CPU;
  • Other bug fixes;

2016.06.19 v1.17

2016.06.12 v1.16

  • TCP connection reuse is now enabled by default;
  • Dokodemo-door is able to recognize TCP connection redirected by iptables;
  • Blackhole is able to send back HTTP forbidden data;

2016.06.05 v1.15

  • Optionally reuse TCP connection for better performance;
  • Allow listening on a specific IP address;
  • Allow sending data through a specific IP address;
  • Fix an issue in HTTP proxy that may exhaust memory;

2016.05.29 v1.14

  • Fix a panic issue in http proxy;
  • More functionalies in install script;
  • Static route in DNS;
  • Official server address change;

2016.05.16 v1.13

  • Internal DNS server, to provide better routing results combined with chinasites and chinaip;
  • Fix an issue in UDP relay;

2016.05.01 v1.12.1

  • Fix a bug in VMess.

2016.05.01 v1.12

  • Second try to fix the memory usage issue;
  • Improve Shadowsocks performance;
  • New option "none" in loglevel;

2016.04.18 v1.11

  • Try to fix the memory usage issue.

2016.03.07 v1.10

  • Fix an performance issue when dynamic ports refreshes.

2016.02.29 v1.9.1

  • Fix Shadowsocks one-time authentication (OTA) issue.

2016.02.29 v1.9

  • Support for Shadowsocks ChaCha20 encryption;
  • Add more direct connection sites to the default configuration file;
  • Dynamic ports now automatically create an account.

2016.02.22 v1.8

  • Update installation script install-release.sh (thanks, @netcookies):
    • You can now automatically stop the V2Ray process and update automatically after the completion of V2Ray;
    • The install-release.sh accepts the --proxy argument and V2Ray specified proxy download;
  • Use Go 1.6 compiler to improve the performance of AES encryption;
  • Minor fixes;
  • Update the official server IP (please re-download the installation package to get the latest configuration).

2016.02.08 v1.7

  • UDP relay performance improved;
  • Shadowsocks security improved;
  • Minor fixes;
  • Happy new year!
================================================ FILE: fa/welcome/workflow.html ================================================ گردش کار · Project V

گردش کار

تنها سرور

همانند سایر پروکسی ها، شما نیاز به یک پروکسی سرور دارید که V2Ray را اجرا می کند. سپس شما می توانید از طریق آن سرور از طریق کامپیوتر، تلفن همراه یا سایر دستگاه های خود به اینترنت متصل شوید.

graph LR; A(PC) -.- B(Firewall); B -.-> C(Blocked Website); A --> D(V2Ray/VPS); D --> C; A --> E(Normal Website);

V2Ray supports connections from multiple devices at the same time, with optionally different protocols. In the mean time, the local routing mechanism can smartly proxy necessary connections only.

پل سرور

In the case you don't want configuration V2Ray on each of your devices, you may setup a server within the firewall, and then all traffic go through that server. The server does routing itself.

graph LR; A(PC) -.-> B(Firewall); B -.-> C(Blocked Website); A --> D(VPS 1); D --> E(VPS 2); E --> C; D --> F(Normal Website);

داخلی

The internal of V2Ray looks like below. It supports multiple inbound proxies, and multiple outbounds. Each of them are independent from others.

graph LR; A1(inbound) --> D(Dispatcher / Router / DNS); A2(inbound) --> D; A3(inbound) --> D; A4(inbound) --> D; D --> B1(outbound); D --> B2(outbound); D --> B3(outbound); D --> B4(outbound);

Notes:

  • شما باید حداقل یک ورودی و یک خروجی را پیکربندی کنید تا V2Ray به درستی کار کند.
  • پروکسی ورودی با نرم افزار کلاینت مانند مرورگر ارتباط برقرار می کند.
  • پروکسی خروجی ارتباط با سرور از راه دور، مانند آپاچی برای وب سایت.
  • توزیع کننده مسئول انتخاب یک خروجی برای یک اتصال داده شده بر اساس قوانین قابل تنظیم است.

Detailed configuration can be found here.

================================================ FILE: gitbook/gitbook-plugin-anchors/plugin.css ================================================ a.plugin-anchor { color: inherit !important; display: none; margin-left: -30px; padding-left: 40px; cursor: pointer; position: absolute; top: 0; left: 0; bottom: 0; } a.plugin-anchor i { margin-left: -30px; font-size: 15px !important; } h1, h2, h3, h4, h5, h6 { position: relative; } h1:hover a.plugin-anchor, h2:hover a.plugin-anchor, h3:hover a.plugin-anchor, h4:hover a.plugin-anchor, h5:hover a.plugin-anchor, h6:hover a.plugin-anchor { display: inline-block; } .book .book-body .page-wrapper .page-inner section.normal { overflow: visible; } ================================================ FILE: gitbook/gitbook-plugin-ga/plugin.js ================================================ require(["gitbook"], function(gitbook) { // Load analytics.js gitbook.events.bind("start", function(e, config) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); var cfg = config.ga; ga('create', cfg.token, cfg.configuration); }); // Notify pageview gitbook.events.bind("page.change", function() { ga('send', 'pageview', window.location.pathname+window.location.search); }); }); ================================================ FILE: gitbook/gitbook-plugin-hints/plugin-hints.css ================================================ .hints-icon { display: table-cell; padding-right: 15px; padding-left: 5px; } .hints-container { display: table-cell; } ================================================ FILE: gitbook/gitbook-plugin-mermaid-gb3/book/plugin.js ================================================ require([ 'gitbook' ], function (gitbook) { gitbook.events.bind('page.change', function () { mermaid.init(); }); }); ================================================ FILE: gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #ECECFF; stroke: #CCCCFF; stroke-width: 1px; } .arrowheadPath { fill: #333333; } .edgePath .path { stroke: #333333; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #ffffde !important; rx: 4 !important; stroke: #aaaa33 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #CCCCFF; fill: #ECECFF; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #CCCCFF; fill: #ECECFF; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #CCCCFF; } .note { stroke: #aaaa33; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: rgba(102, 102, 255, 0.49); } .section2 { fill: #fff400; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #8a90dd; stroke: #534fbc; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #bfc7ff; stroke: #534fbc; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #bfc7ff; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #9370DB; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #ECECFF; stroke: #9370DB; } g.classGroup line { stroke: #9370DB; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #ECECFF; opacity: 0.5; } svg .classLabel .label { fill: #9370DB; font-size: 10px; } .relation { stroke: #9370DB; stroke-width: 1; fill: none; } .composition { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .aggregation { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationStart { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationEnd { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #dependencyStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #dependencyEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #ffffde; border: 1px solid #aaaa33; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.forest.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { font-family: 'trebuchet ms', verdana, arial; color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #cde498; stroke: #13540c; stroke-width: 1px; } .arrowheadPath { fill: green; } .edgePath .path { stroke: green; stroke-width: 1.5px; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #cdffb2 !important; rx: 4 !important; stroke: #6eaa49 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #13540c; fill: #cde498; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #326932; fill: #cde498; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #326932; } .note { stroke: #6eaa49; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: #6eaa49; } .section2 { fill: #6eaa49; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #487e3a; stroke: #13540c; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #cde498; stroke: #13540c; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #cde498; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #13540c; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #cde498; stroke: #13540c; } g.classGroup line { stroke: #13540c; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #cde498; opacity: 0.5; } svg .classLabel .label { fill: #13540c; font-size: 10px; } .relation { stroke: #13540c; stroke-width: 1; fill: none; } .composition { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .aggregation { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationStart { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationEnd { fill: #cde498; stroke: #13540c; stroke-width: 1; } #dependencyStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #dependencyEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #cdffb2; border: 1px solid #6eaa49; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-a11y-dark.css ================================================ /** * a11y-dark theme for JavaScript, CSS, and HTML * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css * @author ericwbailey */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: 0.5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #d4d0ab; } .token.punctuation { color: #fefefe; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ffa07a; } .token.boolean, .token.number { color: #00e0e0; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #abe338; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #00e0e0; } .token.atrule, .token.attr-value, .token.function { color: #ffd700; } .token.keyword { color: #00e0e0; } .token.regex, .token.important { color: #ffd700; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } @media screen and (-ms-high-contrast: active) { code[class*="language-"], pre[class*="language-"] { color: windowText; background: window; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: window; } .token.important { background: highlight; color: window; font-weight: normal; } .token.atrule, .token.attr-value, .token.function, .token.keyword, .token.operator, .token.selector { font-weight: bold; } .token.attr-value, .token.comment, .token.doctype, .token.function, .token.keyword, .token.operator, .token.property, .token.string { color: highlight; } .token.attr-value, .token.url { font-weight: normal; } } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-atom-dark.css ================================================ /** * atom-dark theme for `prism.js` * Based on Atom's `atom-dark` theme: https://github.com/atom/atom-dark-syntax * @author Joe Gibson (@gibsjose) */ code[class*="language-"], pre[class*="language-"] { color: #c5c8c6; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #1d1f21; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #7C7C7C; } .token.punctuation { color: #c5c8c6; } .namespace { opacity: .7; } .token.property, .token.keyword, .token.tag { color: #96CBFE; } .token.class-name { color: #FFFFB6; text-decoration: underline; } .token.boolean, .token.constant { color: #99CC99; } .token.symbol, .token.deleted { color: #f92672; } .token.number { color: #FF73FD; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #A8FF60; } .token.variable { color: #C6C5FE; } .token.operator { color: #EDEDED; } .token.entity { color: #FFFFB6; /* text-decoration: underline; */ } .token.url { color: #96CBFE; } .language-css .token.string, .style .token.string { color: #87C38A; } .token.atrule, .token.attr-value { color: #F9EE98; } .token.function { color: #DAD085; } .token.regex { color: #E9C062; } .token.important { color: #fd971f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-base16-ateliersulphurpool.light.css ================================================ /* Name: Base16 Atelier Sulphurpool Light Author: Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) Prism template by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/prism/) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #f5f7ff; color: #5e6687; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #dfe2f1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #dfe2f1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #898ea4; } .token.punctuation { color: #5e6687; } .token.namespace { opacity: .7; } .token.operator, .token.boolean, .token.number { color: #c76b29; } .token.property { color: #c08b30; } .token.tag { color: #3d8fd1; } .token.string { color: #22a2c9; } .token.selector { color: #6679cc; } .token.attr-name { color: #c76b29; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #22a2c9; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #ac9739; } .token.statement, .token.regex, .token.atrule { color: #22a2c9; } .token.placeholder, .token.variable { color: #3d8fd1; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #202746; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c94922; } .token.entity { cursor: help; } pre > code.highlight { outline: 0.4em solid #c94922; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #dfe2f1; } .line-numbers-rows > span:before { color: #979db4; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(107, 115, 148, 0.2); background: -webkit-linear-gradient(left, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); background: linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-cb.css ================================================ /* * Based on Plugin: Syntax Highlighter CB * Plugin URI: http://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js * Description: Highlight your code snippets with an easy to use shortcode based on Lea Verou's Prism.js. * Version: 1.0.0 * Author: c.bavota * Author URI: http://bavotasan.comhttp://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js/ */ /* http://cbavota.bitbucket.org/syntax-highlighter/ */ /* ===== ===== */ code[class*="language-"], pre[class*="language-"] { color: #fff; text-shadow: 0 1px 1px #000; font-family: Menlo, Monaco, "Courier New", monospace; direction: ltr; text-align: left; word-spacing: normal; white-space: pre; word-wrap: normal; line-height: 1.4; background: none; border: 0; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"] code { float: left; padding: 0 15px 0 0; } pre[class*="language-"], :not(pre) > code[class*="language-"] { background: #222; } /* Code blocks */ pre[class*="language-"] { padding: 15px; margin: 1em 0; overflow: auto; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 5px 10px; line-height: 1; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797979; } .token.selector, .token.operator, .token.punctuation { color: #fff; } .token.namespace { opacity: .7; } .token.tag, .token.boolean { color: #ffd893; } .token.atrule, .token.attr-value, .token.hex, .token.string { color: #B0C975; } .token.property, .token.entity, .token.url, .token.attr-name, .token.keyword { color: #c27628; } .token.regex { color: #9B71C6; } .token.entity { cursor: help; } .token.function, .token.constant { color: #e5a638; } .token.variable { color: #fdfba8; } .token.number { color: #8799B0; } .token.important, .token.deliminator { color: #E45734; } /* Line highlight plugin */ pre[data-line] { position: relative; padding: 1em 0 1em 3em; } .line-highlight { position: absolute; left: 0; right: 0; margin-top: 1em; /* Same as .prism's padding-top */ background: rgba(255,255,255,.2); pointer-events: none; line-height: inherit; white-space: pre; } .line-highlight:before, .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .3em; left: .6em; min-width: 1em; padding: 0 .5em; background-color: rgba(255,255,255,.3); color: #fff; font: bold 65%/1.5 sans-serif; text-align: center; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; text-shadow: none; } .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } /* for line numbers */ .line-numbers-rows { margin: 0; } .line-numbers-rows span { padding-right: 10px; border-right: 3px #d9d336 solid; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-darcula.css ================================================ /** * Darcula theme * * Adapted from a theme based on: * IntelliJ Darcula Theme (https://github.com/bulenkov/Darcula) * * @author Alexandre Paradis * @version 1.0 */ code[class*="language-"], pre[class*="language-"] { color: #a9b7c6; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { color: inherit; background: rgba(33,66,131,.85); } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { color: inherit; background: rgba(33,66,131,.85); } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.cdata { color: #808080; } .token.delimiter, .token.boolean, .token.keyword, .token.selector, .token.important, .token.atrule { color: #cc7832; } .token.operator, .token.punctuation, .token.attr-name { color: #a9b7c6; } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: #e8bf6a; } .token.entity, .token.number, .token.symbol { color: #6897bb; } .token.property, .token.constant, .token.variable { color: #9876aa; } .token.string, .token.char { color: #6a8759; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: #ffc66d; } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #294436; } .token.deleted { background: #484a4a; } /*code.language-css .token.punctuation { color: #cc7832; }*/ code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-dracula.css ================================================ /** * Dracula Theme originally by Zeno Rocha [@zenorocha] * https://draculatheme.com/ * * Ported for PrismJS by Albert Vallverdu [@byverdu] */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #282a36; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6272a4; } .token.punctuation { color: #f8f8f2; } .namespace { opacity: .7; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ff79c6; } .token.boolean, .token.number { color: #bd93f9; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #50fa7b; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #f8f8f2; } .token.atrule, .token.attr-value, .token.function, .token.class-name { color: #f1fa8c; } .token.keyword { color: #8be9fd; } .token.regex, .token.important { color: #ffb86c; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-duotone-dark.css ================================================ /* Name: Duotone Dark Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-evening-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2734; color: #9a86fd; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6a51e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6a51e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6c6783; } .token.punctuation { color: #6c6783; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #e09142; } .token.property, .token.function { color: #9a86fd; } .token.tag-id, .token.selector, .token.atrule-id { color: #eeebff; } code.language-javascript, .token.attr-name { color: #c4b9fe; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #ffcc99; } .token.placeholder, .token.variable { color: #ffcc99; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #eeebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c4b9fe; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #8a75f5; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c2937; } .line-numbers-rows > span:before { color: #3c3949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(224, 145, 66, 0.2); background: -webkit-linear-gradient(left, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); background: linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-duotone-earth.css ================================================ /* Name: Duotone Earth Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-earth-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #322d29; color: #88786d; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6f5849; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6f5849; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6a5f58; } .token.punctuation { color: #6a5f58; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #bfa05a; } .token.property, .token.function { color: #88786d; } .token.tag-id, .token.selector, .token.atrule-id { color: #fff3eb; } code.language-javascript, .token.attr-name { color: #a48774; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fcc440; } .token.placeholder, .token.variable { color: #fcc440; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #fff3eb; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #a48774; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #816d5f; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #35302b; } .line-numbers-rows > span:before { color: #46403d; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(191, 160, 90, 0.2); background: -webkit-linear-gradient(left, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); background: linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-duotone-forest.css ================================================ /* Name: Duotone Forest Author: by Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-forest-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2d2a; color: #687d68; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #435643; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #435643; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #535f53; } .token.punctuation { color: #535f53; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #a2b34d; } .token.property, .token.function { color: #687d68; } .token.tag-id, .token.selector, .token.atrule-id { color: #f0fff0; } code.language-javascript, .token.attr-name { color: #b3d6b3; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #e5fb79; } .token.placeholder, .token.variable { color: #e5fb79; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #f0fff0; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #b3d6b3; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #5c705c; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c302c; } .line-numbers-rows > span:before { color: #3b423b; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(162, 179, 77, 0.2); background: -webkit-linear-gradient(left, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); background: linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-duotone-light.css ================================================ /* Name: Duotone Light Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-morning-light.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #faf8f5; color: #728fcb; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #faf8f5; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #faf8f5; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #b6ad9a; } .token.punctuation { color: #b6ad9a; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #063289; } .token.property, .token.function { color: #b29762; } .token.tag-id, .token.selector, .token.atrule-id { color: #2d2006; } code.language-javascript, .token.attr-name { color: #896724; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #728fcb; } .token.placeholder, .token.variable { color: #93abdc; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #2d2006; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #896724; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #896724; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #ece8de; } .line-numbers-rows > span:before { color: #cdc4b1; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(45, 32, 6, 0.2); background: -webkit-linear-gradient(left, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); background: linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-duotone-sea.css ================================================ /* Name: Duotone Sea Author: by Simurai, adapted from DuoTone themes by Simurai for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-sea-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #1d262f; color: #57718e; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #004a9e; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #004a9e; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #4a5f78; } .token.punctuation { color: #4a5f78; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #0aa370; } .token.property, .token.function { color: #57718e; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebf4ff; } code.language-javascript, .token.attr-name { color: #7eb6f6; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #47ebb4; } .token.placeholder, .token.variable { color: #47ebb4; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebf4ff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #7eb6f6; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #34659d; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #1f2932; } .line-numbers-rows > span:before { color: #2c3847; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(10, 163, 112, 0.2); background: -webkit-linear-gradient(left, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); background: linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-duotone-space.css ================================================ /* Name: Duotone Space Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-space-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #24242e; color: #767693; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #5151e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #5151e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #5b5b76; } .token.punctuation { color: #5b5b76; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #dd672c; } .token.property, .token.function { color: #767693; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebebff; } code.language-javascript, .token.attr-name { color: #aaaaca; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fe8c52; } .token.placeholder, .token.variable { color: #fe8c52; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #aaaaca; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #7676f4; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #262631; } .line-numbers-rows > span:before { color: #393949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(221, 103, 44, 0.2); background: -webkit-linear-gradient(left, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); background: linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-ghcolors.css ================================================ /** * GHColors theme by Avi Aryan (http://aviaryan.in) * Inspired by Github syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #b3d4fc; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #999988; font-style: italic; } .token.namespace { opacity: .7; } .token.string, .token.attr-value { color: #e3116c; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.entity, .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.property, .token.regex, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-name, .language-autohotkey .token.selector { color: #00a4db; } .token.function, .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.tag, .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.function, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-hopscotch.css ================================================ @import url(https://fonts.googleapis.com/css?family=Fira+Mono); /* * Hopscotch * by Jan T. Sott * https://github.com/idleberg/Hopscotch * * This work is licensed under the Creative Commons CC0 1.0 Universal License */ code[class*="language-"], pre[class*="language-"] { color: #ffffff; font-family: "Fira Mono", Menlo, Monaco, "Lucida Console","Courier New", Courier, monospace; font-size: 16px; line-height: 1.375; direction: ltr; text-align: left; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; background: #322931; color: #b9b5b8; } pre > code[class*="language-"] { font-size: 1em; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797379; } .token.punctuation { color: #b9b5b8; } .namespace { opacity: .7; } .token.null, .token.operator, .token.boolean, .token.number { color: #fd8b19; } .token.property { color: #fdcc59; } .token.tag { color: #1290bf; } .token.string { color: #149b93; } .token.selector { color: #c85e7c; } .token.attr-name { color: #fd8b19; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #149b93; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #8fc13e; } .token.statement, .token.regex, .token.atrule { color: #149b93; } .token.placeholder, .token.variable { color: #1290bf; } .token.important { color: #dd464c; font-weight: bold; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid red; outline-offset: .4em; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-material-dark.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #eee; background: #2f2f2f; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #a5e844; } .token.attribute { color: #a5e844; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.comment { color: #616161; } .token.constant { color: #c792ea; } .token.deleted { color: #ff6666; } .token.doctype { color: #616161; } .token.entity { color: #ff6666; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #616161; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #a5e844; } .token.pseudo-element { color: #a5e844; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #ff6666; } .token.string { color: #a5e844; } .token.symbol { color: #c792ea; } .token.tag { color: #ff6666; } .token.unit { color: #fd9170; } .token.url { color: #ff6666; } .token.variable { color: #ff6666; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-material-light.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #90a4ae; background: #fafafa; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #cceae7; color: #263238; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #cceae7; color: #263238; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #f76d47; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #7c4dff; } .token.attr-name { color: #39adb5; } .token.attr-value { color: #f6a434; } .token.attribute { color: #f6a434; } .token.boolean { color: #7c4dff; } .token.builtin { color: #39adb5; } .token.cdata { color: #39adb5; } .token.char { color: #39adb5; } .token.class { color: #39adb5; } .token.class-name { color: #6182b8; } .token.comment { color: #aabfc9; } .token.constant { color: #7c4dff; } .token.deleted { color: #e53935; } .token.doctype { color: #aabfc9; } .token.entity { color: #e53935; } .token.function { color: #7c4dff; } .token.hexcode { color: #f76d47; } .token.id { color: #7c4dff; font-weight: bold; } .token.important { color: #7c4dff; font-weight: bold; } .token.inserted { color: #39adb5; } .token.keyword { color: #7c4dff; } .token.number { color: #f76d47; } .token.operator { color: #39adb5; } .token.prolog { color: #aabfc9; } .token.property { color: #39adb5; } .token.pseudo-class { color: #f6a434; } .token.pseudo-element { color: #f6a434; } .token.punctuation { color: #39adb5; } .token.regex { color: #6182b8; } .token.selector { color: #e53935; } .token.string { color: #f6a434; } .token.symbol { color: #7c4dff; } .token.tag { color: #e53935; } .token.unit { color: #f76d47; } .token.url { color: #e53935; } .token.variable { color: #e53935; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-material-oceanic.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #c3cee3; background: #263238; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #c3e88d; } .token.attribute { color: #c3e88d; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.color { color: #f2ff00; } .token.comment { color: #546e7a; } .token.constant { color: #c792ea; } .token.deleted { color: #f07178; } .token.doctype { color: #546e7a; } .token.entity { color: #f07178; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; font-style: italic; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #546e7a; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #c3e88d; } .token.pseudo-element { color: #c3e88d; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #f07178; } .token.string { color: #c3e88d; } .token.symbol { color: #c792ea; } .token.tag { color: #f07178; } .token.unit { color: #f07178; } .token.url { color: #fd9170; } .token.variable { color: #f07178; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-pojoaque.css ================================================ /* * Pojoaque Style by Jason Tate * http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html * Based on Solarized Style from http://ethanschoonover.com/solarized * http://softwaremaniacs.org/media/soft/highlight/test.html */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 15px; line-height: 1.5; color: #dccf8f; text-shadow: 0; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre) > code[class*="language-"] { border-radius: 5px; border: 1px solid #000; color: #DCCF8F; background: #181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top; } pre[class*="language-"] { padding: 12px; overflow: auto; } :not(pre) > code[class*="language-"] { padding: 2px 6px; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #586e75; font-style: italic; } .token.number, .token.string, .token.char, .token.builtin, .token.inserted { color: #468966; } .token.attr-name { color: #b89859; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #dccf8f; } .token.selector, .token.regex { color: #859900; } .token.atrule, .token.keyword { color: #cb4b16; } .token.attr-value { color: #468966; } .token.function, .token.variable, .token.placeholder { color: #b58900; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol { color: #b89859; } .token.tag { color: #ffb03b; } .token.important, .token.statement, .token.deleted { color: #dc322f; } .token.punctuation { color: #dccf8f; } .token.entity { cursor: help; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } /* .pojoaque-colors { color: #586e75; color: #b64926; color: #468966; color: #ffb03b; color: #b58900; color: #b89859; color: #dccf8f; color: #d3a60c; color: #cb4b16; color: #dc322f; color: #073642; color: #181914; } */ ================================================ FILE: gitbook/gitbook-plugin-prism/prism-shades-of-purple.css ================================================ /** * Shades of Purple Theme for Prism.js * * @author Ahmad Awais * @support Follow/tweet at https://twitter.com/MrAhmadAwais/ */ code[class*='language-'], pre[class*='language-'] { color: #9efeff; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; font-family: 'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-weight: 400; font-size: 17px; line-height: 25px; letter-spacing: 0.5px; text-shadow: 0 1px #222245; } pre[class*='language-']::-moz-selection, pre[class*='language-'] ::-moz-selection, code[class*='language-']::-moz-selection, code[class*='language-'] ::-moz-selection, pre[class*='language-']::selection, pre[class*='language-'] ::selection, code[class*='language-']::selection, code[class*='language-'] ::selection { color: inherit; background: #a599e9; } /* Code blocks. */ pre[class*='language-'] { padding: 2em; margin: 0.5em 0; overflow: auto; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #1e1e3f; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; } .token { font-weight: 400; } .token.comment, .token.prolog, .token.cdata { color: #b362ff; } .token.delimiter, .token.keyword, .token.selector, .token.important, .token.atrule { color: #ff9d00; } .token.operator, .token.attr-name { color: rgb(255, 180, 84); } .token.punctuation { color: #ffffff; } .token.boolean { color: rgb(255, 98, 140); } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: rgb(255, 157, 0); } .token.entity, .token.symbol { color: #6897bb; } .token.number { color: #ff628c; } .token.property, .token.constant, .token.variable { color: #ff628c; } .token.string, .token.char { color: #a5ff90; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: rgb(250, 208, 0); } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #00ff00; } .token.deleted { background: #ff000d; } code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } .token.class-name { color: #fb94ff; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { background: none; } pre .line-highlight, pre .line-highlight.line-highlight, pre > code.line-highlight { margin-top: 36px; background: linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent); } pre .line-highlight:before, pre > code.line-highlight:before, pre .line-highlight[data-end]:after, pre > code.line-highlight[data-end]:after { content: ''; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-synthwave84.css ================================================ /* * Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code * Demo: https://marc.dev/demo/prism-synthwave84 * * Ported for PrismJS by Marc Backes [@themarcba] */ code[class*="language-"], pre[class*="language-"] { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background-color: transparent !important; background-image: linear-gradient(to bottom, #2a2139 75%, #34294f); } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.block-comment, .token.prolog, .token.doctype, .token.cdata { color: #8e8e8e; } .token.punctuation { color: #ccc; } .token.tag, .token.attr-name, .token.namespace, .token.number, .token.unit, .token.hexcode, .token.deleted { color: #e2777a; } .token.property, .token.selector { color: #72f1b8; text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475; } .token.function-name { color: #6196cc; } .token.boolean, .token.selector .token.id, .token.function { color: #fdfdfd; text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975; } .token.class-name { color: #fff5f6; text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75; } .token.constant, .token.symbol { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; } .token.important, .token.atrule, .token.keyword, .token.selector .token.class, .token.builtin { color: #f4eee4; text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575; } .token.string, .token.char, .token.attr-value, .token.regex, .token.variable { color: #f87c32; } .token.operator, .token.entity, .token.url { color: #67cdcc; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } .token.inserted { color: green; } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-vs.css ================================================ /** * VS theme by Andrew Lock (https://andrewlock.net) * Inspired by Visual Studio syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #C1DEF1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #C1DEF1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #008000; font-style: italic; } .token.namespace { opacity: .7; } .token.string { color: #A31515; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, .language-json .token.number, code[class*="language-css"]{ color: #0000ff; } .token.function { color: #393A34; } .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.class-name, .language-json .token.property { color: #2B91AF; } .token.tag, .token.selector { color: #800000; } .token.attr-name, .token.property, .token.regex, .token.entity { color: #ff0000; } .token.directive.tag .tag { background: #ffff00; color: #393A34; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #a5a5a5; } .line-numbers-rows > span:before { color: #2B91AF; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(193, 222, 241, 0.2); background: -webkit-linear-gradient(left, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); background: linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); } ================================================ FILE: gitbook/gitbook-plugin-prism/prism-xonokai.css ================================================ /** * xonokai theme for JavaScript, CSS and HTML * based on: https://github.com/MoOx/sass-prism-theme-base by Maxime Thirouin ~ MoOx --> http://moox.fr/ , which is Loosely based on Monokai textmate theme by http://www.monokai.nl/ * license: MIT; http://moox.mit-license.org/ */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 2; -o-tab-size: 2; tab-size: 2; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-wrap: normal; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 14px; color: #76d9e6; text-shadow: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre)>code[class*="language-"] { background: #2a2a2a; } pre[class*="language-"] { padding: 15px; border-radius: 4px; border: 1px solid #e1e1e8; overflow: auto; } pre[class*="language-"] { position: relative; } pre[class*="language-"] code { white-space: pre; display: block; } :not(pre)>code[class*="language-"] { padding: 0.15em 0.2em 0.05em; border-radius: .3em; border: 0.13em solid #7a6652; box-shadow: 1px 1px 0.3em -0.1em #000 inset; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6f705e; } .token.operator, .token.boolean, .token.number { color: #a77afe; } .token.attr-name, .token.string { color: #e6d06c; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #e6d06c; } .token.selector, .token.inserted { color: #a6e22d; } .token.atrule, .token.attr-value, .token.keyword, .token.important, .token.deleted { color: #ef3b7d; } .token.regex, .token.statement { color: #76d9e6; } .token.placeholder, .token.variable { color: #fff; } .token.important, .token.statement, .token.bold { font-weight: bold; } .token.punctuation { color: #bebec5; } .token.entity { cursor: help; } .token.italic { font-style: italic; } code.language-markup { color: #f9f9f9; } code.language-markup .token.tag { color: #ef3b7d; } code.language-markup .token.attr-name { color: #a6e22d; } code.language-markup .token.attr-value { color: #e6d06c; } code.language-markup .token.style, code.language-markup .token.script { color: #76d9e6; } code.language-markup .token.script .token.keyword { color: #76d9e6; } /* Line highlight plugin */ pre[class*="language-"][data-line] { position: relative; padding: 1em 0 1em 3em; } pre[data-line] .line-highlight { position: absolute; left: 0; right: 0; padding: 0; margin-top: 1em; background: rgba(255, 255, 255, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } pre[data-line] .line-highlight:before, pre[data-line] .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .4em; left: .6em; min-width: 1em; padding: 0.2em 0.5em; background-color: rgba(255, 255, 255, 0.4); color: black; font: bold 65%/1 sans-serif; height: 1em; line-height: 1em; text-align: center; border-radius: 999px; text-shadow: none; box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); } pre[data-line] .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } ================================================ FILE: gitbook/gitbook.js ================================================ !function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=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)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,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(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(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(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!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,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.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:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.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 A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(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&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(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&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.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):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.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=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.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)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.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,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,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":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.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 de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de("

Project V

Project V 是一个工具集合,它可以帮助你打造专属的基础通信网络。Project V 的核心工具称为V2Ray,其主要负责网络协议和功能的实现,与其它 Project V 通信。V2Ray 可以单独运行,也可以和其它工具配合,以提供简便的操作流程。

本站点主要包含了 V2Ray 的使用手册,以及其它 Project V 相关工具的介绍与链接。

主要特性

  • 多入口多出口: 一个 V2Ray 进程可并发支持多个入站和出站协议,每个协议可独立工作。
  • 可定制化路由: 入站流量可按配置由不同的出口发出。轻松实现按区域或按域名分流,以达到最优的网络性能。
  • 多协议支持: V2Ray 可同时开启多个协议支持,包括 Socks、HTTP、Shadowsocks、VMess 等。每个协议可单独设置传输载体,比如 TCP、mKCP、WebSocket 等。
  • 隐蔽性: V2Ray 的节点可以伪装成正常的网站(HTTPS),将其流量与正常的网页流量混淆,以避开第三方干扰。
  • 反向代理: 通用的反向代理支持,可实现内网穿透功能。
  • 多平台支持: 原生支持所有常见平台,如 Windows、Mac OS、Linux,并已有第三方支持移动平台。

赞助商

v2net

本站点由 GitBook 生成,托管于 GitHub。如需修改本站的内容,请向这个 Repo 提交 Pull Request。

================================================ FILE: ko/awesome/ads.html ================================================ With Ads · Project V

Some Advertisement

The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V.

Self Hosting

Let's Encrypt

Free TLS certificates

Vultr

VPS

2019 limited promotion, $50 free credit

BlueHost

VPS, web hosting

ClouDNS

Domain registration, DNS, SSL certificate

Bandwagon

Well-known VPS provider. Low price for good product.

VPN

BabyDriver

Supports V2Ray. Coupon code: bcb518

喵帕斯

V2Ray support (beta)

Lanan

V2Ray based VPN service. Coupon code: v2ray

V2Net

Customized V2Ray service. Promo code: v2ray.com

Cryptocurrency

LocalBitcoins

Trade Bitcoins offline

CoinCola

OTC market to trade BTC, ETH, BCH, USDT.

Binance

Trading market for crypto currencies.

Coinex

Trading market for crypto currencies.

CoinPayment

Online crypto currency wallet

================================================ FILE: ko/awesome/tools.html ================================================ Awesome V · Project V

Awesome V

Graphic Client

V2RayW

Download: Github

V2RayN

Download: Github

Clash for Windows

Download: Github

V2RayX

Download: Github

V2RayU

Download: Github

V2RayC

Download: Github

ClashX

Download: Github

Qv2ray

Qv2ray: v2ray Cross-Platform GUI written in Qt, supports multi-language, connection edit and auto-check updates

Download: GitHub

Website (Chinese): https://lhy0403.github.io/Qv2ray

Mellow

Mellow is a rule-based global transparent proxy client for Windows, macOS and Linux.

Download: Github

Kitsunebi

Kitsunebi is an iOS app based on V2Ray. It provides full functionality as V2Ray. It also supports importing and exporting V2Ray compatible JSON configuration.

Download: iTunes

i2Ray

i2Ray is another iOS app based on V2Ray with easy-to-use UI design.

Download: iTunes

Shadowrocket

Shadowrocket is a generic VPN app. Is supports multiple protocols such as Shadowsocks, VMess, SSR etc.

Download: iTunes

Pepi (was ShadowRay)

Pepi is V2Ray compatible app. Is is able create VPN connections based on VMess protocol, and communicate with any V2Ray servers.

Download: iTunes

Quantumult

Download: iTunes

BifrostV

BifrostV is an Android app based on V2Ray core. It supports VMess, Shadowsocks, socks protocols.

Download: Play Store | APK Pure

V2RayNG

V2RayNG is an Android app based on V2Ray. It provides same feature set as V2Ray core.

Download: Play Store | GitHub

Online services

Configuration generator

Online configuration generator.

UUID Generator

UUID generator for VMess users.

================================================ FILE: ko/configuration/api.html ================================================ API · Project V

API

V2Ray는 원격 액세스를위한 몇 가지 API를 제공합니다. 이 API는 gRPC기반으로합니다.

API가 활성화되면 V2Ray는 아웃 바운드 프록시를 자동으로 생성하고 태그로 태그를 지정합니다. 사용자는 모든 gRPC 연결을이 아웃 바운드로 라우트해야합니다.

ApiObject

ApiObject 은 최상위 레벨 구성에서 api 필드로 사용됩니다.

{
  "tag": "api",
  "services": [
    "HandlerService",
    "LoggerService",
    "StatsService"
  ]
}

태그: 문자열

아웃 바운드 프록시의 태그입니다.

서비스: \ [string ]

사용 가능한 API 목록입니다.

지원되는 API 목록

HandlerService

인바운드 및 아웃 바운드 프록시를 조작하기위한 API 다음과 같은 기능이 제공됩니다.

  • 새로운 인바운드 / 아웃 바운드 프록시를 추가하십시오.
  • 기존의 인바운드 / 아웃 바운드 프록시를 제거합니다.
  • 인바운드 프록시에 새 사용자를 추가합니다 (VMess 전용).
  • 인바운드 프록시에서 기존 사용자를 제거합니다 (VMess 전용).

LoggerService

내부 로거를 다시 시작합니다. 로그 파일을 작동하기위한 logrotate로 작업 할 수 있습니다.

StatsService

내부 통계 지원.

================================================ FILE: ko/configuration/dns.html ================================================ DNS · Project V

DNS

V2Ray에는 다른 구성 요소에 대한 DNS 릴레이를 제공하는 내부 DNS 서버가 있습니다.

Due to the complexity of DNS protocol, V2Ray for now only supports basic IP queries (A and AAAA). We recommend to use a professional DNS rely (such as CoreDNS) for V2Ray.

The DNS queries relayed by this DNS service will also be dispatched based on routing settings. No extra configuration is required.

DnsObject

DnsObject is used as dns field in top level configuration.

{
  "hosts": {
    "baidu.com": "127.0.0.1"
  },
  "servers": [
    {
      "address": "1.2.3.4",
      "port": 5353,
      "domains": [
        "domain:v2ray.com"
      ]
    },
    "8.8.8.8",
    "8.8.4.4",
    "localhost"
  ],
  "clientIp": "1.2.3.4",
  "tag": "dns_inbound"
}

hosts: map{string: address}

A list of static addresses, in the form of domain:address. Each entry has a domain name as key and IP or domain address as value. If a DNS query targets one of the domains in this list, the corresponding IP will be returned immediately and DNS query will not be relayed, or the corresponding domain address will be used for further DNS queries, instead of the previous one.

The format of domains is:

  • Plaintext: When the targeting domain is exactly the value, the rule takes effect. Example: rule "v2ray.com" matches "v2ray.com", but not "www.v2ray.com".
  • Regular expression: Begining with "regexp:", the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule "regexp:\\.goo.*\\.com$" matches "www.google.com" and "fonts.googleapis.com", but not "google.com".
  • Subdomain (recommended): Begining with "domain:" and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule "domain:v2ray.com" matches "www.v2ray.com", "v2ray.com", but not "xv2ray.com".
  • Keyword: Begining with "keyword:" and the rest is a pattern. If this string matches any part of the targeting domain, this rule takes effet. Example: rule "keyword:sina.com" matches targeting domain "sina.com", "sina.com.cn" and "www.sina.com", but not "sina.cn".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.

서버: \ [string | ServerObject | "localhost"]

List of DNS servers. Each server may be specified in three formats: IP address, ServerObject, or "localhost".

When a server is an IP address, such as "8.8.8.8", V2Ray queries DNS on UDP port 53 on this address.

When a server is "localhost", V2Ray queries local host for DNS.

When "localhost" is used, out-going DNS traffic is not controlled by V2Ray. However, you may redirect DNS queries back to V2Ray with additional configuration.

clientIp: string

IP address of current machine. If specified, V2Ray uses this IP as EDNS-Client-Subnet. This IP can't be a private address.

tag: string

(V2Ray 4.13+) All traffic initiated from this DNS, except to localhost, will have this tag as inbound. It can be used for routing.

ServerObject

{
  "address": "1.2.3.4",
  "port": 5353,
  "domains": [
    "domain:v2ray.com"
  ],
}

address: address

Address of the DNS server. For now only UDP servers are supported.

port: number

Port of the DNS server. Usually it is 53 or 5353.

domains: [string]

A list of domains. If the domain of enquire matches one of the list, this DNS server will be prioritized for DNS query for this domain.

Domain name format is the same as in routing.

When a DNS server has the domain in its domain list, the domain will be queried in this server first, and then other servers. Otherwise DNS queries are sent to DNS servers in the order they appear in the config file.

================================================ FILE: ko/configuration/env.html ================================================ Env 변수 · Project V

환경 변수

V2Ray는 다음 환경 변수를 읽습니다.

연결 당 캐시 크기

  • 이름 : v2ray.ray.buffer.size 또는 V2RAY_RAY_BUFFER_SIZE
  • 단위 : MB
  • 기본값 : x86, amd64, arm64 및 s390x에서는 2입니다. 다른 플랫폼에서는이 캐시를 사용할 수 없습니다.
  • 특별 값 : 무제한 캐시 크기의 경우 0

Deprecated. Use bufferSize in Policy.

For each connection, when there is a difference in speed between inbound and outbound traffic, V2Ray will cache some data for larger throughput. This setting controls the size of the cache. The larger the cache, the better the performance.

V2Ray 자산의 위치

  • 이름 : v2ray.location.asset 또는 V2RAY_LOCATION_ASSET
  • 기본값 : v2ray가있는 디렉토리와 동일합니다.

This variable specifies a directory where geoip.dat and geosite.dat files are.

V2Ray 구성의 위치

  • 이름 : v2ray.location.config 또는 V2RAY_LOCATION_CONFIG
  • 기본값 : v2ray가있는 디렉토리와 동일합니다.

This variable specifies a directory where config.json is.

분산 형 읽기

  • 이름 : v2ray.buf.readv 또는 V2RAY_BUF_READV
  • 기본값 : 자동

V2Ray 3.37 uses Scatter/Gather IO. This feature will use less memory when connection speed is over 100 MByte/s. Possible values are: auto, enable and disable.

  • 활성화: 분산 읽기 활성화.
  • 해제: 분산 읽기를 비활성화합니다.
  • 자동: CPU가 x86, AMD64 또는 s390x 일 때 Windows, MacOS, Linux에서만 활성화됩니다.

When connection speed is less than 100 MByte/s, no matter whether this is enabled or not, there is no obvious difference in terms of memory usage.

================================================ FILE: ko/configuration/index.html ================================================ 구성 · Project V

구성

V2Ray는 protobuf기반 구성을 사용합니다. protobuf 형식은 읽기 쉽지 않기 때문에 V2Ray는 JSON에서 구성을 지원합니다. V2Ray가 실행되기 전에 JSON 구성이 자동으로 protobuf로 변환됩니다. 즉, 다른 구성 형식이 도입 될 수 있습니다.

여기에서는 JSON 기반 구성을 소개합니다.

JSON 또는 자바 스크립트 객체 표기법은 자바 스크립트의 객체입니다. 하나의 JSON 파일에는 "{"로 시작하고 "}"로 끝나는 단 하나의 JSON 객체 만 들어 있습니다.

JSON 객체는 키 값 쌍의 목록을 포함합니다. 키는 문자열이며 값은 문자열, 숫자, 부울, 배열 또는 다른 객체와 같은 다양한 유형이 될 수 있습니다. 일반적인 객체는 아래와 같습니다.

{
  "stringValue": "This is a string.",
  "numberValue": 42,
  "boolValue": true,
  "arrayValue": ["this", "is", "a", "string", "array"],
  "objectValue": {
    "another": "object"
  }
}

V2Ray supports comments in JSON,annotated by "//" or "/* */". In an editor that doesn't support comments, they may get displayed as errors, but comments actually work fine in V2Ray.

JSON 데이터 유형

Here is a brief introduction of JSON data types. They will be referenced in the rest of docs.

부울: true | 그릇된

Boolean value, has to be either true or false, without quotation mark.

번호

Usually non-negative integers, without quotation mark.

Sequence of characters, surrounded by quotation mark.

배열: []

Array of elements. The type of its elements is usually the same, e.g., [string] is an array of strings.

object: {}

Object. It comes with a list of key value pairs.

A key value pair usually ends with a comma ",", but must not ends with a comma if it is the last element of the object.

V2Ray 일반 데이터 형식

map: object {string, string}

An object whose keys and values have fixed types.

주소: 문자열

An IP or domain address in string form, such as "8.8.8.8" or "www.v2ray.com"

_ 포트: 문자열

An address with port, such as "8.8.8.8:53" or "www.v2ray.com:80". In some usages, the address part can be omitted, like ":443".

================================================ FILE: ko/configuration/mux.html ================================================ 다중 화기 · Project V

멀티플렉싱

멀티플렉싱 또는 멀티플렉싱은 다중 가상 TCP 연결에 하나의 물리적 TCP 연결을 사용하는 것입니다.

Mux는 TCP 핸드 셰이크 대기 시간을 줄 이도록 설계되었습니다. 그것은 높은 처리량을위한 것이 아닙니다. 대용량 파일을 다운로드하거나 속도 측정에 사용할 때 Mux는 일반적으로 일반 TCP 연결보다 느립니다.

MuxObject

{
  "enabled": false,
  "concurrency": 8
}

활성화 됨: true | 그릇된

아웃 바운드에서 Mux를 사용할지 여부.

동시성: 숫자

한 번에 하나의 물리적 연결이 처리 할 수있는 다중화 된 연결의 최대 수입니다. 최대 값 1024, 최소값 1, 기본값 8.

================================================ FILE: ko/configuration/overview.html ================================================ 개요 · Project V

구성 개요

V2Ray는 아래와 같이 서버 측과 클라이언트 측의 구성이 동일합니다. 서버 및 클라이언트 구성은 특정 섹션에서 다릅니다.

아래는 구성의 최상위 레벨 구조입니다. 각 섹션에는 자체 형식이 있습니다.

{
  "log": {},
  "api": {},
  "dns": {},
  "stats": {},
  "routing": {},
  "policy": {},
  "inbounds": [],
  "outbounds": [],
  "transport": {}
}

로그: LogObject

로그 출력을 제어하기위한 로그 구성.

api: ApiObject

V2Ray 인스턴스를 제어하는 ​​RPC API 자세한 내용은 API 구성 을 참조하십시오.

dns: DnsObject

내부 DNS 서버 구성을위한 구성. 이 섹션을 생략하면 V2Ray는 시스템 전체의 DNS 구성을 사용합니다. 자세한 내용은 DNS 구성을 참조하십시오..

stats: StatsObject

지정되면 내부 통계 이 사용됩니다.

정책: PolicyObject

사용 권한 및 기타 보안 전략을위한 구성. 자세한 내용은 로컬 정책참조하십시오.

라우팅: RoutingObject

내부 라우팅 전략을위한 구성.

인바운드: \ [ 인바운드 개체]

인바운드 프록시의 구성으로 InboundObject 배열입니다.

아웃 바운드: \ [ 아웃 바운드 개체]

아웃 바운드 프록시의 구성으로서 OutboundObject 배열입니다. 배열의 첫 번째 아웃 바운드가 주요 아웃 바운드입니다. 라우팅 결정시 기본 아웃 바운드입니다.

전송: 전송 객체

낮은 수준의 전송 프로토콜 구성 자세한 내용은 프로토콜 전송 옵션참조하십시오.

LogObject

{
  "access": "/path/to/file",
  "error": "/path/to/file",
  "loglevel": "warning"
}

액세스: 문자열

로그에 액세스하는 경로입니다. 비어 있지 않은 경우, 법적 파일 경로 여야합니다 같은 "/tmp/v2ray/_access.log"(리눅스), 또는 개의 "C : \\ 온도 \\ v2ray \\ _ access.log의"(윈도우 ). 비어있는 경우 V2Ray는 액세스 로그를 표준 출력씁니다.

오류: 문자열

오류 로그의 경로. 비어 있지 않은 경우 합법적 인 파일 경로 여야합니다. 비어있는 경우 V2Ray는 오류 로그를 표준 출력씁니다.

loglevel: "디버그"| "정보"| "경고"| "오류"| "없음"

기록 할 로그의 레벨. 다른 로그 레벨은 로그의 다른 내용을 나타냅니다. 기본값은 "경고".

로그 수준 :

  • "debug": 개발자 전용 정보. 또한 "info" 로그를 모두 포함합니다.
  • "정보": V2Ray의 현재 상태에 대한 정보. 사용자는 이러한 문제를 처리 할 필요가 없습니다. 또한 "경고" 로그를 모두 포함합니다.
  • "경고": 환경에 문제가 있습니다. 일반적으로 V2Ray 외부에 있습니다 (예 : 네트워크 손상). V2Ray는 계속 실행되지만 사용자가 일부 손상을 입을 수 있습니다. 또한 모든 포함 "오류" 로그.
  • "오류": 뭔가 잘못되었습니다. V2Ray가 전혀 실행되지 않습니다.
  • "none": 모든 로깅을 사용할 수 없습니다.

인바운드 객체

InboundObject는 인바운드 프록시를 정의합니다. V2Ray 로의 수신 연결을 처리합니다. 사용 가능한 프록시는 여기에 나열된 입니다..

{
  "port": 1080,
  "listen": "127.0.0.1",
  "protocol": "protocol_name",
  "settings": {},
  "streamSettings": {},
  "tag": "inbound_tag_name",
  "sniffing": {
    "enabled": false,
    "destOverride": ["http", "tls"]
  },
  "allocate": {
    "strategy": "always",
    "refresh": 5,
    "concurrency": 3
  },
}

포트: 번호 | "env : 변수"| 끈

프록시가 수신 대기하는 포트입니다. 사용할 수있는 형식은 다음과 같습니다.

  • 정수 : 실제 포트 번호.
  • 환경 변수를 시작으로 "ENV는", ENV 변수는 문자열 형식의 포트와 같은 지정 : "PORT ENV를". V2Ray는 변수를 문자열로 디코딩합니다.
  • 문자열 : "1234"과 같은 숫자 문자열 값 또는 총 6 개의 포트에 대해 "5-10" 과 같은 포트 범위.

열려는 실제 포트도 할당 설정에 따라 다릅니다. 아래를 참조하십시오.

듣기: 주소

들릴 주소. 기본값은 "0.0.0.0" 모든 네트워크 인터페이스에서 들어오는 연결합니다. 그렇지 않으면 값은 기존 네트워크 인터페이스의 주소 여야합니다.

프로토콜: 문자열

인바운드 프로토콜의 이름. 사용 가능한 값은 각 개인을 참조하십시오.

설정: InboundConfigurationObject

프로토콜 별 설정. 각 프로토콜에 정의 된 InboundConfigurationObject 참조하십시오.

streamSettings: [StreamSettingsObject]

세부 사항은 프로토콜 전송 옵션 을 참조하십시오.

태그: 문자열

인바운드 프록시의 태그. 라우팅 결정에 사용될 수 있습니다. 비어 있지 않으면 모든 인바운드 프록시 중에서 고유해야합니다.

스니핑: 스니핑 객체

콘텐츠 스니핑을위한 구성.

할당: AllocateObject

포트 할당을위한 구성.

SniffingObject

{
  "enabled": false,
  "destOverride": ["http", "tls"]
}

활성화 됨: true | 그릇된

콘텐츠 스니핑을 사용할지 여부.

destOverride: \ [ "http"| "tls"]

내용 유형의 배열입니다. 들어오는 트래픽의 컨텐트 유형이 목록에 지정되어 있으면 연결 대상이 스니핑 된 값으로 덮어 쓰여집니다.

AllocateObject

{
  "strategy": "always",
  "refresh": 5,
  "concurrency": 3
}

전략: "항상"| "무작위"

포트 할당 전략. "항상"로 설정되면 포트 필드의 모든 포트가 청취에 할당됩니다. "임의" 이 설정된 경우 V2Ray는 동시성 포트를 수신하고 새로 고침 분마다 포트 목록이 다시 채워집니다.

새로 고침: 번호

청취 포트를 새로 고치는 시간 (분)입니다. 최소값은 2입니다. 이 설정은 전략"임의"설정된 경우에만 유효합니다.

동시성: 숫자

수신 대기 포트 수입니다. 최소값은 1입니다. 최대 값은 전체 포트 범위의 1/3입니다.

아웃 바운드 개체

OutboundObject는 나가는 연결을 처리하기위한 아웃 바운드 프록시를 정의합니다. 사용 가능한 프로토콜이 나열됩니다 여기.

{
  "sendThrough": "0.0.0.0",
  "protocol": "protocol_name",
  "settings": {},
  "tag": "this_outbound_tag_name",
  "streamSettings": {},
  "proxySettings": {
    "tag": "another_outbound_tag_name"
  },
  "mux": {}
}

sendThrough: 주소

트래픽을 보내는 IP 주소입니다. 기본값 " "0.0.0.0 " 은 호스트에서 사용 가능한 IP를 무작위로 선택하기위한 것입니다. 그렇지 않으면 값은 기존 네트워크 인터페이스의 IP 주소 여야합니다.

프로토콜: 문자열

이 아웃 바운드의 프로토콜 이름입니다. 사용 가능한 모든 값에 대해서는 프로토콜 을 참조하십시오.

설정: OutboundConfigurationObject

프로토콜 별 설정. 각 개별 프로토콜에서 OutboundConfigurationObject 을 참조하십시오.

태그: 문자열

이 아웃 바운드의 태그입니다. 비어 있지 않으면 모든 아웃 바운드 중에서 고유해야합니다.

streamSettings: StreamSettingsObject

낮은 수준의 전송 설정. 프로토콜 전송 옵션참조하십시오.

proxySettings: ProxySettingsObject

이 아웃 바운드에서 다른 아웃 바운드로 트래픽을 위임하기위한 구성입니다. 이 값을 설정하면이 아웃 바운드의 streamSettings 이 적용되지 않습니다.

mux: MuxObject

세부 사항은 Mux 구성을 참조하십시오.

ProxySettingsObject

{
  "tag": "another-outbound-tag"
}

태그: 문자열

태그 이 다른 아웃 바운드의 태그로 설정되면 현재 아웃 바운드의 나가는 트래픽이 지정된 아웃 바운드 트래픽으로 위임됩니다.

================================================ FILE: ko/configuration/policy.html ================================================ 정책 · Project V

지역 정책

로컬 정책은 현재의 V2Ray 인스턴스의 정책 설정 (예 : 연결 시간 초과)을 관리합니다. 정책은 각 사용자 수준 또는 전체 시스템에 적용 할 수 있습니다.

PolicyObject

PolicyObject 은 최상위 레벨 구성에서 policy 필드로 사용됩니다.

{
  "levels": {
    "0": {
      "handshake": 4,
      "connIdle": 300,
      "uplinkOnly": 2,
      "downlinkOnly": 5,
      "statsUserUplink": false,
      "statsUserDownlink": false
    }
  },
  "system": {
    "statsInboundUplink": false,
    "statsInboundDownlink": false
  }
}

level: map{string: LevelPolicyObject}

A list of key value pairs. Each key is a string of integer (restricted by JSON), such as "0", "1", etc. The numeric value is for a certain user level.

User level can be set on each inbound and outbound proxy. V2Ray will apply different policies based on user level.

system: SystemPolicyObject

System-wide policy

LevelPolicyObject

{
  "handshake": 4,
  "connIdle": 300,
  "uplinkOnly": 2,
  "downlinkOnly": 5,
  "statsUserUplink": false,
  "statsUserDownlink": false,
  "bufferSize": 10240
}

handshake: number

Timeout for establishing a connection, in seconds. Default value 4. At the handshake stage of an inbound proxy dealing with a new connection, say VMess reading request header, if it takes longer than handshake time, V2Ray aborts the connection.

connIdle: number

Timeout for idle connections, in seconds. Default value 300. If there is no data passed through the connection in connIdle time, V2Ray aborts the conneciton.

uplinkOnly: number

Time for keeping connections open after the uplink of the connection is closed, in seconds. Default value 2. After remote (server) closes the downlink of the connection, V2Ray aborts the connection after uplinkOnly times.

downlinkOnly: number

Time for keeping connections open after the downlink of the connection is closed, in seconds. Default value 5. After client (browser) closes the uplink of the connection, V2Ray aborts the connection after downlinkOnly time.

In a simple webpage browser scenario, it is safe to set uplinkOnly and downlinkOnly both to 0, for better performance.

statsUserUplink: true | false

When set to true, V2Ray enables stat counter to uplink traffic for all users in this level.

statsUserDownlink: true | false

When set to true, V2Ray enables stat counter to downlink traffic for all users in this level.

bufferSize: number

Size of internal buffer per connection, in kilo-bytes. Default value is 10240. When it is set to 0, the internal buffer is disabled.

Default value (V2Ray 4.4+):

  • 0 on ARM, MIPS and MIPSLE.
  • 4 on ARM64, MIPS64 and MIPS64LE.
  • 512 on other platforms.

Default value (V2Ray 4.3-):

  • 16 on ARM, ARM64, MIPS, MIPS64, MIPSLE and MIPS64LE.
  • 2048 on other platforms.

bufferSize overrides v2ray.ray.buffer.size settings in env variables.

SystemPolicyObject

{
  "statsInboundUplink": false,
  "statsInboundDownlink": false
}

statsInboundUplink: true | false

When set to true, V2Ray enables stat counter for all uplink traffic in all inbound proxies.

statsInboundDownlink: true | false

When set to true, V2Ray enables stat counter for all downlink traffic in all inbound proxies.

================================================ FILE: ko/configuration/protocols/blackhole.html ================================================ 블랙홀 · Project V

Blackhole

  • 이름: blackhole
  • 유형 : 아웃 바운드

블랙홀은 아웃 바운드 연결을위한 프로토콜입니다. 사전 정의 된 응답으로 모든 연결을 차단합니다. Routing과 결합하여 일부 웹 사이트에 대한 액세스를 차단하는 데 사용할 수 있습니다.

ConfigurationObject

{
  "response": {
    "type": "none"
  }
}

response: ResponseObject

사전 정의 된 응답. Blockhole은 전달 된 연결에 대해 즉시 미리 정의 된 데이터를 보내고 연결을 종료합니다.

ResponseObject

{
  "type": "none"
}

type: "none" | "http"

응답의 유형, 사용 가능한 옵션은 다음과 같습니다.

  • "없음": 기본값. 빈 응답.
  • "http": 유효한 HTTP 403 응답입니다.
================================================ FILE: ko/configuration/protocols/dns.html ================================================ DNS · Project V

DNS

  • Name: dns
  • Type: Outbound

DNS is an outbound proxy. It is mainly used for intercept and proxy DNS queries and responses. This outbound proxy can only accept DNS traffic, including both TCP and UDP based DNS queries. Other type of traffic will result in errors.

When proxying DNS queries, DNS outbound will redirect IP queries (A and AAAA) to internal DNS server. It will send other type of queries directly to its original destination.

DNS outbound proxy is introduced in V2Ray 4.15.

OutboundConfigurationObject

{
    "network": "tcp",
    "address": "1.1.1.1",
    "port": 53
}

network: "tcp" | "udp"

(V2Ray 4.16+) Modify the transport protocol of the DNS traffic. The value may be either "tcp" or "udp". If it is not specified, the original protocol remains unchanged.

address: address

(V2Ray 4.16+) Modify the DNS server address in the request. If it is not specified, the original DNS server address remain unchanged.

port: number

(V2Ray 4.16+) Modify the DNS server port in the request. If it is not specified, the original DNS server port remain unchanged.

================================================ FILE: ko/configuration/protocols/dokodemo.html ================================================ Dokodemo · Project V

refcn: chapter_02/protocols/dokodemo refen: configuration/protocols/dokodemo


Dokodemo-door

  • 이름 : dokodemo-door
  • 유형 : 인바운드

Dokodemo-door는 인바운드 연결을위한 프로토콜입니다. 모든 연결을 취하여 지정된 대상으로 전달합니다.

Dokodemo-door는 (구성된 경우) 투명한 프록시로 작동 할 수도 있습니다.

ConfigurationObject

{
  "address": "8.8.8.8",
  "port": 53,
  "network": "tcp",
  "followRedirect": false,
  "userLevel": 0
}

address: address

대상 서버의 주소. 문자열 형식의 IPv4, IPv6 또는 도메인 일 수 있습니다. followRedirect (아래 참조)이 이면 true, address 는 비어있을 수 있습니다.

port: number

대상 서버의 포트입니다.

network: "tcp" | "udp" | "tcp,udp"

수용 할 수있는 네트워크 유형. "tcp" 이 지정되면이 dokodemo-door로 전송 된 모든 UDP 트래픽이 삭제됩니다.

followRedirect: true | false

설정하면, dokodemo-door는 TProxy의 대상을 인식하여 대상으로 사용합니다. 자세한 내용은 전송 TProxy 을 참조하십시오.

userLevel: number

사용자 수준. 모든 연결은이 수준을 공유합니다. 자세한 내용은 정책 을 참조하십시오.

투명한 프록시의 예

다음과 같이 dokodemo-door를 인바운드에 추가하십시오.

{
  "network": "tcp,udp",
  "timeout": 30,
  "followRedirect": true
}

iptables를 아래와 같이 설정하십시오.

# 새 체인 만들기
iptables -t nat -N V2RAY
iptables -t mangle -N V2RAY
iptables -t mangle -N V2RAY_MARK

# V2Ray 서버의 주소를 무시하십시오.
# 매우 중요합니다. 단지주의해야합니다.
iptables -t nat -A V2RAY -d 123.123.123.123 -j RETURN

# LAN을 무시하고 프록시를 사용하지 않으려는 다른 주소
# 예약 된 네트워크의 전체 목록은 Wikipedia 및 RFC5735를 참조하십시오.
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168 .0.0 / 16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN

# 다른 모든 것은 리디렉션되어야합니다. Dokodemo-door의 로컬 포트
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to 포트 12345

# UDP 규칙 추가
ip route add 로컬 기본 dev lo 테이블 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A V2RAY -p udp --dport 53 -j TPROXY - 포트 12345 --tproxy-mark 0x01 / 0x01
iptables -t mangle -A V2RAY_MARK -p udp --dport 53 -j MARK --set-mark 1

# 규칙 적용
iptables -t nat -A 출력 --p tcp -j V2RAY
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -A OUTPUT -j V2RAY_MARK
================================================ FILE: ko/configuration/protocols/freedom.html ================================================ Freedom · Project V

Freedom

  • 이름 : 자유
  • 유형 : 아웃 바운드

Freedom은 아웃 바운드 연결을위한 프로토콜입니다. 모든 TCP 또는 UDP 연결을 목적지로 전달합니다. 이 아웃 바운드는 실제 대상으로 트래픽을 보내려는 경우에 사용됩니다.

ConfigurationObject

{
  "domainStrategy": "AsIs",
  "redirect": "127.0.0.1:3366",
  "userLevel": 0
}

domainStrategy: "AsIs" | "UseIP"

도메인 이름 분석을위한 전략. 옵션은 다음과 같습니다.

  • "AsIs": 기본값. 시스템별로 도메인 이름을 확인하십시오.
  • "UseIP": 도메인 이름 확인을 위해 내부 DNS 을 사용하십시오.
  • "UseIPv4": Use IPv4 address only, after resolved by internal DNS.
  • "UseIPv6": Use IPv6 address only, after resolved by internal DNS.

(V2Ray 4.6+) In UseIP mode, when sendThrough is specified in OutboundObject, Freedom will automatically choose between IPv4 and IPv6 address for destination based on sendThrough settings.

(V2Ray 4.7+) If sendThrough address conflicts with "UseIPv4" or "UseIPv6", Freedom will fail to dial out-going connections.

리디렉션: address_port

Redirect all connections to this address, in form like "127.0.0.1:80" or ":1234".

  • 주소가 비어 있으면 (예 : ": 443", Freedom은 원래 대상 주소를 사용합니다.
  • 포트 인 경우 0, 예를 들어 "v2ray.com:0", 자유는 원래 포트를 사용합니다.

userLevel: number

User level. All connections share this level.

================================================ FILE: ko/configuration/protocols/http.html ================================================ HTTP · Project V

HTTP

  • 이름: blackhole
  • 유형: 인바운드

HTTP is a protocol for inbound connections. It is compatible with HTTP/1.1.

InboundConfigurationObject

{
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "allowTransparent": false,
  "userLevel": 0
}

계정: \ [AccountObject]

각 항목이 계정 인 배열입니다. 기본적으로 비어 있습니다. 비어 있지 않으면 수신 요청에 HTTP 기본 인증이 필요합니다.

allowTransparent: true | 그릇된

설정하면 true이고이면이 프록시에 대한 모든 HTTP 요청이 프록시가 아닌 요청을 포함하여 프록시됩니다.

userLevel: number

사용자 수준. 모든 연결은이 수준을 공유합니다.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

사용자: 문자열

HTTP 인증을위한 사용자 이름.

패스: 문자열

hTTP 인증을위한 암호.

Use the following settings in Linux to use HTTP proxy in current session.

  • 내보내기 http_proxy = http: //127.0.0.1: 8080 / (URL은 설정에 따라 변경해야 함)
  • https_proxy =$http_proxy내 보냅니다.

================================================ FILE: ko/configuration/protocols/mtproto.html ================================================ MTProto · Project V

MTProto

  • Name: mtproto
  • Type: Inbound / Outbound

MTProto proxy is a special procol for Telegram. It consists of a pair of inbound and outboud proxies in V2Ray. They are usually used together for building a proxy for Telegram

For now V2Ray only supports IPv4 address of Telegram server.

InboundConfigurationObject

{
  "users": [{
    "email": "love@v2ray.com",
    "level": 0,
    "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
  }]
}

명의 사용자: \ [UserObject]

사용자 배열. 현재로서는 첫 번째 사용자 만 효과적입니다.

UserObject

{
  "email": "love@v2ray.com",
  "level": 0,
  "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}

이메일: 문자열

사용자 이메일. 추적 목적으로 사용됩니다. 통계보기.

레벨: 숫자

사용자 수준.

비밀: 문자열

사용자 비밀. 텔레 그램에서 사용자 비밀은 32 자이어야하며 0 에서 9사이의 문자와 a에서 f사이의 문자 만 포함해야합니다.

You may use the following command to generate MTProto secret: openssl rand -hex 16

Outbound configuration

{
}

Sample

MTProto can only be used for Telegram traffic. You may need a routing rule to combine the corresponding inbound and outbound. Here is an incomplete sample.

Inbound:

{
  "tag": "tg-in",
  "port": 443,
  "protocol": "mtproto",
  "settings": {
    "users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
  }
}

Outbound:

{
  "tag": "tg-out",
  "protocol": "mtproto",
  "settings": {}
}

Routing:

{
  "type": "field",
  "inboundTag": ["tg-in"],
  "outboundTag": "tg-out"
}

The configure your Telegram app to connect to 443 port on this machine.

================================================ FILE: ko/configuration/protocols/shadowsocks.html ================================================ Shadowsocks · Project V

Shadowsocks

  • Name: shadowsocks
  • Type: Inbound / Outbound

Shadowsocks protocol, for both inbound and outbound connections.

Compatibility with official version:

  • Supports both TCP and UDP connections, where UDP can be optional turned off.
  • Supports OTA
    • Client may choose to turn on or off.
    • Server may choose to enable, disable or auto.
  • Encryption methods (AEAD ciphers added in V2Ray 3.0):
    • aes-256-cfb
    • 에이스 -128-cfb
    • 차차 20
    • 차차 20-ietf
    • 에이스 -256-gcm
    • 에이스 -128-gcm
    • chacha20-poly1305 a.k.a. chacha20-ietf-poly1305
  • Plugins:
    • Support obfs through standalone mode.

InboundConfigurationObject

{
  "email": "love@v2ray.com",
  "method": "aes-128-cfb",
  "password": "password",
  "level": 0,
  "ota": true,
  "network": "tcp"
}

이메일: 문자열

Email address. Used for user identification.

방법: 문자열

Required. See Encryption methods for available values.

패스워드: string

Required. Password in Shadowsocks protocol. Can be any string.

레벨: 숫자

User level. Default to 0. See Policy.

오타: | 거짓

Whether or not to force OTA. If true and the incoming connection doesn't enable OTA, V2Ray will reject this connection. Vice versa.

If this field is not specified, V2Ray auto detects OTA settings from incoming connections.

When AEAD encryption is used, ota has no effect.

네트워크: "tcp"| "udp"| "tcp, udp"

지원되는 네트워크의 유형. "tcp"로 기본값.

OutboundConfigurationObject

{
  "servers": [
    {
      "email": "love@v2ray.com",
      "address": "127.0.0.1",
      "port": 1234,
      "method": "method",
      "password": "password",
      "ota": false,
      "level": 0
    }
  ]
}

어디에:

  • 이메일: 이메일 주소. 사용자 식별에 사용됩니다.
  • 주소: Shadowsocks 서버의 주소. IPv4, IPv6 또는 도메인이 될 수 있습니다.
  • 포트: Shadowsock 서버의 포트입니다.
  • 방법: 암호화 방법. 기본값이 없습니다. 옵션은 다음과 같습니다.
    • "aes-256-cfb"
    • "aes-128-cfb"
    • "차차 20"
    • "chacha20-ietf"
    • "aes-256-gcm"
    • "aes-128-gcm"
    • "chacha20-poly1305" 또는 "chacha20-ietf-poly1305"
  • 암호: 암호. 임의의 문자열이 될 수 있습니다.
  • 오타: OTA 사용 여부.
    • AEAD를 사용하면 오타 효과가 없습니다.
  • 수준: 사용자 수준입니다.

서버: \ [ServerObject]

An array of ServerObjects.

ServerObject

{
  "email": "love@v2ray.com",
  "address": "127.0.0.1",
  "port": 1234,
  "method": "加密方式",
  "password": "密码",
  "ota": false,
  "level": 0
}

이메일: 문자열

Email address. Used for user identification.

주소: 주소

필수 사항. Shadowsocks 서버 주소. IPv4, IPv6 또는 도메인 주소 일 수 있습니다.

포트: 번호

필수 사항. Shadowsocks 서버 포트.

방법: 문자열

필수 사항. 사용 가능한 값은 암호화 방법 을 참조하십시오.

패스워드: string

필수 사항. Shadowsocks 프로토콜의 암호. 임의의 문자열이 될 수 있습니다.

오타: 참 | 그릇된

OTA 사용 여부. 기본값은 입니다. false.

AEAD 암호화가 사용되면이 필드는 아무 효과가 없습니다.

레벨: 숫자

사용자 수준.

암호화 방법

  • "aes-256-cfb"
  • "aes-128-cfb"
  • "차차 20"
  • "chacha20-ietf"
  • "aes-256-gcm"
  • "aes-128-gcm"
  • "chacha20-poly1305" 또는 "chacha20-ietf-poly1305"
================================================ FILE: ko/configuration/protocols/socks.html ================================================ SOCKS · Project V

Socks

  • 이름 : 양말
  • 유형 : 인바운드 / 아웃 바운드

양말 호환 표준 SOCKS 프로토콜의 구현이며, 양말 4, 양말 4a 및도 양말 5.

Socks configuration consists of two parts, InboundConfigurationObject and OutboundConfigurationObject, for inbound and outbound respectively.

OutboundConfigurationObject

OutboundConfigurationObject is used as settings field in OutboundObject in top level configuration.

{
  "servers": [{
    "address": "127.0.0.1",
    "port": 1234,
    "users": [
      {
        "user": "test user",
        "pass": "test pass",
        "level": 0
      }
    ]
  }]
}

servers: [ ServerObject ]

An array of Socks servers.

ServerObject

{
  "address": "127.0.0.1",
  "port": 1234,
  "users": [
    {
      "user": "test user",
      "pass": "test pass",
      "level": 0
    }
  ]
}

address: address

Socks server address. May be IPv4, IPv6 or domain address.

Only support Socks 5 servers.

port: number

Socks server port.

users: [ UserObject ]

An array of users. Each element in the array is an user. If the list is not empty. Socks inbound will force user authentication. Otherwise, anonymous user is allowed.

UserObject

{
  "user": "test user",
  "pass": "test pass",
  "level": 0
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

level: number

User level for tracking and policy purpose. Default value is 0.

InboundConfigurationObject

{
  "auth": "noauth",
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "udp": false,
  "ip": "127.0.0.1",
  "userLevel": 0
}

auth: "noauth" | "password"

Socks autentication method. "noauth" is for anonymous authentication, and "password" for authentication with username and password. Default value is "noauth".

accounts: [ AccountObject ]

An array of user accounts, for authenication purpose. Only take effect when auth is set to "password".

udp: true | false

Whether or not to enable UDP. Default value is false.

ip: address

When UDP is enabled, V2Ray needs to know the IP address of current host. Default value is "127.0.0.1". This must be set to the public IP address of the host, if you want to allow public UDP traffic.

userLevel: number

User level. All incoming connections share this user level.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

================================================ FILE: ko/configuration/protocols/vmess.html ================================================ VMess · Project V

VMess

  • 이름 : vmess
  • 유형 : 인바운드 / 아웃 바운드

VMess 은 암호화 된 통신을위한 프로토콜입니다. 여기에는 인바운드 및 아웃 바운드 프록시가 모두 포함됩니다.

VMess는 시스템 시간에 의존합니다. 시스템 시간이 UTC 시간과 일치하는지 확인하십시오. 시간대는 중요하지 않습니다. 시스템 시간을 자동으로 조정하기 위해 Linux에 ntp 서비스를 설치할 수 있습니다.

OutboundConfigurationObject

{
  "vnext": [
    {
      "address": "127.0.0.1",
      "port": 37192,
      "users": [
        {
          "id": "27848739-7e62-4138-9fd3-098a63964b6b",
          "alterId": 4,
          "security": "auto",
          "level": 0
        }
      ]
    }
  ]
}

vnext: \ [ ServerObject]

각 요소가 원격 서버를 제공하는 배열

ServerObject

{
  "address": "127.0.0.1",
  "port": 37192,
  "users": []
}

주소: 주소

서버 주소는 IPv4, IPv6 또는 도메인 이름 일 수 있습니다.

포트: 번호

서버 포트

명의 사용자: \ [ UserObject]

각 요소가 VMess 사용자 인 배열

UserObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "alterId": 16,
  "security": "auto",
  "level": 0
}

id: 문자열

사용자 ID,의 형태로 UUID.

alterId: 숫자

Number of alternative IDs. The alternative IDs will be generated in a deterministic way. Default to 0. Maximum 65535. Recommend 4. Its value must be not larger than the one in corresponding Inbound.

레벨: 숫자

사용자 수준. 자세한 내용은 정책 을 참조하십시오.

보안: "aes-128-gcm"| "chacha20-poly1305"| "자동"| "없음"

페이로드를 암호화하는 방법. 이 설정은 아웃 바운드에서만 사용할 수 있습니다. VMess 인바운드는 자동으로이 설정을 인식하고 이에 따라 페이로드를 해독합니다. 옵션은 다음과 같습니다.

  • "aes-128-gcm": PC의 경우 권장됩니다.
  • "chacha20-poly1305": 모바일 용으로 권장됩니다.
  • "auto": 기본값. 사용 AES-128-GCM AMD64, ARM64 및 s390x가, 또는에 chacha20-poly1305 그렇지.
  • "없음": 트래픽이 전혀 암호화되지 않습니다.

Use "auto" wherever possible for better compatibility.

InboundConfigurationObject

{
  "clients": [
    {
      "id": "27848739-7e62-4138-9fd3-098a63964b6b",
      "level": 0,
      "alterId": 4,
      "email": "love@v2ray.com"
    }
  ],
  "default": {
    "level": 0,
    "alterId": 4
  },
  "detour": {
    "to": "tag_to_detour"
  },
  "disableInsecureEncryption": false
}

클라이언트: \ [ ClientObject]

An array for valid user accounts. May be empty when used for dynamic port feature.

detour: DetourObject

Optional feature to suggest client to take a detour. If specified, this inbound will instruct the outbound to use another inbound.

기본값: DefaultObject

Optional default client configuration. Usually used with detour.

disableInsecureEncryption: true | 그릇된

Forbids client for using insecure encryption methods. When set to true, connections will be terminated immediately if the following encryption is used. Default value false.

  • 없음
  • 에이스 -128-cfb

ClientObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "level": 0,
  "alterId": 4,
  "email": "love@v2ray.com"
}

id: 문자열

User ID, in the form of UUID.

레벨: 숫자

User level. See Policy for its usage.

alterId: 숫자

Number of alternative IDs. Same as in Outbound.

이메일: 문자열

Email address for user identification.

DetourObject

{
  "to": "tag_to_detour"
}

~: 문자열

The tag of an inbound proxy. See Overview. If configured, VMess will suggest its client to use the detour for further connections.

DefaultObject

{
  "level": 0,
  "alterId": 4
}

레벨: 숫자

User level.

alterId: 숫자

Number of alternative IDs. Default value 64. Recommend 4.

================================================ FILE: ko/configuration/protocols.html ================================================ 프로토콜 · Project V

프로토콜

V2Ray는 다음 프로토콜을 지원합니다. 각 프로토콜은 인바운드 프로토콜이거나 아웃 바운드 프로토콜이거나 둘 다일 수 있습니다.

================================================ FILE: ko/configuration/reverse.html ================================================ 역 · Project V

역방향 프록시

역방향 프록시는 V2Ray의 선택적 기능입니다. 서버에서 클라이언트로 트래픽을 리디렉션합니다. 따라서 "역방향"프록 싱이라고합니다.

Reverse proxy is available in V2Ray 4.0+. It is now in beta, and may be improved in near future.

Reverse proxy works in the following way:

  • 웹 서버를 실행하는 장치 A가 있다고 가정합니다. 장치 A에는 공용 IP 주소가 없으므로 인터넷에서 액세스 할 수 없습니다. 인터넷에서 액세스 할 수있는 클라우드 서버라고하는 또 다른 장치 B가 있습니다. 우리는 B를 포털로 사용하여 traffice를 A로 리디렉션해야합니다.
  • 이제 우리는 bridge이라는 이름의 장치 A에 V2Ray를 설치합니다. 그런 다음 장치 포털이라는 V2Ray를 설치합니다.
  • 브리지포털연결을 엽니 다. 대상은 라우팅 용도로 사용자 정의 할 수 있습니다. 포털 은 인터넷에서 다른 용도의 연결은 물론이 연결을받습니다. 포털 은이 두 종류의 연결을 "연결"합니다. 그러면 interent 트래픽은 bridge로 터널링됩니다.
  • 브릿지포털통해 인터넷 트래픽을 수신하면 localhost의 웹 서버에 이러한 트래픽을 보냅니다. 이러한 트래픽에 대한 라우팅을 구성 할 수도 있습니다.
  • 브릿지 은 트래픽 양에 따라로드 밸런스를 제어합니다.

Reverse proxy has already leveraged Mux. It is not necessary to configure Mux again on its outbound.

역 객체

ReverseObject is used as reverse field in top level configuration.

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }],
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"
  }]
}

브릿지: \ [BridgeObject]

An array of bridges. Each bridge is a BridgeObject.

포털: \ [PortalObject]

An array of portals. Each portal is a PortalObject.

BridgeObject

{
  "tag": "bridge",
  "domain": "test.v2ray.com"
}

태그: 문자열

A tag. All traffic initiated by this bridge will have this tag. It can be used for routing, identified as inboundTag.

도메인: 문자열

A domain. All connections initiated by bridge towards portal will use this domain as target. This domain is only used for communication between bridge and portal. It is not necessary to be actually registered.

PortalObject

태그: 문자열

A Tag. You need to redirect all traffic to this portal, by targeting outboundTag to this tag. The traffic includes the connections from bridge, as well as internet traffic.

도메인: 문자열

A domain. When a connection targeting this domain, portal considers it is a connection from bridge, otherwise it is an internet connection.

Like other usages, a V2Ray instance can be used as a bridge, or a portal, or both as the same time.

구성 예

bridge usually needs two outbounds. One for connecting portal, and another for connecting local web server.

Reverse:

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }]
}

Outbound:

{
  "tag": "out"
  "protocol": "freedom",
  "settings": {
    "redirect": "127.0.0.1:80" // Send traffic to local web server
  }
},
{
  "protocol": "vmess",
  "settings": {
    "vnext": [{
      "address": "portal的IP地址",
      "port": 1024,
      "users": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
    }]
  },
  "tag": "interconn"
}

Routing:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["bridge"],
    "domain": ["full:test.v2ray.com"],
    "outboundTag": "interconn"
  },{
    "type": "field",
    "inboundTag": ["bridge"],
    "outboundTag": "out"
  }]
}

portal usually needs two inbounds. One for connections from bridge, and another for internet connections.

Reverse:

{
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"  // Must be the same as in bridge
  }]
}

Inbound:

{
  "tag": "external",
  "port": 80,  // Open port 80 for internet HTTP traffic
  "protocol": "dokodemo-door",
  "settings": {
    "address": "127.0.0.1",
    "port": 80,
    "network": "tcp"
  }
},
{
  "port": 1024, // For bridge connections
  "tag": "interconn",
  "protocol": "vmess",
  "settings": {
    "clients": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
  }
}

Routing:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["external"],
    "outboundTag": "portal"
  },{
    "type": "field",
    "inboundTag": ["interconn"],
    "outboundTag": "portal"
  }]
}

In practice, you may want to run bridge first and then portal.

================================================ FILE: ko/configuration/routing.html ================================================ 라우팅 · Project V

라우팅

V2Ray는 내부 라우팅 메커니즘을 가지고 있습니다. 규칙에 따라 인바운드 연결을 다양한 아웃 바운드로 라우팅합니다. 일반적인 시나리오는 국가별로 트래픽을 분할하는 것입니다. V2Ray는 연결의 대상 국가 (Geo IP 기준)를 감지하고 해당 아웃 바운드 프록시에 연결을 보냅니다.

RoutingObject

RoutingObject 은 최상위 레벨 구성에서 라우팅 으로 사용됩니다.

{
  "domainStrategy": "AsIs",
  "rules": [],
  "balancers": []
}

domainStrategy: "AsIs"| "IPIfNonMatch"| "IPOnDemand"

도메인 분석 전략. 선택 사항은 다음과 같습니다.

  • "AsIs": 라우팅에만 도메인을 사용하십시오. 기본값.
  • "IPIfNonMatch": 현재 도메인과 일치하는 규칙이 없으면 V2Ray가이를 IP 주소 (A 또는 AAAA 레코드)로 확인하고 모든 규칙을 다시 시도합니다.
    • 도메인에 여러 IP 주소가있는 경우 V2Ray는 모든 IP 주소를 시도합니다.
    • 해결 된 IP는 라우팅 결정에만 사용되며 트래픽은 여전히 ​​원래 도메인 주소로 전송됩니다.
  • "IPOnDemand": IP 기반 규칙이있는 한 V2Ray는 도메인을 즉시 IP로 해석합니다.

규칙: \ [RuleObject]

An array of rules. For each inbound connection, V2Ray tries these rules from top down one by one. If a rule takes effect, the connection will be routed to the outboundTag (or balancerTag, V2Ray 4.4+) of the rule.

balancers: [ BalancerObject ]

(V2Ray 4.4+) An array of load balancers. When a routing rule points to a load balancer, the balancer will select an outbound based on configuration. Then traffic will be sent to that outbound.

RuleObject

{
  "type": "field",
  "domain": [
    "baidu.com",
    "qq.com",
    "geosite:cn"
  ],
  "ip": [
    "0.0.0.0/8",
    "10.0.0.0/8",
    "fc00::/7",
    "fe80::/10",
    "geoip:cn"
  ],
  "port": "53,443,1000-2000",
  "network": "tcp",
  "source": [
    "10.0.0.1"
  ],
  "user": [
    "love@v2ray.com"
  ],
  "inboundTag": [
    "tag-vmess"
  ],
  "protocol":["http", "tls", "bittorrent"],
  "attrs": "attrs[':method'] == 'GET'",
  "outboundTag": "direct",
  "balancerTag": "balancer"
}

When multiple fields are specified, these fields have to be all satisfied, in order to make the rule effective. If you need both domain and ip rules, it is highly likely you need put them into separate rules.

type: "field"

The only valid value for now is "field".

domain: [ string ]

An array of domains. Available formats are:

  • 일반 텍스트 :이 문자열이 타겟팅 도메인의 일부와 일치하는 경우이 규칙은 효력을 갖습니다. 예 : 규칙 "sina.com" 은 도메인 "sina.com", "sina.com.cn""www.sina.com"타겟팅하지만 "sina.cn은 타겟팅하지 않습니다..
  • 정규 표현식 : "regexp :", 나머지는 정규 표현식입니다. 정규 표현식이 타겟팅 도메인과 일치하면이 규칙이 적용됩니다. 예 : 규칙 "regexp : \\. goo. * \\. com $""www.google.com""fonts.googleapis.com"와 일치하지만 "google.com"과 일치하지 않습니다. </code> .
  • 하위 도메인 (권장) : "도메인 :" 로 시작하고 나머지는 도메인입니다. 타겟팅 도메인이 정확히 값이거나 값의 하위 도메인 인 경우이 규칙이 적용됩니다. 예 : 규칙 "도메인 : v2ray.com""www.v2ray.com", "v2ray.com"와 일치하지만 "xv2ray.com"은 일치하지 않습니다..
  • 전체 도메인 : "전체 :" 나머지는 도메인입니다. 타겟팅 도메인이 정확히 값일 경우 규칙이 적용됩니다. 예 : 규칙 "도메인 : v2ray.com""v2ray.com"과 일치하지만 "www.v2ray.com"과 일치하지 않습니다..
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.
  • Domains from file: Such as "ext:file:tag". The value must begin with ext: (lowercase), and followed by filename and tag. The file is placed in resource directory, and has the same format of geosite.dat. The tag must exist in the file.

ip: [string]

An array of IP ranges. When the targeting IP is in one of the ranges, this rule takes effect. Available formats:

  • IP : 예 : "127.0.0.1".
  • CIDR:과 같은 "127.0.0.0/8".
  • GeoIP : "geoip : cn". 그것은으로 시작된다. geoip : (소문자)를 입력하고 2 자의 국가 코드를 입력하십시오.
    • 특별 값 "geoip : 비공개": 와 같은 모든 비공개 주소 127.0.0.1.
  • 파일에서 IP : "ext : file : tag". 값은 ext : (소문자)로 시작해야하며 그 다음에 파일 이름과 태그가 와야합니다. 파일은 리소스 디렉토리에 저장되며 geoip.dat와 같은 형식을가집니다.. 태그는 파일에 존재해야합니다.

"ext:geoip.dat:cn" is equivalent to "geoip:cn".

port:number | string

Port range. Formats are:

  • "a-b": Both a and b are positive integers and less than 65536. When the targeting port is in [a, b), this rule takes effect.
  • a: a is a positive integer, and less than 65536. When the targeting port is a, this rule takes effect.
  • Mix of the two above, separated by ",". Such as "53,443,1000-2000".

network: "tcp" | "udp" | "tcp,udp"

When the connection has in the chosen network, this rule take effect.

source: [string]

An array of IP ranges. Same format as ip. When the source IP of the connection is in the IP range, this rule takes effect.

user: [string]

An array of email address. When the inbound connection uses an user account of the email address, this rule takes effect. For now Shadowsocks and VMess support user with email.

inboundTag: [string]

An array of string as inbound proxy tags. When the connection comes from one of the specified inbound proxy, this rule takes effect.

protocol: [ "http" | "tls" | "bittorrent" ]

An array of string as protocol types. When the connection uses one of the protocols, this rule takes effect. To recognize the protocol of a connection, one must enable sniffing option in inbound proxy.

attrs: string

(V2Ray 4.18+) A Starlark script, used for detecting traffic attributes. When this script returns true, this rule takes effect.

Starlark is a subset of Python. The script takes a global varible named attrs. It contains all attributes of the traffic.

At the moment, only http inbound sets attrs.

Examples:

  • Detect HTTP GET: "attrs[':method'] == 'GET'"
  • Detect HTTP Path: "attrs[':path'].startswith('/test')"
  • Detect Content Type: "attrs['accept'].index('text/html') >= 0"

outboundTag string

Tag of the outbound that the connection will be sent to, if this rule take effect.

balancerTag: string

Tag of an load balancer. Then this rule takes effect, V2Ray will use the balancer to select an outbound. Either outboundTag or balancerTag must be specified. When both are specified, outboundTag takes priority.

BalancerObject

Configuration for a load balancer. When a load balancer takes effective, it selects one outbound from matching outbounds. This outbound will be used for send out-going traffic.

{
  "tag": "balancer",
  "selector": []
}

tag: string

Tag of this BalancerObject, to be matched from balancerTag in RuleObject.

selector: [ string ]

An array of strings. These strings are used to select outbounds with prefix matching. For example, with the following outbound tags: [ "a", "ab", "c", "ba" ],selector ["a"] matches [ "a", "ab" ].

When multiple outbounds are selected, load balancer for now picks one final outbound at random.

Pre-defined domain lists

This is a domain lists maintained by domain-list-community project. It provides a file named geosite.dat for some predefined domain lists. Notably:

  • category-ads: Common ads domains.
  • category-ads-all: Common ads domains and ads providers' domains.
  • cn: Equivalent to an union of geolocation-cn and tld-cn.
  • google: All Google domains.
  • facebook: All Facebook domains.
  • geolocation-cn: Common domains that serve in China.
  • geolocation-!cn: Common domains that don't serve in China
  • speedtest: All domains used by Speedtest.
  • tld-cn: All .cn and .中国 domains.
================================================ FILE: ko/configuration/stats.html ================================================ 통계 · Project V

통계

V2Ray는 내부 정보를 제공합니다.

StatsObject

StatsObject 은 최상위 레벨 구성에서 stats 필드로 사용됩니다.

{
}

At the moment there is no parameter in stats settings. Stats is enabled automatically when the StatsObject is set in top level configuration. You need also enable the corresponding settings in Policy, in order to keep track of user or system stats.

All stats counters are listed below:

User Traffic

If an user doesn't has email address set in protocol settings, the traffic stats will not be enabled.

user>>>[email]>>>traffic>>>uplink

Accumulated uplink traffic of specific user, in bytes.

user>>>[email]>>>traffic>>>downlink

Accumulated downlink traffic of specific user, in bytes.

Global Traffic

inbound>>>[tag]>>>traffic>>>uplink

Accumulated uplink traffic of specific inbound, in bytes.

inbound>>>[tag]>>>traffic>>>downlink

Accumulated downlink traffic of specific inbound, in bytes.

================================================ FILE: ko/configuration/transport/domainsocket.html ================================================ DomainSocket · Project V

도메인 소켓 전송

Domain Socket은 표준 Unix 도메인 소켓을 사용하여 데이터를 전송합니다. 도메인 소켓은 시스템 interal tranfer 채널입니다. 네트워크 버퍼에 용지 걸림이 발생하지 않으며 로컬 루프백 네트워크를 통해 전송하는 것보다 약간 더 빠를 수도 있습니다.

도메인 소켓은 macOS 및 Linux와 같이 Unix 도메인 소켓을 지원하는 플랫폼에서만 사용할 수 있습니다. Windows에서는 사용할 수 없습니다.

When domain socket is used, IP and port specified on the inbound/outbound proxy will be ignored. All traffic is tunneled through the domain socket.

DomainSocketObject

DomainSocketObject is used in dsSettings field in TransportObject and StreamSettingsObject.

{
  "path": "/path/to/ds/file"
}

경로: 문자열

An valid absolute file path. Before running V2Ray, the file on this path must not exist.

================================================ FILE: ko/configuration/transport/h2.html ================================================ HTTP / 2 · Project V

HTTP / 2 전송

HTTP / 2 전송이 V2Ray 3.17에 추가되었습니다. 표준 HTTP / 2를 기반으로하며 Nginx와 같은 다른 HTTP 서버를 통해 프록시가 될 수 있습니다.

HTTP / 2 권장으로 인해 해당 인바운드 및 아웃 바운드가 TLS에서이 전송을 사용할 수 있도록 설정해야합니다.

HttpObject

DomainSocketObject 에서 사용되는 httpSettings 필드를 TransportObjectStreamSettingsObject.

{
  "host": ["v2ray.com"],
  "path": "/random/path"
}

호스트: \ [string ]

문자열 배열입니다. 각 요소는 도메인입니다. 클라이언트는 각 요청마다 임의로 도메인을 선택합니다. 서버는 들어오는 요청의 도메인이 목록에 있는지 확인합니다.

경로: 문자열

HTTP 경로. 클라이언트와 서버는 동일한 값을 가져야합니다.

================================================ FILE: ko/configuration/transport/mkcp.html ================================================ mKCP · Project V

mKCP 전송

mKCP는 안정적인 스트림 전송입니다. UDP 기반 프로토콜입니다. mKCP는 더 낮은 대기 시간을 위해 더 많은 트래픽을 전송합니다. 동일한 양의 데이터를 전송하려면 일반적으로 mKCP가 TCP보다 많은 처리량이 필요합니다.

KcpObject

{
  "mtu": 1350,
  "tti": 20,
  "uplinkCapacity": 5,
  "downlinkCapacity": 20,
  "congestion": false,
  "readBufferSize": 1,
  "writeBufferSize": 1,
  "header": {
    "type": "none"
  }
}

mtu: number

최대 전송 단위. UDP 패킷이 전송할 수있는 최대 수 바이트 수를 나타냅니다. 권장 값은 576 에서 1460입니다. 기본값 1350.

tti: 숫자

전송 시간 간격 (밀리 초). mKCP는이 간격으로 데이터를 보냅니다. 권장 값은 10 ~ 100입니다. 기본값 50.

업 링크 용량: 번호

업 링크 대역폭 (MB / s). V2Ray 인스턴스가 원격지로 데이터를 업로드하기위한 최대 대역폭. 기본값은 5입니다. 비트가 아니라 바이트 (MB / s)임을주의하십시오. 작은 대역폭을 위해 값 0 을 사용할 수 있습니다.

downlinkCapacity: 숫자

다운 링크 대역폭 (MB / s). V2Ray 인스턴스가 데이터를 다운로드 할 수있는 최대 대역폭. 기본값은 20입니다. 비트가 아니라 바이트 (MB / s)임을주의하십시오. 작은 대역폭을 위해 값 0 을 사용할 수 있습니다.

uplinkCapacity and downlinkCapacity determine the speed of mKCP. On client side, uplinkCapacity specifies the speed for client sending data to server. On sever side, downlinkCapacity specifies the speed of server receiving data. The minimum of this pair is effective in an actual connection.

혼잡: 참 | 그릇된

Whether or not to enable congestion control. Default value is false. When congestion control is enabled, V2Ray will detect network quality. It will send less packets when packet loss is severe, or more data when network is not fully filled.

readBufferSize: 숫자

Read buffer size for a single connection, in MB. Default value is 2.

writeBufferSize: 숫자

Write buffer size for a single connection, in MB. Default value is 2.

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

유형: 문자열

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "없음": 기본값. 난독 화는 사용되지 않습니다.
  • "srtp": SRTP 트래픽으로 난독 화됩니다. Facetime과 같은 화상 통화로 인식 될 수 있습니다.
  • "utp": uTP 트래픽으로 난독 화. Bittorrent 트래픽으로 인식 될 수 있습니다.
  • "wechat-video": WeChat 트래픽으로 난독 화됩니다.
  • "dtls": DTLS 1.2 패킷으로 난독 화.
  • "wireguard": WireGuard 패킷으로 난독 화. (사실 WireGuard 프로토콜이 아닙니다)

크레딧

  • @ skywind3000은 원래의 KCP 프로토콜을 발명하고 C로 구현했습니다.
  • @xtaci는 Go에서 KCP 프로토콜을 다시 구현합니다.
  • @xiaokangwang은 KCP를 V2Ray에 통합했습니다.
================================================ FILE: ko/configuration/transport/quic.html ================================================ QUIC · Project V

QUIC

QUIC, or Quick UDP Internet Connection, is a multiplexing transport based on UDP, initially designed, implemented, and deployed by Google.

QUIC has the following advantages:

  1. Reduced number of roundtrips in handshake phase. (1-RTT or 0-RTT)
  2. Multiplexing without head of line blocking as in TCP
  3. Connection migration, especially for clients. For example, connections don't break when device moves from Wi-Fi to 4G.

QUIC is now an experiment in V2Ray. It implements IETF specification. As the spec is still being standardized, compatibility can't be guaranteed.

Update History

V2Ray 4.7:

  • Initial version to support QUIC.
  • Default settings:
    • 12 byte Connection ID
    • Connection timeout in 30 seconds if no data traffic. (May have impact on some long HTTP connections)

QuicObject

QUIC is used as quicSettings in transport settings. The configuration must be exactly the same between connecting peers.

QUIC requires TLS. If TLS is not enabled in transport settings, V2Ray will automatically issue a TLS certificate for it. When QUIC transport is used, encryption in VMess can be turned off.

{
  "security": "none",
  "key": "",
  "header": {
    "type": "none"
  }
}

security: "none" | "aes-128-gcm" | "chacha20-poly1305"

Extra encryption over entire QUIC packet, include the frame head part. Default value is "none" for no encryption. After being encrypted, QUIC packets can't be sniff'ed.

key: string

Key for the encryption above. Can be any string. Only effective when security is not "none".

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

type: string

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "none": Default value. No obfuscation is used.
  • "srtp": Obfuscated as SRTP traffic. It may be recognized as video calls such as Facetime.
  • "utp": Obfuscated as uTP traffic. It may be recognized as Bittorrent traffic.
  • "wechat-video": Obfuscated to WeChat traffic.
  • "dtls": Obfuscated as DTLS 1.2 packets.
  • "wireguard": Obfuscated as WireGuard packets. (NOT true WireGuard protocol)

When neither encryption nor obfuscation is enabled, QUIC transport is compatible with other QUIC tools. However it is recommended to enable either or both for better undetectable communication.

================================================ FILE: ko/configuration/transport/tcp.html ================================================ TCP · Project V

TCP 전송

TcpObject

{
  "header": {
    "type": "none"
  }
}

header: NoneHeaderObject | HttpHeaderobject

Header obfuscation. Default value is NoneHeaderObject.

NoneHeaderObject

No header obfuscation.

{
  "type": "none"
}

type: "none"

Disable header obfuscation.

HttpHeaderObject

HTTP header obfuscation. The configuration must be the same between connecting inbound and outbound.

{
  "type": "http",
  "request": {},
  "response": {}
}

type: "http"

Enable HTTP header obfuscation.

request: HTTPRequestObject

HTTP request template.

response: HTTPResponseObject

HTTP response template.

HTTPRequestObject

{
  "version": "1.1",
  "method": "GET",
  "path": ["/"],
  "headers": {
    "Host": ["www.baidu.com", "www.bing.com"],
    "User-Agent": [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
    ],
    "Accept-Encoding": ["gzip, deflate"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

method: string

HTTP method. Default value is "GET"

path: [ string ]

HTTP path. An array is string. The path will be chosen randomly for every connection.

headers: map{string, [ string ] }

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

HTTPResponseObject

{
  "version": "1.1",
  "status": "200",
  "reason": "OK",
  "headers": {
    "Content-Type": ["application/octet-stream", "video/mpeg"],
    "Transfer-Encoding": ["chunked"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

status: string

HTTP status. Default value is "200"

reason: string

HTTP status message. Default value is "OK".

headers: map{string, string}

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

================================================ FILE: ko/configuration/transport/websocket.html ================================================ 웹 소켓 · Project V

웹 소켓

표준 WebSocket을 사용하여 데이터를 전송하십시오. Websocket 연결은 Nginx와 같은 HTTP 서버에 의해 프록시 될 수 있습니다.

WebSocketObject

WebSocketObject 로 사용되는 wsSettings 에서 TransportObject 또는 StreamSettingsObject.

Websocket recognizes HTTP header X-Forwarded-For, and uses it as inbound source address.

{
  "path": "/",
  "headers": {
    "Host": "v2ray.com"
  }
}

경로: 문자열

Path used for WebSocket. Default to root, as "/".

headers: map{string, string}

Custom HTTP header. An array where each entry is a key value pair in string, for header and value in HTTP header. Default is empty.

================================================ FILE: ko/configuration/transport.html ================================================ 수송 · Project V

전송 설정

전송은 V2Ray가 동료들과 데이터를주고받는 방법입니다. The responsibility of a transport is to reliably transfer data to a peer. 일반적으로 연결에는 양쪽 끝점에서 일치하는 전송이 있습니다. 예를 들어 V2Ray 아웃 바운드가 전송으로 WebSocket을 사용하는 경우 인바운드는 WebSocket을 사용해야하며, 그렇지 않으면 연결을 설정할 수 없습니다.

전송 설정은 전역 설정과 프록시 설정의 두 부분으로 나뉩니다. 프록시 별 설정은 각 프록시가 데이터를 처리하는 방법을 지정하고 전역 설정은 모든 프록시를 지정합니다. 일반적으로 연결 피어 간의 인바운드 및 아웃 바운드 프록시는 동일한 전송 설정을 가져야합니다. 프록시에 전송 설정이 없으면 전역 설정이 적용됩니다.

TransportObject

TransportObject 은 최상위 레벨 구성에서 전송 필드로 사용됩니다.

{
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {}
}

tcpSettings: TcpObject

TCP 전송 설정.

kcpSettings: KcpObject

mKCP 전송 설정.

wsSettings: WebSocketObject

WebSocket 전송 설정.

httpSettings: HttpObject

HTTP / 2 전송 설정.

dsSettings: DomainSocketObject

도메인 소켓 전송 설정.

quicSettings: QUICObject

(V2Ray 4.7+) Settings for QUIC transport.

StreamSettingsObject

Each inbound and outbound proxy may has its own transport settings, as specified in streamSettings field in top level configuration.

{
  "network": "tcp",
  "security": "none",
  "tlsSettings": {},
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {},
  "sockopt": {
    "mark": 0,
    "tcpFastOpen": false,
    "tproxy": "off"
  }
}

network: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"

Network type of the stream transport. Default value "tcp".

security: "none" | "tls"

Type of security. Choices are "none" (default) for no extra security, or "tls" for using TLS.

tlsSettings: TLSObject

TLS settings. TLS is provided by Golang. Support up to TLS 1.2. DTLS is not supported.

tcpSettings: TcpObject

TCP transport configuration for current proxy. Effective only when the proxy uses TCP transport. Configuration is the same as it is in global configuration.

kcpSettings: KcpObject

mKCP transport configuration for current proxy. Effective only when the proxy uses mKCP transport. Configuration is the same as it is in global configuration.

wsSettings: WebSocketObject

WebSocket transport configuration for current proxy. Effective only when the proxy uses WebSocket transport. Configuration is the same as it is in global configuration.

httpSettings: HttpObject

HTTP/2 transport configuration for current proxy. Effective only when the proxy uses HTTP/2 transport. Configuration is the same as it is in global configuration.

dsSettings: DomainSocketObject

Domain socket transport configuration for current proxy. Effective only when the proxy uses domain socket transport. Configuration is the same as it is in global configuration.

quicSettings: QUICObject

(V2Ray 4.7+) QUIC transport configuration for current proxy. Effective only when the proxy uses QUIC transport. Configuration is the same as it is in global configuration.

sockopt: SockoptObject

Socket options for incoming and out-going connections.

TLSObject

{
  "serverName": "v2ray.com",
  "allowInsecure": false,
  "alpn": ["http/1.1"],
  "certificates": [],
  "disableSystemRoot": false
}

serverName: string

Server name (usually domain) used for TLS authentication. Typically this is used when corressponding inbound/outbound uses IP for communication.

When domain name is specified from inbound proxy, or get sniffed from the connection, it will be automatically used for connection. It is not necessary to set serverName in such case.

alpn: [ string ]

An array of strings, to specifiy the ALPN value in TLS handshake. Default value is ["http/1.1"].

allowInsecure: true | false

If true, V2Ray allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.

allowInsecureCiphers: true | false

Whehter or not to allow insecure cipher suites. By default TLS only uses cipher suites from TLS 1.3 spec. Turn on this option to allow cipher suites with static RSA keys.

disableSystemRoot: true | false

(V2Ray 4.18+) Whether or not to disable system root CAs for TLS handshake. Default value is false. If set to true, V2Ray will use only certificates for TLS handshake.

certificates: [ CertificateObject ]

List of TLS certificates. Each entry is one certificate.

CertificateObject

{
  "usage": "encipherment",

  "certificateFile": "/path/to/certificate.crt",
  "keyFile": "/path/to/key.key",

  "certificate": [
    "-----BEGIN CERTIFICATE-----",
    "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
    "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
    "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
    "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
    "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
    "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
    "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
    "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
    "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
    "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
    "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
    "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
    "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
    "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
    "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
    "-----END CERTIFICATE-----"
  ],
  "key": [
    "-----BEGIN RSA PRIVATE KEY-----",
    "MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
    "bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
    "GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
    "jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
    "itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
    "IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
    "qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
    "C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
    "/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
    "aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
    "/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
    "bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
    "8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
    "pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
    "L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
    "3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
    "az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
    "gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
    "TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
    "eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
    "64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
    "8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
    "GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
    "ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
    "cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
    "-----END RSA PRIVATE KEY-----"
  ]
}

usage: "encipherment" | "verify" | "issue"

Purpose of the certificate. Default value "encipherment". Choices are:

  • "암호화": 인증서는 TLS 인증 및 암호화에 사용됩니다.
  • "verify": 인증서는 원격 피어에서 TLS 인증서의 유효성을 검사하는 데 사용됩니다. 이 경우 인증서는 CA 인증서 여야합니다.
  • "issue": 인증서는 다른 인증서를 발행하는 데 사용됩니다. 이 경우 인증서는 CA 인증서 여야합니다.

On Windows, you have to install your CA certificate to system, in order to verify cerificates issued from the CA.

When there is a new client request, say for serverName = "v2ray.com", V2Ray will find a certificate for "v2ray.com" first. If not found, V2Ray will try to issue a new certificate using any existing certificate whose usage is "issue" for "v2ray.com". The new certificate expires in one hour, and will be added to certificate pool for later reuse.

certificateFile: string

File path to the certificate. If the certificate is generated by OpenSSL, the path ends with ".crt".

Use v2ctl cert -ca command to generate a new CA certificate.

certificate: [ string ]

List of strings as content of the certificate. See the example above. Either certificate or certificateFile must not be empty.

keyFile: string

File path to the private key. If generated by OpenSSL, the file usually ends with ".key". Key file with password is not supported.

key: [ string ]

List of strings as content of the private key. See the example above. Either key or keyFile must not be empty.

When certificateFile and certificate are both filled in. V2Ray uses certificateFile. Same for keyFile and key.

When usage is "verify", both keyFile and key can be empty.

SockoptObject

{
  "mark": 0,
  "tcpFastOpen": false,
  "tproxy": "off"
}

mark: number

An integer. If non-zero, the value will be set to out-going connections via socket option SO_MARK. This mechanism only applies on Linux and requires CAP_NET_ADMIN permission.

tcpFastOpen: true | false

Whether or not to enable TCP Fast Open. When set to true, V2Ray enables TFO for current connection. When set to false, V2Ray disables TFO. If this entry doesn't exist, V2Ray uses default settings from operating system.

  • 다음 운영 체제에만 적용 :
    • Windows 10 (1604) 이상
    • Mac OS 10.11 / iOS 9 이상
    • Linux 3.16 이상 : 시스템 기본값에 의해 사용 가능합니다.
  • 인바운드 및 아웃 바운드 연결에 모두 적용 가능합니다.

tproxy: "redirect" | "tproxy" | "off"

Whether or not to enable transparent proxy on Linux. Choices are:

  • "off": 기본값. TProxy를 전혀 사용하지 마십시오.
  • "redirect": 리디렉션 모드로 TProxy를 사용합니다. TCP / IPv4 및 UDP 트래픽을 지원합니다.
  • "tproxy": TProxy 모드로 TProxy를 활성화합니다. TCP 및 UDP 트래픽을 지원합니다.

Transparent proxy requires Root or CAP_NET_ADMIN permission.

If TProxy is not set, and allowRedirect is set in dokodemo-door, the value of TProxy will be set to "redirect" automatically.

================================================ FILE: ko/developer/tools.html ================================================ Tools · Project V

Tools

Third Party SDK

Automation

V2Ray uses the following automation tools for build and releases.

================================================ FILE: ko/gitbook/gitbook-plugin-anchors/plugin.css ================================================ a.plugin-anchor { color: inherit !important; display: none; margin-left: -30px; padding-left: 40px; cursor: pointer; position: absolute; top: 0; left: 0; bottom: 0; } a.plugin-anchor i { margin-left: -30px; font-size: 15px !important; } h1, h2, h3, h4, h5, h6 { position: relative; } h1:hover a.plugin-anchor, h2:hover a.plugin-anchor, h3:hover a.plugin-anchor, h4:hover a.plugin-anchor, h5:hover a.plugin-anchor, h6:hover a.plugin-anchor { display: inline-block; } .book .book-body .page-wrapper .page-inner section.normal { overflow: visible; } ================================================ FILE: ko/gitbook/gitbook-plugin-ga/plugin.js ================================================ require(["gitbook"], function(gitbook) { // Load analytics.js gitbook.events.bind("start", function(e, config) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); var cfg = config.ga; ga('create', cfg.token, cfg.configuration); }); // Notify pageview gitbook.events.bind("page.change", function() { ga('send', 'pageview', window.location.pathname+window.location.search); }); }); ================================================ FILE: ko/gitbook/gitbook-plugin-hints/plugin-hints.css ================================================ .hints-icon { display: table-cell; padding-right: 15px; padding-left: 5px; } .hints-container { display: table-cell; } ================================================ FILE: ko/gitbook/gitbook-plugin-mermaid-gb3/book/plugin.js ================================================ require([ 'gitbook' ], function (gitbook) { gitbook.events.bind('page.change', function () { mermaid.init(); }); }); ================================================ FILE: ko/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #ECECFF; stroke: #CCCCFF; stroke-width: 1px; } .arrowheadPath { fill: #333333; } .edgePath .path { stroke: #333333; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #ffffde !important; rx: 4 !important; stroke: #aaaa33 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #CCCCFF; fill: #ECECFF; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #CCCCFF; fill: #ECECFF; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #CCCCFF; } .note { stroke: #aaaa33; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: rgba(102, 102, 255, 0.49); } .section2 { fill: #fff400; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #8a90dd; stroke: #534fbc; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #bfc7ff; stroke: #534fbc; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #bfc7ff; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #9370DB; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #ECECFF; stroke: #9370DB; } g.classGroup line { stroke: #9370DB; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #ECECFF; opacity: 0.5; } svg .classLabel .label { fill: #9370DB; font-size: 10px; } .relation { stroke: #9370DB; stroke-width: 1; fill: none; } .composition { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .aggregation { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationStart { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationEnd { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #dependencyStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #dependencyEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #ffffde; border: 1px solid #aaaa33; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: ko/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.forest.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { font-family: 'trebuchet ms', verdana, arial; color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #cde498; stroke: #13540c; stroke-width: 1px; } .arrowheadPath { fill: green; } .edgePath .path { stroke: green; stroke-width: 1.5px; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #cdffb2 !important; rx: 4 !important; stroke: #6eaa49 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #13540c; fill: #cde498; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #326932; fill: #cde498; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #326932; } .note { stroke: #6eaa49; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: #6eaa49; } .section2 { fill: #6eaa49; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #487e3a; stroke: #13540c; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #cde498; stroke: #13540c; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #cde498; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #13540c; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #cde498; stroke: #13540c; } g.classGroup line { stroke: #13540c; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #cde498; opacity: 0.5; } svg .classLabel .label { fill: #13540c; font-size: 10px; } .relation { stroke: #13540c; stroke-width: 1; fill: none; } .composition { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .aggregation { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationStart { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationEnd { fill: #cde498; stroke: #13540c; stroke-width: 1; } #dependencyStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #dependencyEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #cdffb2; border: 1px solid #6eaa49; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-a11y-dark.css ================================================ /** * a11y-dark theme for JavaScript, CSS, and HTML * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css * @author ericwbailey */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: 0.5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #d4d0ab; } .token.punctuation { color: #fefefe; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ffa07a; } .token.boolean, .token.number { color: #00e0e0; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #abe338; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #00e0e0; } .token.atrule, .token.attr-value, .token.function { color: #ffd700; } .token.keyword { color: #00e0e0; } .token.regex, .token.important { color: #ffd700; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } @media screen and (-ms-high-contrast: active) { code[class*="language-"], pre[class*="language-"] { color: windowText; background: window; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: window; } .token.important { background: highlight; color: window; font-weight: normal; } .token.atrule, .token.attr-value, .token.function, .token.keyword, .token.operator, .token.selector { font-weight: bold; } .token.attr-value, .token.comment, .token.doctype, .token.function, .token.keyword, .token.operator, .token.property, .token.string { color: highlight; } .token.attr-value, .token.url { font-weight: normal; } } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-atom-dark.css ================================================ /** * atom-dark theme for `prism.js` * Based on Atom's `atom-dark` theme: https://github.com/atom/atom-dark-syntax * @author Joe Gibson (@gibsjose) */ code[class*="language-"], pre[class*="language-"] { color: #c5c8c6; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #1d1f21; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #7C7C7C; } .token.punctuation { color: #c5c8c6; } .namespace { opacity: .7; } .token.property, .token.keyword, .token.tag { color: #96CBFE; } .token.class-name { color: #FFFFB6; text-decoration: underline; } .token.boolean, .token.constant { color: #99CC99; } .token.symbol, .token.deleted { color: #f92672; } .token.number { color: #FF73FD; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #A8FF60; } .token.variable { color: #C6C5FE; } .token.operator { color: #EDEDED; } .token.entity { color: #FFFFB6; /* text-decoration: underline; */ } .token.url { color: #96CBFE; } .language-css .token.string, .style .token.string { color: #87C38A; } .token.atrule, .token.attr-value { color: #F9EE98; } .token.function { color: #DAD085; } .token.regex { color: #E9C062; } .token.important { color: #fd971f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-base16-ateliersulphurpool.light.css ================================================ /* Name: Base16 Atelier Sulphurpool Light Author: Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) Prism template by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/prism/) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #f5f7ff; color: #5e6687; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #dfe2f1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #dfe2f1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #898ea4; } .token.punctuation { color: #5e6687; } .token.namespace { opacity: .7; } .token.operator, .token.boolean, .token.number { color: #c76b29; } .token.property { color: #c08b30; } .token.tag { color: #3d8fd1; } .token.string { color: #22a2c9; } .token.selector { color: #6679cc; } .token.attr-name { color: #c76b29; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #22a2c9; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #ac9739; } .token.statement, .token.regex, .token.atrule { color: #22a2c9; } .token.placeholder, .token.variable { color: #3d8fd1; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #202746; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c94922; } .token.entity { cursor: help; } pre > code.highlight { outline: 0.4em solid #c94922; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #dfe2f1; } .line-numbers-rows > span:before { color: #979db4; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(107, 115, 148, 0.2); background: -webkit-linear-gradient(left, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); background: linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-cb.css ================================================ /* * Based on Plugin: Syntax Highlighter CB * Plugin URI: http://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js * Description: Highlight your code snippets with an easy to use shortcode based on Lea Verou's Prism.js. * Version: 1.0.0 * Author: c.bavota * Author URI: http://bavotasan.comhttp://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js/ */ /* http://cbavota.bitbucket.org/syntax-highlighter/ */ /* ===== ===== */ code[class*="language-"], pre[class*="language-"] { color: #fff; text-shadow: 0 1px 1px #000; font-family: Menlo, Monaco, "Courier New", monospace; direction: ltr; text-align: left; word-spacing: normal; white-space: pre; word-wrap: normal; line-height: 1.4; background: none; border: 0; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"] code { float: left; padding: 0 15px 0 0; } pre[class*="language-"], :not(pre) > code[class*="language-"] { background: #222; } /* Code blocks */ pre[class*="language-"] { padding: 15px; margin: 1em 0; overflow: auto; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 5px 10px; line-height: 1; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797979; } .token.selector, .token.operator, .token.punctuation { color: #fff; } .token.namespace { opacity: .7; } .token.tag, .token.boolean { color: #ffd893; } .token.atrule, .token.attr-value, .token.hex, .token.string { color: #B0C975; } .token.property, .token.entity, .token.url, .token.attr-name, .token.keyword { color: #c27628; } .token.regex { color: #9B71C6; } .token.entity { cursor: help; } .token.function, .token.constant { color: #e5a638; } .token.variable { color: #fdfba8; } .token.number { color: #8799B0; } .token.important, .token.deliminator { color: #E45734; } /* Line highlight plugin */ pre[data-line] { position: relative; padding: 1em 0 1em 3em; } .line-highlight { position: absolute; left: 0; right: 0; margin-top: 1em; /* Same as .prism's padding-top */ background: rgba(255,255,255,.2); pointer-events: none; line-height: inherit; white-space: pre; } .line-highlight:before, .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .3em; left: .6em; min-width: 1em; padding: 0 .5em; background-color: rgba(255,255,255,.3); color: #fff; font: bold 65%/1.5 sans-serif; text-align: center; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; text-shadow: none; } .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } /* for line numbers */ .line-numbers-rows { margin: 0; } .line-numbers-rows span { padding-right: 10px; border-right: 3px #d9d336 solid; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-darcula.css ================================================ /** * Darcula theme * * Adapted from a theme based on: * IntelliJ Darcula Theme (https://github.com/bulenkov/Darcula) * * @author Alexandre Paradis * @version 1.0 */ code[class*="language-"], pre[class*="language-"] { color: #a9b7c6; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { color: inherit; background: rgba(33,66,131,.85); } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { color: inherit; background: rgba(33,66,131,.85); } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.cdata { color: #808080; } .token.delimiter, .token.boolean, .token.keyword, .token.selector, .token.important, .token.atrule { color: #cc7832; } .token.operator, .token.punctuation, .token.attr-name { color: #a9b7c6; } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: #e8bf6a; } .token.entity, .token.number, .token.symbol { color: #6897bb; } .token.property, .token.constant, .token.variable { color: #9876aa; } .token.string, .token.char { color: #6a8759; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: #ffc66d; } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #294436; } .token.deleted { background: #484a4a; } /*code.language-css .token.punctuation { color: #cc7832; }*/ code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-dracula.css ================================================ /** * Dracula Theme originally by Zeno Rocha [@zenorocha] * https://draculatheme.com/ * * Ported for PrismJS by Albert Vallverdu [@byverdu] */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #282a36; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6272a4; } .token.punctuation { color: #f8f8f2; } .namespace { opacity: .7; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ff79c6; } .token.boolean, .token.number { color: #bd93f9; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #50fa7b; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #f8f8f2; } .token.atrule, .token.attr-value, .token.function, .token.class-name { color: #f1fa8c; } .token.keyword { color: #8be9fd; } .token.regex, .token.important { color: #ffb86c; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-duotone-dark.css ================================================ /* Name: Duotone Dark Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-evening-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2734; color: #9a86fd; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6a51e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6a51e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6c6783; } .token.punctuation { color: #6c6783; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #e09142; } .token.property, .token.function { color: #9a86fd; } .token.tag-id, .token.selector, .token.atrule-id { color: #eeebff; } code.language-javascript, .token.attr-name { color: #c4b9fe; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #ffcc99; } .token.placeholder, .token.variable { color: #ffcc99; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #eeebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c4b9fe; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #8a75f5; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c2937; } .line-numbers-rows > span:before { color: #3c3949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(224, 145, 66, 0.2); background: -webkit-linear-gradient(left, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); background: linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-duotone-earth.css ================================================ /* Name: Duotone Earth Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-earth-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #322d29; color: #88786d; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6f5849; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6f5849; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6a5f58; } .token.punctuation { color: #6a5f58; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #bfa05a; } .token.property, .token.function { color: #88786d; } .token.tag-id, .token.selector, .token.atrule-id { color: #fff3eb; } code.language-javascript, .token.attr-name { color: #a48774; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fcc440; } .token.placeholder, .token.variable { color: #fcc440; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #fff3eb; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #a48774; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #816d5f; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #35302b; } .line-numbers-rows > span:before { color: #46403d; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(191, 160, 90, 0.2); background: -webkit-linear-gradient(left, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); background: linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-duotone-forest.css ================================================ /* Name: Duotone Forest Author: by Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-forest-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2d2a; color: #687d68; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #435643; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #435643; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #535f53; } .token.punctuation { color: #535f53; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #a2b34d; } .token.property, .token.function { color: #687d68; } .token.tag-id, .token.selector, .token.atrule-id { color: #f0fff0; } code.language-javascript, .token.attr-name { color: #b3d6b3; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #e5fb79; } .token.placeholder, .token.variable { color: #e5fb79; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #f0fff0; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #b3d6b3; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #5c705c; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c302c; } .line-numbers-rows > span:before { color: #3b423b; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(162, 179, 77, 0.2); background: -webkit-linear-gradient(left, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); background: linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-duotone-light.css ================================================ /* Name: Duotone Light Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-morning-light.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #faf8f5; color: #728fcb; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #faf8f5; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #faf8f5; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #b6ad9a; } .token.punctuation { color: #b6ad9a; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #063289; } .token.property, .token.function { color: #b29762; } .token.tag-id, .token.selector, .token.atrule-id { color: #2d2006; } code.language-javascript, .token.attr-name { color: #896724; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #728fcb; } .token.placeholder, .token.variable { color: #93abdc; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #2d2006; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #896724; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #896724; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #ece8de; } .line-numbers-rows > span:before { color: #cdc4b1; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(45, 32, 6, 0.2); background: -webkit-linear-gradient(left, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); background: linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-duotone-sea.css ================================================ /* Name: Duotone Sea Author: by Simurai, adapted from DuoTone themes by Simurai for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-sea-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #1d262f; color: #57718e; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #004a9e; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #004a9e; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #4a5f78; } .token.punctuation { color: #4a5f78; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #0aa370; } .token.property, .token.function { color: #57718e; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebf4ff; } code.language-javascript, .token.attr-name { color: #7eb6f6; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #47ebb4; } .token.placeholder, .token.variable { color: #47ebb4; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebf4ff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #7eb6f6; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #34659d; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #1f2932; } .line-numbers-rows > span:before { color: #2c3847; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(10, 163, 112, 0.2); background: -webkit-linear-gradient(left, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); background: linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-duotone-space.css ================================================ /* Name: Duotone Space Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-space-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #24242e; color: #767693; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #5151e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #5151e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #5b5b76; } .token.punctuation { color: #5b5b76; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #dd672c; } .token.property, .token.function { color: #767693; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebebff; } code.language-javascript, .token.attr-name { color: #aaaaca; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fe8c52; } .token.placeholder, .token.variable { color: #fe8c52; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #aaaaca; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #7676f4; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #262631; } .line-numbers-rows > span:before { color: #393949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(221, 103, 44, 0.2); background: -webkit-linear-gradient(left, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); background: linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-ghcolors.css ================================================ /** * GHColors theme by Avi Aryan (http://aviaryan.in) * Inspired by Github syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #b3d4fc; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #999988; font-style: italic; } .token.namespace { opacity: .7; } .token.string, .token.attr-value { color: #e3116c; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.entity, .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.property, .token.regex, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-name, .language-autohotkey .token.selector { color: #00a4db; } .token.function, .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.tag, .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.function, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-hopscotch.css ================================================ @import url(https://fonts.googleapis.com/css?family=Fira+Mono); /* * Hopscotch * by Jan T. Sott * https://github.com/idleberg/Hopscotch * * This work is licensed under the Creative Commons CC0 1.0 Universal License */ code[class*="language-"], pre[class*="language-"] { color: #ffffff; font-family: "Fira Mono", Menlo, Monaco, "Lucida Console","Courier New", Courier, monospace; font-size: 16px; line-height: 1.375; direction: ltr; text-align: left; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; background: #322931; color: #b9b5b8; } pre > code[class*="language-"] { font-size: 1em; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797379; } .token.punctuation { color: #b9b5b8; } .namespace { opacity: .7; } .token.null, .token.operator, .token.boolean, .token.number { color: #fd8b19; } .token.property { color: #fdcc59; } .token.tag { color: #1290bf; } .token.string { color: #149b93; } .token.selector { color: #c85e7c; } .token.attr-name { color: #fd8b19; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #149b93; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #8fc13e; } .token.statement, .token.regex, .token.atrule { color: #149b93; } .token.placeholder, .token.variable { color: #1290bf; } .token.important { color: #dd464c; font-weight: bold; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid red; outline-offset: .4em; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-material-dark.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #eee; background: #2f2f2f; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #a5e844; } .token.attribute { color: #a5e844; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.comment { color: #616161; } .token.constant { color: #c792ea; } .token.deleted { color: #ff6666; } .token.doctype { color: #616161; } .token.entity { color: #ff6666; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #616161; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #a5e844; } .token.pseudo-element { color: #a5e844; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #ff6666; } .token.string { color: #a5e844; } .token.symbol { color: #c792ea; } .token.tag { color: #ff6666; } .token.unit { color: #fd9170; } .token.url { color: #ff6666; } .token.variable { color: #ff6666; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-material-light.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #90a4ae; background: #fafafa; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #cceae7; color: #263238; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #cceae7; color: #263238; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #f76d47; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #7c4dff; } .token.attr-name { color: #39adb5; } .token.attr-value { color: #f6a434; } .token.attribute { color: #f6a434; } .token.boolean { color: #7c4dff; } .token.builtin { color: #39adb5; } .token.cdata { color: #39adb5; } .token.char { color: #39adb5; } .token.class { color: #39adb5; } .token.class-name { color: #6182b8; } .token.comment { color: #aabfc9; } .token.constant { color: #7c4dff; } .token.deleted { color: #e53935; } .token.doctype { color: #aabfc9; } .token.entity { color: #e53935; } .token.function { color: #7c4dff; } .token.hexcode { color: #f76d47; } .token.id { color: #7c4dff; font-weight: bold; } .token.important { color: #7c4dff; font-weight: bold; } .token.inserted { color: #39adb5; } .token.keyword { color: #7c4dff; } .token.number { color: #f76d47; } .token.operator { color: #39adb5; } .token.prolog { color: #aabfc9; } .token.property { color: #39adb5; } .token.pseudo-class { color: #f6a434; } .token.pseudo-element { color: #f6a434; } .token.punctuation { color: #39adb5; } .token.regex { color: #6182b8; } .token.selector { color: #e53935; } .token.string { color: #f6a434; } .token.symbol { color: #7c4dff; } .token.tag { color: #e53935; } .token.unit { color: #f76d47; } .token.url { color: #e53935; } .token.variable { color: #e53935; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-material-oceanic.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #c3cee3; background: #263238; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #c3e88d; } .token.attribute { color: #c3e88d; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.color { color: #f2ff00; } .token.comment { color: #546e7a; } .token.constant { color: #c792ea; } .token.deleted { color: #f07178; } .token.doctype { color: #546e7a; } .token.entity { color: #f07178; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; font-style: italic; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #546e7a; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #c3e88d; } .token.pseudo-element { color: #c3e88d; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #f07178; } .token.string { color: #c3e88d; } .token.symbol { color: #c792ea; } .token.tag { color: #f07178; } .token.unit { color: #f07178; } .token.url { color: #fd9170; } .token.variable { color: #f07178; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-pojoaque.css ================================================ /* * Pojoaque Style by Jason Tate * http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html * Based on Solarized Style from http://ethanschoonover.com/solarized * http://softwaremaniacs.org/media/soft/highlight/test.html */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 15px; line-height: 1.5; color: #dccf8f; text-shadow: 0; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre) > code[class*="language-"] { border-radius: 5px; border: 1px solid #000; color: #DCCF8F; background: #181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top; } pre[class*="language-"] { padding: 12px; overflow: auto; } :not(pre) > code[class*="language-"] { padding: 2px 6px; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #586e75; font-style: italic; } .token.number, .token.string, .token.char, .token.builtin, .token.inserted { color: #468966; } .token.attr-name { color: #b89859; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #dccf8f; } .token.selector, .token.regex { color: #859900; } .token.atrule, .token.keyword { color: #cb4b16; } .token.attr-value { color: #468966; } .token.function, .token.variable, .token.placeholder { color: #b58900; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol { color: #b89859; } .token.tag { color: #ffb03b; } .token.important, .token.statement, .token.deleted { color: #dc322f; } .token.punctuation { color: #dccf8f; } .token.entity { cursor: help; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } /* .pojoaque-colors { color: #586e75; color: #b64926; color: #468966; color: #ffb03b; color: #b58900; color: #b89859; color: #dccf8f; color: #d3a60c; color: #cb4b16; color: #dc322f; color: #073642; color: #181914; } */ ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-shades-of-purple.css ================================================ /** * Shades of Purple Theme for Prism.js * * @author Ahmad Awais * @support Follow/tweet at https://twitter.com/MrAhmadAwais/ */ code[class*='language-'], pre[class*='language-'] { color: #9efeff; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; font-family: 'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-weight: 400; font-size: 17px; line-height: 25px; letter-spacing: 0.5px; text-shadow: 0 1px #222245; } pre[class*='language-']::-moz-selection, pre[class*='language-'] ::-moz-selection, code[class*='language-']::-moz-selection, code[class*='language-'] ::-moz-selection, pre[class*='language-']::selection, pre[class*='language-'] ::selection, code[class*='language-']::selection, code[class*='language-'] ::selection { color: inherit; background: #a599e9; } /* Code blocks. */ pre[class*='language-'] { padding: 2em; margin: 0.5em 0; overflow: auto; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #1e1e3f; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; } .token { font-weight: 400; } .token.comment, .token.prolog, .token.cdata { color: #b362ff; } .token.delimiter, .token.keyword, .token.selector, .token.important, .token.atrule { color: #ff9d00; } .token.operator, .token.attr-name { color: rgb(255, 180, 84); } .token.punctuation { color: #ffffff; } .token.boolean { color: rgb(255, 98, 140); } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: rgb(255, 157, 0); } .token.entity, .token.symbol { color: #6897bb; } .token.number { color: #ff628c; } .token.property, .token.constant, .token.variable { color: #ff628c; } .token.string, .token.char { color: #a5ff90; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: rgb(250, 208, 0); } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #00ff00; } .token.deleted { background: #ff000d; } code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } .token.class-name { color: #fb94ff; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { background: none; } pre .line-highlight, pre .line-highlight.line-highlight, pre > code.line-highlight { margin-top: 36px; background: linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent); } pre .line-highlight:before, pre > code.line-highlight:before, pre .line-highlight[data-end]:after, pre > code.line-highlight[data-end]:after { content: ''; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-synthwave84.css ================================================ /* * Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code * Demo: https://marc.dev/demo/prism-synthwave84 * * Ported for PrismJS by Marc Backes [@themarcba] */ code[class*="language-"], pre[class*="language-"] { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background-color: transparent !important; background-image: linear-gradient(to bottom, #2a2139 75%, #34294f); } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.block-comment, .token.prolog, .token.doctype, .token.cdata { color: #8e8e8e; } .token.punctuation { color: #ccc; } .token.tag, .token.attr-name, .token.namespace, .token.number, .token.unit, .token.hexcode, .token.deleted { color: #e2777a; } .token.property, .token.selector { color: #72f1b8; text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475; } .token.function-name { color: #6196cc; } .token.boolean, .token.selector .token.id, .token.function { color: #fdfdfd; text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975; } .token.class-name { color: #fff5f6; text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75; } .token.constant, .token.symbol { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; } .token.important, .token.atrule, .token.keyword, .token.selector .token.class, .token.builtin { color: #f4eee4; text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575; } .token.string, .token.char, .token.attr-value, .token.regex, .token.variable { color: #f87c32; } .token.operator, .token.entity, .token.url { color: #67cdcc; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } .token.inserted { color: green; } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-vs.css ================================================ /** * VS theme by Andrew Lock (https://andrewlock.net) * Inspired by Visual Studio syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #C1DEF1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #C1DEF1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #008000; font-style: italic; } .token.namespace { opacity: .7; } .token.string { color: #A31515; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, .language-json .token.number, code[class*="language-css"]{ color: #0000ff; } .token.function { color: #393A34; } .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.class-name, .language-json .token.property { color: #2B91AF; } .token.tag, .token.selector { color: #800000; } .token.attr-name, .token.property, .token.regex, .token.entity { color: #ff0000; } .token.directive.tag .tag { background: #ffff00; color: #393A34; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #a5a5a5; } .line-numbers-rows > span:before { color: #2B91AF; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(193, 222, 241, 0.2); background: -webkit-linear-gradient(left, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); background: linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); } ================================================ FILE: ko/gitbook/gitbook-plugin-prism/prism-xonokai.css ================================================ /** * xonokai theme for JavaScript, CSS and HTML * based on: https://github.com/MoOx/sass-prism-theme-base by Maxime Thirouin ~ MoOx --> http://moox.fr/ , which is Loosely based on Monokai textmate theme by http://www.monokai.nl/ * license: MIT; http://moox.mit-license.org/ */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 2; -o-tab-size: 2; tab-size: 2; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-wrap: normal; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 14px; color: #76d9e6; text-shadow: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre)>code[class*="language-"] { background: #2a2a2a; } pre[class*="language-"] { padding: 15px; border-radius: 4px; border: 1px solid #e1e1e8; overflow: auto; } pre[class*="language-"] { position: relative; } pre[class*="language-"] code { white-space: pre; display: block; } :not(pre)>code[class*="language-"] { padding: 0.15em 0.2em 0.05em; border-radius: .3em; border: 0.13em solid #7a6652; box-shadow: 1px 1px 0.3em -0.1em #000 inset; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6f705e; } .token.operator, .token.boolean, .token.number { color: #a77afe; } .token.attr-name, .token.string { color: #e6d06c; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #e6d06c; } .token.selector, .token.inserted { color: #a6e22d; } .token.atrule, .token.attr-value, .token.keyword, .token.important, .token.deleted { color: #ef3b7d; } .token.regex, .token.statement { color: #76d9e6; } .token.placeholder, .token.variable { color: #fff; } .token.important, .token.statement, .token.bold { font-weight: bold; } .token.punctuation { color: #bebec5; } .token.entity { cursor: help; } .token.italic { font-style: italic; } code.language-markup { color: #f9f9f9; } code.language-markup .token.tag { color: #ef3b7d; } code.language-markup .token.attr-name { color: #a6e22d; } code.language-markup .token.attr-value { color: #e6d06c; } code.language-markup .token.style, code.language-markup .token.script { color: #76d9e6; } code.language-markup .token.script .token.keyword { color: #76d9e6; } /* Line highlight plugin */ pre[class*="language-"][data-line] { position: relative; padding: 1em 0 1em 3em; } pre[data-line] .line-highlight { position: absolute; left: 0; right: 0; padding: 0; margin-top: 1em; background: rgba(255, 255, 255, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } pre[data-line] .line-highlight:before, pre[data-line] .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .4em; left: .6em; min-width: 1em; padding: 0.2em 0.5em; background-color: rgba(255, 255, 255, 0.4); color: black; font: bold 65%/1 sans-serif; height: 1em; line-height: 1em; text-align: center; border-radius: 999px; text-shadow: none; box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); } pre[data-line] .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } ================================================ FILE: ko/gitbook/gitbook.js ================================================ !function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=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)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,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(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(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(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!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,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.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:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.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 A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(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&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(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&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.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):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.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=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.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)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.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,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,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":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.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 de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de("

Project V

Project V는 인터넷을 통해 자신 만의 개인 정보 네트워크를 구축 할 수 있도록 도와주는 일련의 도구입니다. V2Ray이라는 Project V의 핵심은 네트워크 프로토콜과 통신을 담당합니다. 혼자서 작업 할 수있을뿐만 아니라 다른 도구와 결합 할 수도 있습니다.

이 웹 사이트는 주로 전체 프로젝트와 관련된 몇 가지 추가 정보와 함께 V2Ray의 설명서입니다.

풍모

  • 다중 인바운드 / 아웃 바운드 프록시 : 하나의 V2Ray 인스턴스는 여러 개의 인바운드 및 아웃 바운드 프로토콜을 병렬로 지원합니다. 각 프로토콜은 독립적으로 작동합니다.
  • 맞춤형 라우팅 : 라우팅 구성에 따라 수신 트래픽을 여러 아웃 바운드로 보낼 수 있습니다. 대상 지역 또는 도메인별로 트래픽을 라우팅하기 쉽습니다.
  • 다중 프로토콜 : V2Ray는 Socks, HTTP, Shadowsock, VMess 등 여러 프로토콜을 지원합니다. 각 프로토콜에는 TCP, mKCP, WebSocket 등과 같은 자체 전송이있을 수 있습니다.
  • 난독 화 : V2Ray는 TLS에서 트래픽을 숨기기 위해 난독 화 기능을 내장하고 있으며 웹 서버와 병렬로 실행할 수 있습니다.
  • 역방향 프록시 : 역방향 프록시의 일반적인 지원. localhost에 터널을 빌드하는 데 사용할 수 있습니다.
  • 여러 플랫폼 : Windows, Mac OS, Linux 등에서 V2Ray가 기본적으로 실행됩니다. 또한 모바일에서 타사 지원도 있습니다.

Sponsors

v2net

This site is generated by GitBook, and host on GitHub. If you'd like to modify its content, please send pull request to this repo.

================================================ FILE: ko/styles/website.css ================================================ .book-summary { font-family: "Noto Sans CJK SC", "PingFang SC", "Microsoft Yahei", "Hiragino Sans GB", sans-serif; font-size: 14px; } .book-header .btn { padding: 0 5px; } .markdown-section { font-family: "Noto Sans CJK SC", "PingFang SC", "Microsoft Yahei", "Hiragino Sans GB", sans-serif; font-weight: 400; font-size: 14px; } .markdown-section pre>code { font-family: "Source Code Pro", monospace; font-weight: 400; font-size: 14px; } .markdown-section code:not([class]) { white-space: nowrap; padding: 0; } .markdown-section blockquote { margin: 0; margin-bottom: .85em; padding: 0 15px; border-left: 4px solid #64b5f6; border-top: 1px solid #64b5f6; color: #000000; margin-top: 10px; } ================================================ FILE: ko/ui_client/README.md ================================================ --- refcn: ui_client/index refen: ui_client/index --- # 프로젝트 V 클라이언트 핵심 V2ray 외에, Project V는 많은 플랫폼에 다양한 GUI 클라이언트를 포함합니다. 다음 목록을 참조하십시오. * [Windows](windows.md) * [맥 OS X](osx.md) * [iOS](ios.md) * [기계적 인조 인간](android.md) * [온라인 서비스](ui_client/service.md) ================================================ FILE: ko/ui_client/android.md ================================================ --- refcn: ui_client/android refen: ui_client/android --- # Android 클라이언트 ## BifrostV BifrostV는 V2Ray 코어 기반의 Android 앱입니다. VMess, Shadowsocks, socks 프로토콜을 지원합니다. * 다운로드 : [Play 스토어](https://play.google.com/store/apps/details?id=com.github.dawndiy.bifrostv) * 다운로드 : [APK Pure](https://apkpure.com/bifrostv/com.github.dawndiy.bifrostv) ## V2RayNG V2RayNG는 V2Ray를 기반으로하는 Android 앱입니다. V2Ray 코어와 동일한 기능 세트를 제공합니다. * 다운로드 : [Play 스토어](https://play.google.com/store/apps/details?id=com.v2ray.ang) * 출처 : [GitHub](https://github.com/2dust/v2rayNG) ## V2Ray Go * 다운로드 : [Play 스토어](https://play.google.com/store/apps/details?id=org.kkdev.v2raygo) * 출처 : [Github](https://github.com/xiaokangwang/V2RayGO) ## 악티늄 * 다운로드 : Play 스토어 (사용할 수 없음) * 출처 : [Github](https://github.com/V2Ray-Android/Actinium) ## 기타 도구 {#other} ### 주스 SSH 클라이언트. * 다운로드 : [Play 스토어](https://play.google.com/store/apps/details?id=com.sonelli.juicessh) * 웹 사이트 : [JuiceSSH.com](https://juicessh.com/) ### Termius SSH 클라이언트 * 다운로드 : [Play 스토어](https://play.google.com/store/apps/details?id=com.server.auditor.ssh.client) ### 전보 암호화 된 토론. * 웹 사이트 : [telegram.org](https://telegram.org/) * 다운로드 : [Play 스토어](https://play.google.com/store/apps/details?id=org.telegram.messenger) ================================================ FILE: ko/ui_client/ios.md ================================================ --- refcn: ui_client/ios refen: ui_client/ios --- # iOS 고객 ## 키츠 네비 Kitsunebi는 V2Ray를 기반으로하는 iOS 앱입니다. V2Ray와 같은 모든 기능을 제공합니다. V2Ray 호환 JSON 구성 가져 오기 및 내보내기도 지원합니다. * Download: [iTunes](https://itunes.apple.com/us/app/kitsunebi-proxy-utility/id1446584073?mt=8) ## 키츠 네비 라이트 Kitsunebi의 가벼운 버전. * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/kitsunebi-lite/id1387913765/) ## 그림자 격자 Shadowrocket은 일반적인 VPN 응용 프로그램입니다. Is는 Shadowsocks, VMess, SSR 등과 같은 여러 프로토콜을 지원합니다. * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/shadowrocket/id932747118/) ## Pepi (ShadowRay) {#pepi} Pepi는 V2Ray 호환 응용 프로그램입니다. VMess 프로토콜을 기반으로 VPN 연결을 생성하고 모든 V2Ray 서버와 통신 할 수 있습니다. * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/pepi/id1283082051/) ## Quantumult * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/quantumult/id1252015438/) ## 기타 도구 {#other} ### HyperApp 도커로 서버를 구축하는 유틸리티. * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/hyperapp/id1179750280/) * 웹 사이트 : [HyperApp.fun](https://www.hyperapp.fun/) ### Termius SSH 클라이언트. * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/termius/id549039908/) ### 전보 암호화 된 토론. * 웹 사이트 : [telegram.org](https://telegram.org/) * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/telegram-messenger/id686449807/) ### 프로톤 메일 암호화 된 이메일. * 웹 사이트 : [protonmail.com](https://protonmail.com/) * 다운로드 : [iTunes](https://www.v2ray.com/itunes/us/protonmail-encrypted-email/id979659905/) ================================================ FILE: ko/ui_client/osx.md ================================================ --- refcn: ui_client/osx refen: ui_client/osx --- # 맥 OS X ## V2RayX * 다운로드 : [Github](https://github.com/Cenmrev/V2RayX) ## V2RayU * Download: [Github](https://github.com/yanue/V2rayU) ## Other tools {#other} ### Visual Studio 코드 Microsoft의 소스 코드 편집기. * Website: [code.visualstudio.com](https://code.visualstudio.com/) ### 전보 암호화 된 토론. * Website: [telegram.org](https://telegram.org/) * Download: [Mac App Store](https://www.v2ray.com/itunesm/us/telegram-desktop/id946399090/) ### Microsoft 원격 데스크톱 연결 클라이언트 * Download: [Mac App Store](https://www.v2ray.com/itunesm/us/microsoft-remote-desktop/id715768417/) ================================================ FILE: ko/ui_client/service.md ================================================ --- refcn: ui_client/service refen: ui_client/service --- # 온라인 서비스 The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V. ## V2Ray 관련 * [구성 생성기](https://htfy96.github.io/v2ray-config-gen/) * [UUID 생성기](https://www.uuidgenerator.net/) ## VPN * [BabyDriver](http://babydriver.me/): V2Ray를 지원합니다. 쿠폰 코드 : bcb518 * [喵 帕斯](https://xn--i2ru8q2qg.com/): V2Ray 지원 (베타) * [Lanan](https://xn--sjt174g.com/): V2Ray 기반 VPN 서비스. 쿠폰 코드 : v2ray * [다수 派](https://dspi.io/aff.php?aff=7): 새로운 V2Ray 기반 VPN 서비스. * [V2rayPro](https://myv2.us/): VPN service based on V2Ray. Coupon code: v2ray.com * [V2Net](http://v2net.org/): Customized V2Ray service. Promo code: v2ray.com ## Hosting * [암호화하자](https://letsencrypt.org/): 무료 TLS 인증서 * [Vultr](https://www.vultr.com/?ref=7269307): VPS * [2019 limited promotion, $50 free credit](https://www.vultr.com/?ref=7783021-4F) * [BlueHost](https://www.bluehost.com/track/v2ray/): VPS, web hosting * [ClouDNS](https://www.cloudns.net/aff/id/244749/): Domain registration, DNS, SSL certificate ## Cryptocurrency * [LocalBitcoins](https://localbitcoins.com/?ch=khtm): Trade Bitcoins offline * [CoinCola](https://www.coincola.com/mobile/signup?ref=QAcvfy2g): OTC market to trade BTC, ETH, BCH, USDT. * [Binance](https://www.binance.com/?ref=35382451): Trading market for crypto currencies. * [Coinex](https://www.coinex.com/account/signup?refer_code=r3fmp): Trading market for crypto currencies. * [CoinPayment](https://www.coinpayments.net/index.php?ref=abc5f542afed6b37b4b3d7fb83242d18): Online crypto currency wallet * [PrimeDice](https://primedice.com/?c=default): Dice game with bitcoin. * [OneHash](https://www.onehash.com/?ap=56d52158f7e04b169ec54d): Bet sport games with Bitcoin, including World Cup 2018. * [Bitsler](https://www.bitsler.com/?ref=VictoriaR): Casino games with Bitcoin. ================================================ FILE: ko/ui_client/windows.md ================================================ --- refcn: ui_client/windows refen: ui_client/windows --- # Windows ## V2RayW * 다운로드 : [Github](https://github.com/Cenmrev/V2RayW) ## V2RayN * 다운로드 : [Github](https://github.com/2dust/v2rayN) ## V2RayS * 다운로드 : [Github](https://github.com/Shinlor/V2RayS) ## 기타 도구 {#other} ### 퍼티 SSH 클라이언트. * 웹 사이트 : [putty.org](http://www.putty.org/) ### Visual Studio 코드 Microsoft의 소스 코드 편집기. * 웹 사이트 : [code.visualstudio.com](https://code.visualstudio.com/) ### 전보 암호화 된 토론. * 웹 사이트 : [telegram.org](https://telegram.org/) ================================================ FILE: ko/welcome/command.html ================================================ 명령 행 · Project V

명령 행

V2 레이

V2Ray에는 다음과 같은 명령 줄 매개 변수가 있습니다.

v2ray [-version] [-test] [-config=config.json] [-format=json]

-version

Print the version of V2Ray only, and then exit.

-test

Test configuration, output any errors and then exit.

-config

URI of the configuration. Avilable formats are:

  • Path to the local config file. May be a relative path or absolute path.
  • "stdin:": Indicates V2Ray to read configuration from standard input. Caller must close stdin after writing out configuration.
  • Value begins with http:// or https:// (lowercase): V2Ray tries to load configuration from the remote address.

-format

Configuration format. Choices are:

  • json: JSON format.
  • pb or protobuf: Protobuf format.

When -config is not specified, V2Ray first tries to load configuration from config.json under working directory, then from the directory specified by environment variable v2ray.location.asset.

V2Ctl

V2Ctl is a collection of commandline tools. It runs in the following way:

v2ctl <command> <options>

command

Subcommand. Available values are below:

  • api: Invoke remote control commands in V2Ray instances.
  • config: Convert configuration from JSON format to protobuf.
  • cert: Generate TLS certificates.
  • fetch: Fetch remove resources.
  • tlsping: (V2Ray 4.17+) Test TLS handshake.
  • verify: Verify the signature of V2Ray releases.
  • uuid: Generate UUID.

V2Ctl Api

v2ctl api [--server=127.0.0.1:8080] <Service.Method> <Request>

Invoke remote control commands in V2Ray instances. Example:

v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger ''

V2Ctl Config

v2ctl config

No option for this command. It reads JSON configuration from stdin, and print out corresponding Protobuf to stdout, if succeeds.

V2Ctl Cert

v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h] [--name="V2Ray Inc"] [--org="V2Ray Inc] [--json] [--file=v2ray]

Generates a TLS certificate based on options.

--ca

If specified, the certificate will be a CA certificate.

--domain

Alternative Names in the certificate. This option can be used multiple times for multiple domains. For example: --domain=v2ray.com --domain=v2ray.cool.

--expire

Expire date of the certificate. Value is a Golang duration.

--name

Command Name in the certificate.

--org

Orgnization in the certificate.

--json

If specified, the certificate will be printed to stdout in the JSON format that is used in V2Ray.

--file

Prints the certificate into files. When --file=a, two files named a_cert.pem and a_key.pem will be generated.

V2Ctl Fetch

v2ctl fetch <url>

Fetch remove resources and print to stdout. Only HTTP and HTTPS URL are supported.

V2Ctl TlsPing

v2ctl tlsping <domain> --ip=[ip]

Test TLS handlshake with specific domain.

domain

Target domain for the TLS handshake.

--ip

The IP address of the domain. If not specifed, V2Ctl resolves it through system DNS.

V2Ctl Verify

v2ctl verify [--sig=/path/to/sigfile] <filepath>

To verify the signature of a V2Ray binary.

--sig

Path to signature file. Default value is the ".sig" file to the path to be verified.

filepath

The file to be verified.

V2Ctl UUID

v2ctl uuid

No options. This command prints a random UUID.

================================================ FILE: ko/welcome/donate.html ================================================ 기부 · Project V

기부

V2Ray is a nonprofit project. The source code and its release binary can be used freely (mainly) under MIT licence. If you like this project, you may buy us a cup of coffee.

Your donation has no direct connection to Project V's development and service. Our development will not be influenced by your donation. However, we will send a thank-you email for every donor. If you wish not to receive such email, please leave a note in your donation.

For any donation worth more than $50, you may choose one of the following:

  • Your name or your company log shown on our front page for one month.
  • Modify our codebase as you wish. Restrictions: No user facing functionlity changes; no documentation changes. Your change will stay for a month.

평범한 길

Paypal

You may donate through internal Paypal transfer or credit card

Please kindly note that Paypal charges high service fee. Any donation less than 1 USD is meaningless.

Patreon

Patreon is a platform for regular donations. You may use Patreon if you want to donate frequently.

Giftcard

For now we only receive giftcard for Amazon US. You may purchase it at Amazon.com and then send to love@v2ray.com.

암호 해독 성

Cryptocurrency is a more reliable way for international transactions. Crypto-wallet is usually anonymous and your donation is not traceable.

Due to the anonymity natural of cryptocurrenty, please send us an email before your donation, if you want to receive the thank-you email.

Bitcoin

Address: 3GctrB7R5sMhJ73N4AKo56Bdf9RE3RJsuM

View stats or QR-Code at BlockChain

Bitcoin Cash

Address: 15oATKUq5mEfuzasPnsJ58TjJU5SvDJK97

View stats or QR-Code at BlockChain

Ethereum

Address: 0x112ee71189704fe04cabed4aa045f4461c8c8696

View stats or QR-Code at BlockChain. You may also send the following ERC20 tokens to this address: OMG, REP, GNT, DGD

EOS

Address: EOS8Civdok4CBN3jCpsaGQijzesjKof1eyaRFuBU5mLMtWVkLsy8a

Litecoin

Address: LVdeH2HkCgGRs8ZEpan7fkAEEPbiJ4McoR

Monero

Address: 48kA4NyLRCWQvB7U2A77G66Z25uWbyzmoZSYjxJfrMR1J4dRFW6fWFLDn3wirAqP8ySnR4rnvoXWxfkNFhrK5ZxY1WyBqKg

Ripple

Address: r439fPk8DzCf4nSxkpfodEuE2cG4KVZQHq

Tag not required

Other

Please send us an email at love@v2ray.com if you want to donate other kind of coins.

================================================ FILE: ko/welcome/faq.html ================================================ 자주하는 질문 · Project V

자주 묻는 질문 (FAQ)

V2Ray 사용

V2Ray를 업그레이드하는 방법

  • 최신 패키지 다운로드 또는
  • 설치 스크립트 다시 실행 (Linux 전용)

V2Ray 충돌

  • Linux를 systemd와 함께 사용하는 경우 명령 journalctl -u v2ray사용하여 패닉 로그를 볼 수 있습니다.
  • 일반적으로 명령 v2ray -config =<config-file> -test 를 실행하여 오류 정보를 볼 수 있습니다.

Backward Compatibility

  • For configuration file (e.g., JSON), backward compatibility applies to at least one major releases. For example, V2Ray 4.x supports config files from V2Ray 3.x.
  • For Protobuf based communication protocols, such as Api, backward compatibility applies to at least one major releases.
  • For binary based commnunication protocols, such as Shadowsocks and VMess, it is always backward compatible when server version is not older than clients. When client version is newer, backward compatibility applies to at least 12 minor releases.

V2Ray 오류

Socks: Unknown Socks version: 67

가능한 원인들

  • You are using socks inbound in V2Ray, but your browser is configured to use HTTP proxy.

해결책

  • Add a HTTP inbound in V2Ray, and then update your browser proxy settings to use this proxy.

이 프로젝트의 라이센스

프로젝트 V는 다음 라이센스를 사용합니다.

V2Ray

소스 코드와 공식 릴리스는 다음 저장소의 소스 코드와 릴리스를 포함하여 MIT 라이센스에 따라 라이센스가 부여됩니다.

V2Ray.Com

공식 웹 사이트, v2ray.comCreative Commons Attribution 4.0 International License의거하여 사용이 허가되었습니다.

  • Including all visible text and pictures on the website.
  • Including Project V logo.
  • Including all source code that is used for generating the website, i.e., v2ray/manual.

Screenshot and other files

아래에 나열된 모든 제 3 자 파일은 작성자의 것입니다. 파일을 만든 사람은 파일을 소유합니다.

  • Including all screenshots of Project V.
  • Including all configuration files that are used to run Project V.
  • Including all logs generated by Project V during runtime.

Other content

위에 언급되지 않은 모든 컨텐츠는 케이스별로 라이센스가 부여됩니다.

================================================ FILE: ko/welcome/help.html ================================================ 지원하다 · Project V

지원하다

프로젝트 V는 여러 가지 통신 방법을 제공합니다.

Project V team supports Chinese and English. Please choose either one that you are familiar with for questions.

기생 문제

We uses several repositories for different type of discussions.

전보

Project V provides the following groups for different type of discussions.

  • 용법
    • Project V 관련 주제에만 해당됩니다.
  • 기타
    • 다른 주제들.

Topics in these groups are mainly in Chinese. Feel free to setup groups in your own language and let us know.

All discussion groups forbid the following topics: adult content, politics, hate speeches. Senders of these topics will be banned immedietely.

Please also follow Project V Announcement for news.

지저귀다

ProjectV2Ray for regular communications.

이메일

Please send a message to one of the address below, if you'd like to talk to V2Ray team privately.

love@v2ray.com: Main email address for communication. Checked every day.

v2ray@protonmail.com: A ProtonMail mailbox which employs end to end encryption. It is difficult to use, and only being checked occasionally.

Sadly due to high workload, it is not promised that every email gets replied. Sorry for the inconvenience. For general questions, please use discussion groups above for quick response.

You may get PGP public key by searching love@v2ray.com, or use the public key below.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org

mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu
3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85
c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs
0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w
EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk
CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj
OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY
cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m
uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV
va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF
5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB
tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP
eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu
ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY
WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM
iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG
1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5
iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm
ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM
otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe
3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q
dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT
swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh
SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc
tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt
kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB
8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/
ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y
1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO
SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+
GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/
KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/
b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy
ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN
dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP
eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV
9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB
TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt
6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ
IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+
2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT
tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH
iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6
U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD
WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B
X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt
PeRpd1GUXXeoGCw=
=To5T
-----END PGP PUBLIC KEY BLOCK-----
================================================ FILE: ko/welcome/install.html ================================================ 설치 · Project V

다운로드 & 설치

플랫폼

V2Ray는 다음 플랫폼에서 사용할 수 있습니다.

  • Windows 7 이상 (x86 / amd64)
  • Mac OS X 10.10 요세미티 이상 (amd64)
  • Linux 2.6.23 이상 (x86 / amd64 / arm / arm64 / mips64 / mips)
    • 데비안 7 / 8, 우분투 12.04 / 14.04 이상, CentOS 6 / 7, 아치 리눅스
  • FreeBSD (x86 / amd64)
  • OpenBSD (x86 / amd64)
  • 잠자리 BSD (amd64)

다운로드

사전 제작 된 패키지는 다음에서 찾을 수 있습니다.

  1. Github 출시 : github.com/v2ray/v2ray-core
  2. Redistribution: github.com/v2ray/dist
  3. 자작 : github.com/v2ray/homebrew-v2ray
  4. 아치 리눅스 : 패키지 / 커뮤니티 / x86_64 / v2ray /
  5. 스냅 크래프트 : snapcraft.io/v2ray-core

모든 패키지는 ZIP 형식입니다. 해당 패키지를 다운로드하여 시스템에 압축을 풉니 다.

확인

패키지를 검증하는 2 가지 방법이 있습니다.

  1. 각각 .ZIP 파일은 대응 갖는 .dgst SHA 다이제스트위한 파일.
  2. 실행 파일 (v2ray / v2ray.exe)에 대한 GPG 서명 파일은 동일한 패키지의 v2ray.sig (또는 v2ray.exe.sig)에서 찾을 수 있습니다. 공개 키는 저장소</a>에서 입니다.</li> </ol>

    Windows 또는 Mac OS에 설치

    패키지 압축을 푼 후 v2ray / v2ray.exe를 실행하십시오.

    Linux에 설치

    우리는 리눅스에 설치하기위한 스크립트를 제공합니다. 이 스크립트는 이전에 설치된 v2ray를 감지하고 그에 따라 새 버전을 업그레이드 또는 설치합니다. 이전 버전이있는 경우 업그레이드 중에 / etc / v2ray에있는 구성 파일을 덮어 쓰지 않습니다.

    다음 명령은 루트 권한을 가정합니다.

    다음 명령을 실행하여 V2Ray를 설치하십시오. yum 또는 apt를 사용할 수 있으면 스크립트는 unzip 및 daemon / systemd를 설치합니다. V2Ray를 서비스로 실행해야합니다. Linux 시스템이 yum이나 apt를 지원하지 않으면 수동으로 설치해야합니다.

    curl -Ls https://install.direct/go.sh | sudo bash
    

    스크립트는 다음 파일을 설치합니다.

    • / usr / bin / v2ray / v2ray: V2Ray 실행 파일
    • / usr / bin / v2ray / v2ctl: 유틸리티
    • /etc/v2ray/config.json: 설정 파일
    • /usr/bin/v2ray/geoip.dat: IP 데이터 파일
    • /usr/bin/v2ray/geosite.dat: 도메인 데이터 파일

    이 스크립트는 systemd를 사용할 수있는 경우 V2Ray가 서비스로 실행되도록 구성합니다.

    구성은 다음 위치에 있습니다.

    • /etc/systemd/system/v2ray.service: Systemd
    • /etc/init.d/v2ray: SysV

    설치 후 다음 작업을 수행해야합니다.

    1. 자신 만의 시나리오를 위해 /etc/v2ray/config.json 파일을 업데이트하십시오.
    2. service v2ray start 명령을 실행하여 V2Ray를 시작합니다.
    3. V2Ray 서비스를 제어하려면 선택적으로 서비스 v2ray start | stop | status | reload | restart | force-reload 을 실행하십시오.

    go.sh

    go.sh는 다음 매개 변수를 지원합니다.

    • -p 또는 --proxy: 프록시를 사용하여 V2Ray 패키지를 다운로드하십시오. 컬 포맷과 동일 같은 "SOCKS5 : //127.0.0.1 1080" 또는 "http://127.0.0.1:3128".
    • -f 또는 - 강제: 강제 설치. 스크립트는 V2Ray가 전혀 설치되지 않았다고 가정합니다.
    • - 버전: "v1.13"과 같이 설치할 버전. 기본값은 최신 안정 릴리스입니다.
    • 로컬: 설치에 로컬 패키지를 사용하십시오.

    예 :

    • SOCKS 프록시 127.0.0.1:1080을 사용하여 최신 패키지를 설치하십시오. ./go.sh -p socks5://127.0.0.1:1080
    • 로컬 파일에서 v1.13 설치 :./go.sh --version v1.13 --local /path/to/v2ray.zip

    도커

    V2Ray는 2 개의 도커 이미지를 제공합니다.

    2 개의 이미지는 Linux 설치와 동일한 구조를가집니다.

================================================ FILE: ko/welcome/start.html ================================================ 빠른 시작 · Project V

빠른 시작

V2Ray를 설치 한 후에 구성해야합니다. 다음은 데모 실행을위한 빠른 구성입니다. 고급 설정은 구성 개요 을 참조하십시오.

고객

PC (또는 모바일)에서 다음 구성으로 V2Ray를 실행하십시오.

{
  "inbounds": [{
    "port": 1080,  // Port of socks5 proxy. 이 포트를 사용하도록 브라우저를 지정하십시오.
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "server", // Address of your V2Ray server. IP 또는 도메인 주소 일 수 있습니다.
        "port": 10086,  // Port of your V2Ray server.
        "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
      }]
    }
  },{
    "protocol": "freedom",
    "tag": "direct",
    "settings": {}
  }],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [{
      "type": "field",
      "ip": ["geoip:private"],
      "outboundTag": "direct"
    }]
  }
}

위에서 언급 한 것처럼 V2Ray 서버의 IP 주소를 수정하십시오. 그런 다음 PC의 V2Ray 프로세스는 인트라넷 트래픽을 제외한 V2Ray 서버에 대한 모든 트래픽을 프록시합니다.

섬기는 사람

V2Ray를 서버로 실행하려면 다른 컴퓨터가 필요합니다. 일반적으로이 컴퓨터는 방화벽 외부에 있습니다. 다음은 샘플 구성입니다.

{
  "inbounds": [{
    "port": 10086, // Port of the server. 위와 같아야합니다.
    "protocol": "vmess",
    "settings": {
      "clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  }]
}

id 필드가 클라이언트와 서버간에 동일해야합니다.

달리는

  • Windows 및 macOS에서 구성 파일은 V2Ray 바이너리와 동일한 디렉토리에 있습니다. 추가 매개 변수없이 v2ray 또는 v2ray.exe 을 실행할 수 있습니다.
  • Linux에서 구성 파일은 일반적으로 /etc/v2ray/config.json있습니다. 실행 v2ray --config =은 / etc / v2ray / config.json 전경 또는 배경 프로세스로 V2Ray를 실행하는 systemd와 같은 다른 도구를 사용합니다.

구성에 대한 자세한 내용은 개요 을 참조하십시오.

================================================ FILE: ko/welcome/versions.html ================================================ 버전 기록 · Project V

버전 기록

This page lists regular releases with feature updates. If a Github release doesn't appear here, it usually only contains bug fixes.

2019.03.01 v4.18

  • Port list in routing rules now supports mixed format.
  • Updated geosite information in routing, and description for static hosts in DNS.
  • Option to not use system root CAs for TLS handshake.
  • New routing rule for traffic attributes.

2019.02.22 v4.17

  • New sub-command tlsping in V2Ctl.

2019.02.15 v4.16

For end users:

  • DNS outbound proxy now supports to modify DNS server info.

For developers:

  • 'ext' repository is now deprecated. #1541

2019.02.08 v4.15

  • DNS outbound proxy.

2019.02.01 v4.14

  • Static DNS mapping now supports domain to domain mapping.

2019.01.18 v4.13

  • Quic lib updated. It is not compatible with previous versions.
  • DNS now have tag settings.

2019.01.11 v4.11

For developers:

2018.12.07 v4.8

For end users:

  • Bug fixes

For developers:

2018.11.30 v4.7

  • Freedom now supports for dialing IPv4 or IPv6 address only.
  • New QUIC transport.

2018.11.23 v4.6

  • Freedom now can automatically choose between IPv4 and IPv6 destination address, based on SendThrough settings.

2018.11.16 v4.4

  • Load balancer rules in routing.
  • Memory usage gets optimized.

2018.11.05 v4.1

  • JSON configuration format changes. Old format is still suported.
  • Performance on GeoIP matching is improved.

2018.11.02 v4.0

  • Reverse proxy.
  • Release packages for ppc64 and ppc64le.

2018.10.12 v3.47

  • Migrate to a new continuous delivery pipeline

2018.09.28 v3.44

  • Dokodemo-door now supports TProxy in Linux.

2018.09.21 v3.43

  • DNS now supports on-demand queries by domain.

2018.09.14 v3.40

  • New socket options in transport configuration. It can be used to setup VPNs.
  • New TCP Fast Open option in transport configuration.

2018.09.03 v3.38

  • mKCP has a new WireGuard header.
  • Fix softfloat binaries in mips/mips64.

2018.08.31 v3.37

  • Performance of reading network connection in optilized. See Environment Variables
  • VMess uses AES-128-GCM by default on ARM64.
  • Built by Go 1.11.

2018.08.24 v3.36

  • Great performance improvement on subdomain matching (domain:) in routing.
  • Full domain matching is now supported in routing.

2018.08.07 v3.34

  • Better memory management on most devices.

2018.07.27 v3.32

  • BitTorrent traffic can now be sniff'ed.
  • New protocol option in routing rules for protocol-based routing.
  • New geosite:speedtest option in routing rules to match all public servers of speedtest.net.

2018.07.20 v3.31

2018.07.13 v3.30

  • Fix an issue that may cause broken connections in mKCP.
  • Thanks to our friends who speak Russian. Now our documents are in Russian.

2018.07.06 v3.29

  • New inbound and outbound for MTProto proxy.

2018.06.29 v3.27

  • DNS now supports EDNS client subnet.
  • DNS static host now supports sub-domain matching.

2018.06.15 v3.26

  • Add Dragonfly BSD release.

2018.06.01 v3.24

  • Internal buffer size (per connection) can now be configured in JSON configuration.
  • mKCP now supports DTLS 1.2 header.
  • TLS transport now only support cipher suites in TLS 1.3 spec.

2018.05.25 v3.23

  • In JSON configuration, port can now be specified from env variables.
  • JSON config now supports to load domains and IPs from specified files.

2018.04.20 v3.19

  • Traffic stats for inbound proxies.

2018.04.13 v3.17

  • V2Ray can load config file from HTTP(s).
  • TLS in V2Ray can issue new certificates by provided CA certificates for domains in incoming requests.
  • HTTP/2 transport.

2018.04.06 v3.16

  • Statistics.
  • Shadowsocks inbound now can be configured to only listen on UDP. Strongly recommend to not listen on both TCP and UDP on the same port.

2018.03.02 v3.11

  • A new settings is introduced in VMess inbound, to forbid client using insecure encryption methods.
  • Offers ARMv7 release.
  • Offers MIPS release that doesn't require FPU.

2018.02.23 v3.10

  • Log entries now contain session ID to distinguish proxy sessions.
  • Bug fixes.

2018.02.15 v3.9

  • Happy New Year!
  • Bug fixes.

2018.02.09 v3.7

2017.12.29 v3.5

  • Geoip now supports private network address under name "private".

2017.12.22 v3.4

  • Websocket nows uses value of X-Forwarded-For header as source address.
  • Support s390x CPU architecture.

2017.12.08 v3.1

  • Support policy.
  • Config file location can be specified via environment variable.

2017.12.01 v3.0

  • Support Shadowsocks AEAD

2017.11.18 v2.50

  • v2ray now tried to use v2ctl for configuration parsing. Please make sure these 2 files are in the same directory.
  • New IPOnDemand strategy in routing.

2017.11.10 v2.47

  • geosite data is now in geosite.dat file.
  • Bug fixes.

2017.11.03 v2.46

  • Router now supports geosite:cn, equivalent to existing chinasites, but more flexible.
  • Router now supports geoip.
    • File geoip.dat is added to release packages. This file contains all geoip information and has to stay in the same directory of v2ray program. Due to delayed update of installation script, you may have to copy the file manually.
  • Program v2ctl is added to release packages. You may run v2ctl verify /path/to/v2ray to verify the signature of v2ray program.

2017.10.27 v2.44

  • HTTP now supports Basic Authentication.
  • Some bugs are fixed.

2017.10.06 v2.40

  • Fix an issue that causes memory leak.

2017.09.29 v2.39

  • Inbound proxies now close connections more quickly when remote server closes them.
  • Default connection timeout changes to 5 minutes.

2017.05.12 v2.27

  • New domain mode in router.

2017.05.05 v2.26

  • Stability fixes.

2017.04.28 v2.25

  • Simple sniffing on HTTP and TLS traffic for the actual domain on request.

2017.04.21 v2.24

  • Stabilize Mux.
  • Improves memory efficiency.

2017.04.15 v2.23

  • Performance improvement in Mux.
  • Max number of connections can be configured in Mux now.
  • Performance improvement in HTTP inbound.
  • connectionReuse setting is removed in favor of Mux.

2017.04.08 v2.22

  • Mux.Cool protocol.

2017.02.25 v2.20

  • GPG signature is added to download package.
  • New binary wv2ray.exe is added to Windows package, which runs as a background application.

2017.02.18 v2.19

  • A new mechanism for anti reply attack is now enforced on server side.
    • No impact to existing clients.
  • Upgrade of VMess AES-128-GCM / Chacha20-Poly1305 / None encryption methods.
    • Please upgrade client and server at once.
    • AES-128-CFB is not affected.
  • Built with Golang 1.8. Add 32-bit MIPS support.

2017.02.11 v2.18

  • Cleanup WebSocket code.
  • Remove allowPassive option. Now passive connections are always allowed.
  • Bug fixes

2017.02.04 v2.17

  • Bug fixes.

2017.01.28 v2.16

  • New 'redirect' option in freedom. It can be used to adapt tools like Shadowsocks Obfs.
  • Performance improvement in VMess non-encryption mode. Not compatible with previous versions.
  • Happy New Year!

2017.01.16 v2.15

  • All proxies can use mKCP and WebSocket now.

2017.01.09 v2.14

  • Socks 5 outbound.
  • Bug fixes.

2017.01.02 v2.13

  • Bug fixes.

2016.12.26 v2.12

  • Bug fixes.

2016.12.19 v2.11

  • JSON config file now supports comment.

2016.12.12 v2.10

  • VMess now supports AES-GCM and ChaCha20-Poly1305 encryption methods.

2016.12.05 v2.9

  • Fix compatibility with Alpine Linux.

2016.11.28 v2.8

  • Shadowsocks server now accepts OTA settings.
  • Bug fixes.

2016.11.21 v2.7

  • Main inbound and outbound connection handler can be tagged now.
  • Bug fixes.

2016.11.14 v2.6

  • Data sent by one outbound can be proxied to another outbound.
  • Routing can be based on inbound tag.

2016.11.07 v2.5

  • New Shadowsocks outbound;
  • New TCP header: HTTP;

2016.10.24 v2.4

  • TCP / mKCP / WebSocket can be configured per inbound / outbound;
  • Routing can be done on source IP;

2016.10.17 v2.3

  • Introduce new Protobuf-based configuration;
  • OpenBSD binaries;
  • Small fixes;

2016.09.19 v2.2

2016.09.19 v2.1

  • mKCP performance improvement;

2016.08.20 v2.0

  • One year;

2016.08.15 v1.24

  • New mKCP header: utp;
  • New option in inbound connection config "allowPassive" to allow passive connection;

2016.08.08 v1.23

  • Optimize mKCP packet format. This version of mKCP is NOT compatible with previous ones;
  • mKCP can now be configured to disguise as video data.

2016.08.01 v1.22

  • Fix a memory leak in mKCP;
  • Add FreeBSD release;

2016.07.25 v1.21

  • High performance Chacha20 (Thanks to aead@);
  • Bug fixes;

2016.07.18 v1.20

  • New KCP options: readBufferSize and writeBufferSize;
  • Bug fixes;

2016.07.11 v1.19

  • Enable TLS option for all proxies;
  • Fix a performance issue in KCP;
  • Fix an issue in KCP that could cause EOF response;

2016.07.04 v1.18

  • Fix a "too many open files" issue in KCP;
  • KCP now uses fewer CPU;
  • Other bug fixes;

2016.06.19 v1.17

2016.06.12 v1.16

  • TCP connection reuse is now enabled by default;
  • Dokodemo-door is able to recognize TCP connection redirected by iptables;
  • Blackhole is able to send back HTTP forbidden data;

2016.06.05 v1.15

  • Optionally reuse TCP connection for better performance;
  • Allow listening on a specific IP address;
  • Allow sending data through a specific IP address;
  • Fix an issue in HTTP proxy that may exhaust memory;

2016.05.29 v1.14

  • Fix a panic issue in http proxy;
  • More functionalies in install script;
  • Static route in DNS;
  • Official server address change;

2016.05.16 v1.13

  • Internal DNS server, to provide better routing results combined with chinasites and chinaip;
  • Fix an issue in UDP relay;

2016.05.01 v1.12.1

  • Fix a bug in VMess.

2016.05.01 v1.12

  • Second try to fix the memory usage issue;
  • Improve Shadowsocks performance;
  • New option "none" in loglevel;

2016.04.18 v1.11

  • Try to fix the memory usage issue.

2016.03.07 v1.10

  • Fix an performance issue when dynamic ports refreshes.

2016.02.29 v1.9.1

  • Fix Shadowsocks one-time authentication (OTA) issue.

2016.02.29 v1.9

  • Support for Shadowsocks ChaCha20 encryption;
  • Add more direct connection sites to the default configuration file;
  • Dynamic ports now automatically create an account.

2016.02.22 v1.8

  • Update installation script install-release.sh (thanks, @netcookies):
    • You can now automatically stop the V2Ray process and update automatically after the completion of V2Ray;
    • The install-release.sh accepts the --proxy argument and V2Ray specified proxy download;
  • Use Go 1.6 compiler to improve the performance of AES encryption;
  • Minor fixes;
  • Update the official server IP (please re-download the installation package to get the latest configuration).

2016.02.08 v1.7

  • UDP relay performance improved;
  • Shadowsocks security improved;
  • Minor fixes;
  • Happy new year!
================================================ FILE: ko/welcome/workflow.html ================================================ 워크 플로 · Project V

워크 플로

단일 서버

다른 프록시와 마찬가지로 V2Ray를 실행하는 프록시 서버가 필요합니다. 그런 다음 PC, 모바일 또는 기타 장치에서 해당 서버를 통해 인터넷에 연결할 수 있습니다.

graph LR; A(PC) -.- B(Firewall); B -.-> C(Blocked Website); A --> D(V2Ray/VPS); D --> C; A --> E(Normal Website);

V2Ray supports connections from multiple devices at the same time, with optionally different protocols. In the mean time, the local routing mechanism can smartly proxy necessary connections only.

서버 브리지

In the case you don't want configuration V2Ray on each of your devices, you may setup a server within the firewall, and then all traffic go through that server. The server does routing itself.

graph LR; A(PC) -.-> B(Firewall); B -.-> C(Blocked Website); A --> D(VPS 1); D --> E(VPS 2); E --> C; D --> F(Normal Website);

내부의

The internal of V2Ray looks like below. It supports multiple inbound proxies, and multiple outbounds. Each of them are independent from others.

graph LR; A1(inbound) --> D(Dispatcher / Router / DNS); A2(inbound) --> D; A3(inbound) --> D; A4(inbound) --> D; D --> B1(outbound); D --> B2(outbound); D --> B3(outbound); D --> B4(outbound);

Notes:

  • V2Ray를 제대로 작동 시키려면 적어도 하나의 인바운드 및 하나의 아웃 바운드를 구성해야합니다.
  • 인바운드 프록시는 브라우저와 같은 클라이언트 소프트웨어와 통신합니다.
  • 아웃 바운드 프록시는 웹 사이트의 Apache와 같은 원격 서버와 통신합니다.
  • 디스패처는 구성 가능한 규칙을 기반으로 특정 연결에 대한 아웃 바운드를 선택합니다.

Detailed configuration can be found here.

================================================ FILE: links/chinasites/index.html ================================================ Moved ================================================ FILE: robots.txt ================================================ User-agent: * Allow: / ================================================ FILE: ru/awesome/ads.html ================================================ With Ads · Project V Official

Some Advertisement

The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V.

Self Hosting

Let's Encrypt

Free TLS certificates

Vultr

VPS

2019 limited promotion, $50 free credit

BlueHost

VPS, web hosting

ClouDNS

Domain registration, DNS, SSL certificate

Bandwagon

Well-known VPS provider. Low price for good product.

VPN

BabyDriver

Supports V2Ray. Coupon code: bcb518

喵帕斯

V2Ray support (beta)

Lanan

V2Ray based VPN service. Coupon code: v2ray

V2Net

Customized V2Ray service. Promo code: v2ray.com

Cryptocurrency

LocalBitcoins

Trade Bitcoins offline

CoinCola

OTC market to trade BTC, ETH, BCH, USDT.

Binance

Trading market for crypto currencies.

Coinex

Trading market for crypto currencies.

CoinPayment

Online crypto currency wallet

================================================ FILE: ru/awesome/tools.html ================================================ Awesome V · Project V Official

Awesome V

Graphic Client

V2RayW

Download: Github

V2RayN

Download: Github

Clash for Windows

Download: Github

V2RayX

Download: Github

V2RayU

Download: Github

V2RayC

Download: Github

ClashX

Download: Github

Qv2ray

Qv2ray: v2ray Cross-Platform GUI written in Qt, supports multi-language, connection edit and auto-check updates

Download: GitHub

Website (Chinese): https://lhy0403.github.io/Qv2ray

Mellow

Mellow is a rule-based global transparent proxy client for Windows, macOS and Linux.

Download: Github

Kitsunebi

Kitsunebi is an iOS app based on V2Ray. It provides full functionality as V2Ray. It also supports importing and exporting V2Ray compatible JSON configuration.

Download: iTunes

i2Ray

i2Ray is another iOS app based on V2Ray with easy-to-use UI design.

Download: iTunes

Shadowrocket

Shadowrocket is a generic VPN app. Is supports multiple protocols such as Shadowsocks, VMess, SSR etc.

Download: iTunes

Pepi (was ShadowRay)

Pepi is V2Ray compatible app. Is is able create VPN connections based on VMess protocol, and communicate with any V2Ray servers.

Download: iTunes

Quantumult

Download: iTunes

BifrostV

BifrostV is an Android app based on V2Ray core. It supports VMess, Shadowsocks, socks protocols.

Download: Play Store | APK Pure

V2RayNG

V2RayNG is an Android app based on V2Ray. It provides same feature set as V2Ray core.

Download: Play Store | GitHub

Online services

Configuration generator

Online configuration generator.

UUID Generator

UUID generator for VMess users.

================================================ FILE: ru/configuration/api.html ================================================ API · Project V Official

API

V2Ray предоставляет API для удаленного доступа. Эти API основаны на gRPC.

Когда API включено, V2Ray автоматически создает исходящий прокси, помеченный через tag. Пользователь должен маршрутизировать все соединения gRPC в этот прокси.

ApiObject

ApiObject используется как поле api на верхнем уровне конфигурации.

{
  "tag": "api",
  "services": [
    "HandlerService",
    "LoggerService",
    "StatsService"
  ]
}

tag: string

Метка исходящего прокси.

services: [ string ]

Список включенных API.

Список поддерживаемых API

HandlerService

API для управления входящими и исходящими прокси. Доступны следующие функции:

  • Добавление нового входящего/исходящего прокси.
  • Удаление существующего входящего/исходящего прокси.
  • Добавление нового пользователя входящего прокси (только для VMess).
  • Удаление существующего пользователя входящего прокси (только для VMess).

LoggerService

Перезапуск внутреннего логгера. Может работать с logrotate для оперирования файлами журнала.

StatsService

Поддержка внутренней статистики.

================================================ FILE: ru/configuration/dns.html ================================================ DNS · Project V Official

DNS

V2Ray имеет внутренний DNS-сервер, используемый другими компонентами.

Due to the complexity of DNS protocol, V2Ray for now only supports basic IP queries (A and AAAA). We recommend to use a professional DNS rely (such as CoreDNS) for V2Ray.

The DNS queries relayed by this DNS service will also be dispatched based on routing settings. No extra configuration is required.

DnsObject

DnsObject is used as dns field in top level configuration.

{
  "hosts": {
    "baidu.com": "127.0.0.1"
  },
  "servers": [
    {
      "address": "1.2.3.4",
      "port": 5353,
      "domains": [
        "domain:v2ray.com"
      ]
    },
    "8.8.8.8",
    "8.8.4.4",
    "localhost"
  ],
  "clientIp": "1.2.3.4",
  "tag": "dns_inbound"
}

hosts: map{string: address}

A list of static addresses, in the form of domain:address. Each entry has a domain name as key and IP or domain address as value. If a DNS query targets one of the domains in this list, the corresponding IP will be returned immediately and DNS query will not be relayed, or the corresponding domain address will be used for further DNS queries, instead of the previous one.

The format of domains is:

  • Plaintext: When the targeting domain is exactly the value, the rule takes effect. Example: rule "v2ray.com" matches "v2ray.com", but not "www.v2ray.com".
  • Regular expression: Begining with "regexp:", the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule "regexp:\\.goo.*\\.com$" matches "www.google.com" and "fonts.googleapis.com", but not "google.com".
  • Subdomain (recommended): Begining with "domain:" and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule "domain:v2ray.com" matches "www.v2ray.com", "v2ray.com", but not "xv2ray.com".
  • Keyword: Begining with "keyword:" and the rest is a pattern. If this string matches any part of the targeting domain, this rule takes effet. Example: rule "keyword:sina.com" matches targeting domain "sina.com", "sina.com.cn" and "www.sina.com", but not "sina.cn".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.

servers: [string | ServerObject | "localhost" ]

List of DNS servers. Each server may be specified in three formats: IP address, ServerObject, or "localhost".

When a server is an IP address, such as "8.8.8.8", V2Ray queries DNS on UDP port 53 on this address.

When a server is "localhost", V2Ray queries local host for DNS.

When "localhost" is used, out-going DNS traffic is not controlled by V2Ray. However, you may redirect DNS queries back to V2Ray with additional configuration.

clientIp: string

IP address of current machine. If specified, V2Ray uses this IP as EDNS-Client-Subnet. This IP can't be a private address.

tag: string

(V2Ray 4.13+) All traffic initiated from this DNS, except to localhost, will have this tag as inbound. It can be used for routing.

ServerObject

{
  "address": "1.2.3.4",
  "port": 5353,
  "domains": [
    "domain:v2ray.com"
  ],
}

address: address

Address of the DNS server. For now only UDP servers are supported.

port: number

Port of the DNS server. Usually it is 53 or 5353.

domains: [string]

A list of domains. If the domain of enquire matches one of the list, this DNS server will be prioritized for DNS query for this domain.

Domain name format is the same as in routing.

When a DNS server has the domain in its domain list, the domain will be queried in this server first, and then other servers. Otherwise DNS queries are sent to DNS servers in the order they appear in the config file.

================================================ FILE: ru/configuration/env.html ================================================ Переменные · Project V Official

Переменные окружения

V2Ray считывает следующие переменные среды.

Размер кеша на соединение

  • Имя: v2ray.ray.buffer.size или V2RAY_RAY_BUFFER_SIZE
  • Единицы: МБ
  • Значение по умолчанию: 2 на x86, amd64, arm64 и s390x. Этот кэш отключен на других платформах.
  • Диапазон: от 0 до бесконечности

Устарело. Используйте bufferSize в Локальной политике.

Для каждого соединения, у которого есть разница в скорости между входящим и исходящим трафиком, V2Ray будет кэшировать некоторые данные для большей пропускной способности. Этот параметр управляет размером кэша. Чем больше кеш, тем лучше производительность.

Расположение данных V2Ray

  • Имя: v2ray.location.asset или V2RAY_LOCATION_ASSET
  • Значение по умолчанию: директория, где находится v2ray.

Эта переменная указывает каталог, в котором находятся файлы geoip.dat и geosite.dat.

Расположение конфигурации V2Ray

  • Имя: v2ray.location.config или V2RAY_LOCATION_CONFIG
  • Значение по умолчанию: директория, где находится v2ray.

Эта переменная указывает каталог, в котором находится config.json.

Рассеянное чтение (Scatter reading)

  • Имя: v2ray.buf.readv или V2RAY_BUF_READV
  • Значение по умолчанию: auto

V2Ray 3.37 использует Scatter/Gather IO. Эта функция будет использовать меньше памяти, если скорость соединения превышает 100 МБайт/с. Возможные значения auto, enable и disable.

  • enable: Включить рассеянное чтение.
  • disable: Выключить рассеянное чтение.
  • auto: Включить рассеянное чтение только на Windows, MacOS, Linux с ЦП x86, AMD64 или s390x.

Когда скорость соединения меньше 100 Мбайт/с, независимо от того, включена опция или нет, явной разницы в использовании памяти не наблюдается.

================================================ FILE: ru/configuration/index.html ================================================ Настройка · Project V Official

Настройка

V2Ray использует конфиг на основе protobuf. Поскольку формат protobuf слабо читабелен, V2Ray также поддерживает настройку в JSON. Перед запуском, V2Ray автоматически преобразует конфигурацию JSON в protobuf. В дальнейшем могут быть введены другие форматы конфигурации.

Здесь мы приводим конфигурацию на основе JSON.

JSON или JavaScript Object Notation - способ представления объектов в Javascript. Один JSON-файл содержит один и только один JSON-объект, начинающийся с «{» и завершающийся «}».

JSON-объект содержит список пар ключ-значение. Ключ - это строка, а значение может быть строкой, числом, логическим значением, массивом или другим объектом. Типичный объект выглядит следующим образом:

{
  "stringValue": "This is a string.",
  "numberValue": 42,
  "boolValue": true,
  "arrayValue": ["this", "is", "a", "string", "array"],
  "objectValue": {
    "another": "object"
  }
}

V2Ray supports comments in JSON,annotated by "//" or "/* */". In an editor that doesn't support comments, they may get displayed as errors, but comments actually work fine in V2Ray.

Типы данных JSON

Here is a brief introduction of JSON data types. They will be referenced in the rest of docs.

boolean: true | false

Boolean value, has to be either true or false, without quotation mark.

number

Usually non-negative integers, without quotation mark.

string

Sequence of characters, surrounded by quotation mark.

array: []

Array of elements. The type of its elements is usually the same, e.g., [string] is an array of strings.

object: {}

Object. It comes with a list of key value pairs.

A key value pair usually ends with a comma ",", but must not ends with a comma if it is the last element of the object.

V2Ray Common Data Types

map: object {string, string}

An object whose keys and values have fixed types.

address: string

An IP or domain address in string form, such as "8.8.8.8" or "www.v2ray.com"

address_port: string

An address with port, such as "8.8.8.8:53" or "www.v2ray.com:80". In some usages, the address part can be omitted, like ":443".

================================================ FILE: ru/configuration/mux.html ================================================ Мультиплексирование · Project V Official

Мультиплексирование

Мультиплексирование или Mux - это использование одного физического TCP-соединения для нескольких виртуальных TCP-соединений.

Мультиплексирование предназначено для уменьшения задержек при установлении соединения (handshake) TCP. Это НЕ повышает пропускную способность. При загрузке больших файлов или измерении скорости, Mux обычно медленнее, чем обычное TCP-подключение.

MuxObject

{
  "enabled": false,
  "concurrency": 8
}

enabled: true | false

Включать или нет Mux для исходящих соединений.

concurrency: number

Максимальное количество мультиплексированных соединений, которые может одновременно обрабатывать одно физическое соединение. Максимум: 1024, минимум: 1, по умолчанию: 8.

================================================ FILE: ru/configuration/overview.html ================================================ Обзор · Project V Official

Обзор настроек

V2Ray имеет одинаковую структуру (см. ниже) файлов с настройками как на сервере, так и на клиенте. В отдельных секциях настройки сервера и клиента отличаются.

Ниже представлена ​​структура верхнего уровня конфигурации. Каждый раздел имеет свой собственный формат.

{
  "log": {},
  "api": {},
  "dns": {},
  "stats": {},
  "routing": {},
  "policy": {},
  "inbounds": [],
  "outbounds": [],
  "transport": {}
}

log: LogObject

Log configuration to control log outputs.

api: ApiObject

RPC API to control the V2Ray instance. See API configuration for details.

dns: DnsObject

Configuration for internal DNS server's configurations. If this section is omitted, V2Ray will use your system-wide DNS configuration. For details, see DNS Configurations.

stats: StatsObject

When specified, internal Statistics is enabled.

policy: PolicyObject

Configurations for permissions and other security strategies. For details, see Local Policy.

routing: RoutingObject

Configuration for internal Routing strategy.

inbounds: [ InboundObject ]

An array of InboundObject as configuration for inbound proxies.

outbounds: [ OutboundObject ]

An array of OutboundObject as configuration for outbound proxies. The first outbound in the array is the main one. It is the default outbound in routing decision.

transport: TransportObject

Low-level transport protocol's configurations. For details, see Protocol Transport Options.

LogObject

{
  "access": "/path/to/file",
  "error": "/path/to/file",
  "loglevel": "warning"
}

access: string

Path to access log. If not empty, it must be a legal file path, such as "/tmp/v2ray/_access.log"(Linux), or "C:\\Temp\\v2ray\\_access.log"(Windows). If empty, V2Ray writes access log to stdout.

error: string

Path to error log. If not empty, it must be a legal file path. If empty, V2Ray writes error log to stdout.

loglevel: "debug" | "info" | "warning" | "error" | "none"

Level of logs to be written. Different log levels indicate different content of logs. Default value is "warning".

Уровни журналирования:

  • "debug": Information for developers only. Also includes all "info" logs.
  • "info": Information for current state of V2Ray. Users don't have to take care of those. Also includes all "warning" logs.
  • "warning": Something wrong with the environment, usually outside of V2Ray, e.g., network breakage. V2Ray still runs, but users may experience some breakages. Also includes all "error" logs.
  • "error": Something severely wrong, that V2Ray can't run at all.
  • "none": All logging are disabled.

InboundObject

An InboundObject defines an inbound proxy. It handles incoming connections to V2Ray. Available proxies are listed here.

{
  "port": 1080,
  "listen": "127.0.0.1",
  "protocol": "protocol_name",
  "settings": {},
  "streamSettings": {},
  "tag": "inbound_tag_name",
  "sniffing": {
    "enabled": false,
    "destOverride": ["http", "tls"]
  },
  "allocate": {
    "strategy": "always",
    "refresh": 5,
    "concurrency": 3
  },
}

port: number | "env:variable" | string

Port that the proxy is listening on. Acceptable formats are:

  • Integer: actual port number.
  • Environment variable: Beginning with "env:", an env variable specifies the port in string format, such as "env:PORT". V2Ray will decode the variable as string.
  • String: A numberic string value, such as "1234", or a range of ports, such as "5-10" for 6 ports in total.

The actual ports to open also depend on allocate setting. See below.

listen: address

The address to be listened on. Default value is "0.0.0.0" for incoming connections on all network interfaces. Otherwise the value has to be the address of an existing network interface.

protocol: string

Name of the inbound protocol. See each individual for available values.

settings: InboundConfigurationObject

Protocol-specific settings. See InboundConfigurationObject defined in each protocol.

streamSettings: [StreamSettingsObject]

See Protocol Transport Options for detail.

tag: string

The tag of the inbound proxy. It can be used for routing decisions. If not empty, it must be unique among all inbound proxies.

sniffing: SniffingObject

Configuration for content sniffing.

allocate: AllocateObject

Configuration for port allocation.

SniffingObject

{
  "enabled": false,
  "destOverride": ["http", "tls"]
}

enabled: true | false

Whether or not to enable content sniffing.

destOverride: ["http" | "tls"]

An array of content type. If the content type of incoming traffic is specified in the list, the destination of the connection will be overwritten by sniffed value.

AllocateObject

{
  "strategy": "always",
  "refresh": 5,
  "concurrency": 3
}

strategy: "always" | "random"

Strategy of port allocation. When it is set to "always", all port in the port field will be allocated for listening. If "random" is set, V2Ray will listen on number of concurrency ports, and the list of ports are refereshed every refresh minutes.

refresh: number

Number of minutes to refresh the ports of listening. Min value is 2. This setting is only effective when strategy is set to "random".

concurrency: number

Number of ports to listen. Min value is 1. Max value is one third of entire port range.

OutboundObject

An OutboundObject defines an outbound proxy for handling out-going connections. Available protocols are listed here.

{
  "sendThrough": "0.0.0.0",
  "protocol": "protocol_name",
  "settings": {},
  "tag": "this_outbound_tag_name",
  "streamSettings": {},
  "proxySettings": {
    "tag": "another_outbound_tag_name"
  },
  "mux": {}
}

sendThrough: address

An IP address for sending traffic out. The default value, "0.0.0.0" is for randomly choosing an IP available on the host. Otherwise the value has to be an IP address from existing network interfaces.

protocol: string

The protocol name of this outbound. See Protocols for all available values.

settings: OutboundConfigurationObject

Protocol-specific settings. See OutboundConfigurationObject in each individual protocols.

tag: string

The tag of this outbound. If not empty, it must be unique among all outbounds.

streamSettings: StreamSettingsObject

Low-level transport settings. See Protocol Transport Options.

proxySettings: ProxySettingsObject

Configuration for delegating traffic from this outbound to another. When this is set, streamSettings of this outbound will has no effect.

mux: MuxObject

See Mux configuration for detail.

ProxySettingsObject

{
  "tag": "another-outbound-tag"
}

tag: string

When tag is set to the tag of another outbound, the out-going traffic of current outbound will be delegated to the specified one.

================================================ FILE: ru/configuration/policy.html ================================================ Правила · Project V Official

Локальная политика

Local policy manages policy settings of current V2Ray instance, such as connection timeouts. The policys can be applied to each user level, or the whole system.

PolicyObject

PolicyObject is used as policy field in top level configuration.

{
  "levels": {
    "0": {
      "handshake": 4,
      "connIdle": 300,
      "uplinkOnly": 2,
      "downlinkOnly": 5,
      "statsUserUplink": false,
      "statsUserDownlink": false
    }
  },
  "system": {
    "statsInboundUplink": false,
    "statsInboundDownlink": false
  }
}

level: map{string: LevelPolicyObject}

A list of key value pairs. Each key is a string of integer (restricted by JSON), such as "0", "1", etc. The numeric value is for a certain user level.

User level can be set on each inbound and outbound proxy. V2Ray will apply different policies based on user level.

system: SystemPolicyObject

System-wide policy

LevelPolicyObject

{
  "handshake": 4,
  "connIdle": 300,
  "uplinkOnly": 2,
  "downlinkOnly": 5,
  "statsUserUplink": false,
  "statsUserDownlink": false,
  "bufferSize": 10240
}

handshake: number

Timeout for establishing a connection, in seconds. Default value 4. At the handshake stage of an inbound proxy dealing with a new connection, say VMess reading request header, if it takes longer than handshake time, V2Ray aborts the connection.

connIdle: number

Timeout for idle connections, in seconds. Default value 300. If there is no data passed through the connection in connIdle time, V2Ray aborts the conneciton.

uplinkOnly: number

Time for keeping connections open after the uplink of the connection is closed, in seconds. Default value 2. After remote (server) closes the downlink of the connection, V2Ray aborts the connection after uplinkOnly times.

downlinkOnly: number

Time for keeping connections open after the downlink of the connection is closed, in seconds. Default value 5. After client (browser) closes the uplink of the connection, V2Ray aborts the connection after downlinkOnly time.

In a simple webpage browser scenario, it is safe to set uplinkOnly and downlinkOnly both to 0, for better performance.

statsUserUplink: true | false

When set to true, V2Ray enables stat counter to uplink traffic for all users in this level.

statsUserDownlink: true | false

When set to true, V2Ray enables stat counter to downlink traffic for all users in this level.

bufferSize: number

Size of internal buffer per connection, in kilo-bytes. Default value is 10240. When it is set to 0, the internal buffer is disabled.

Default value (V2Ray 4.4+):

  • 0 on ARM, MIPS and MIPSLE.
  • 4 on ARM64, MIPS64 and MIPS64LE.
  • 512 on other platforms.

Default value (V2Ray 4.3-):

  • 16 on ARM, ARM64, MIPS, MIPS64, MIPSLE and MIPS64LE.
  • 2048 on other platforms.

bufferSize overrides v2ray.ray.buffer.size settings in env variables.

SystemPolicyObject

{
  "statsInboundUplink": false,
  "statsInboundDownlink": false
}

statsInboundUplink: true | false

When set to true, V2Ray enables stat counter for all uplink traffic in all inbound proxies.

statsInboundDownlink: true | false

When set to true, V2Ray enables stat counter for all downlink traffic in all inbound proxies.

================================================ FILE: ru/configuration/protocols/blackhole.html ================================================ Blackhole · Project V Official

Backhole

  • Название: blackhole
  • Тип: исходящий

Backhole - это протокол для исходящих соединений. Он блокирует все соединения предопределёнными ответами. В сочетании с Маршрутизацией, он может быть использован для блокировки доступа к определённым веб-сайтам.

ConfigurationObject

{
  "response": {
    "type": "none"
  }
}

response: ResponseObject

Если задан, Backhole немедленно отправит его в ответ на запрос и закроет соединение.

ResponseObject

{
  "type": "none"
}

type: "none" | "http"

Тип ответа, доступные параметры:

  • "none": Значение по умолчанию. Пустой ответ.
  • "HTTP": Ответ кодом состояния HTTP 403 Forbidden.
================================================ FILE: ru/configuration/protocols/dns.html ================================================ DNS · Project V Official

DNS

  • Название: dns
  • Тип: исходящий

DNS is an outbound proxy. Он используется в основном для перехвата и проксирования DNS запросов и ответов. Этот прокси пропускает только DNS-запросы по TCP и UDP. Другой тип трафика приведет к ошибкам.

При проксировании DNS-запросов исходящий DNS перенаправляет запросы IP (A и AAAA) на внутренний DNS-сервер. It will send other type of queries directly to its original destination.

Исходящий прокси DNS добавлен в V2Ray 4.15.

OutboundConfigurationObject

{
    "network": "tcp",
    "address": "1.1.1.1",
    "port": 53
}

network: "tcp" | "udp"

(V2Ray 4.16+) Транспортный протокол DNS трафика. Значение может быть "tcp" или "udp". Если не указано, то исходный протокол остается неизменным.

address: адрес

(V2Ray 4.16+) Адрес DNS-сервера в запросе. Если не указано, то адрес сервера не изменяется.

port: number

(V2Ray 4.16+) Порт DNS-сервера в запросе. Если не указано, то порт сервера не изменяется.

================================================ FILE: ru/configuration/protocols/dokodemo.html ================================================ Dokodemo · Project V Official

refcn: chapter_02/protocols/dokodemo refen: configuration/protocols/dokodemo


Dokodemo-door

  • Название: dokodemo-door
  • Тип: входящий

Dokodemo-door - это протокол для входящих соединений. Он принимает любые соединения и передает их в указанное место назначения.

Dokodemo-door также может работать (если настроен) как transparent proxy.

ConfigurationObject

{
  "address": "8.8.8.8",
  "port": 53,
  "network": "tcp",
  "followRedirect": false,
  "userLevel": 0
}

address: address

Адрес определенного сервера. Строка, значением которой может быть IPv4, IPv6 или доменное имя. Если followRedirect (см. ниже) true, address может быть пустым.

port: number

Порт сервера назначения.

network: "tcp" | "udp" | "tcp,udp"

Тип принимаемых соединений. Если выбран "tcp", весь UDP-трафик, отправленный на это dokodemo-соединение, будет отброшен.

followRedirect: true | false

Если установлено значение true, dokodemo-door распознает назначение от TProxy и использует его в качестве адресата. См. TProxy в Настройках доставки для деталей.

userLevel: number

Уровень пользователя. Все подключения проходят через этот уровень. Подробности: Правила.

Примеры для transparent proxy

Добавьте inbound-соединение dokodemo-door, как показано ниже.

{
  "network": "tcp,udp",
  "timeout": 30,
  "followRedirect": true
}

Настройте iptables, как показано ниже.

# Создаём новую цепь
iptables -t nat -N V2RAY
iptables -t mangle -N V2RAY
iptables -t mangle -N V2RAY_MARK

# Игнорируем адреса серверов V2Ray
# Это ОЧЕНЬ ВАЖНО, будьте внимательны.
iptables -t nat -A V2RAY -d 123.123.123.123 -j RETURN

# Игнорируем адреса локальной сети и любые другие адреса,
# которые не требуется пропускать через прокси-сервер
# См. Википедию и RFC5735 для полного списка зарезервированных сетей.
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN

# Всё остальное перенаправляем на локальный порт Dokodemo-door
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345

# Добавляем правила для UDP
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A V2RAY -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A V2RAY_MARK -p udp --dport 53 -j MARK --set-mark 1

# Применяем правила
iptables -t nat -A OUTPUT -p tcp -j V2RAY
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -A OUTPUT -j V2RAY_MARK
================================================ FILE: ru/configuration/protocols/freedom.html ================================================ Freedom · Project V Official

Freedom

  • Название: freedom
  • Тип: исходящий

Freedom is a protocol for outbound connections. It passes all TCP or UDP connection to their destinations. This outbound is used when you want to send traffic to its real destination.

ConfigurationObject

{
  "domainStrategy": "AsIs",
  "redirect": "127.0.0.1:3366",
  "userLevel": 0
}

domainStrategy: "AsIs" | "UseIP"

Стратегия разрешения доменных имен. Возможные варианты:

  • "AsIs": Значение по умолчанию. Доменные имена разрешаются системой.
  • "UseIP": Используйте внутренний DNS для получения доменных имен.
  • "UseIPv4": Use IPv4 address only, after resolved by internal DNS.
  • "UseIPv6": Use IPv6 address only, after resolved by internal DNS.

(V2Ray 4.6+) In UseIP mode, when sendThrough is specified in OutboundObject, Freedom will automatically choose between IPv4 and IPv6 address for destination based on sendThrough settings.

(V2Ray 4.7+) If sendThrough address conflicts with "UseIPv4" or "UseIPv6", Freedom will fail to dial out-going connections.

redirect: address_port

Перенаправление всех соединений на указанный адрес вида "127.0.0.1:80" или ":1234".

  • Если адрес не указан, например ":443", Freedom будет использовать исходный адрес назначения.
  • Если указан порт 0, например "v2ray.com:0", Freedom будет использовать исходный порт.

userLevel: number

Пользовательский уровень. Все подключения имеют этот уровень.

================================================ FILE: ru/configuration/protocols/http.html ================================================ HTTP · Project V Official

HTTP

  • Название: http
  • Тип: входящий

HTTP - это протокол для входящих соединений. Он совместим с HTTP 1.1.

InboundConfigurationObject

{
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "allowTransparent": false,
  "userLevel": 0
}

accounts: [AccountObject]

Массив, в котором каждая запись является учетной записью. По умолчанию — пуст. Если в массиве есть элементы, для входящих запросов потребуется HTTP Basic Authentication.

allowTransparent: true | false

Если установлено значение true, все полученные HTTP-запросы, будут проксированы, включая запрос без прокси.

userLevel: number

Пользовательский уровень. Все подключения имеют этот уровень.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Имя пользователя для аутентификации по HTTP.

pass: string

Пароль для аутентификации по HTTP.

Используйте следующие настройки в Linux для использования прокси-сервера HTTP в текущем сеансе.

  • export http_proxy=http://127.0.0.1:8080/ (Адрес должен быть изменён на требуемый)
  • export https_proxy=$http_proxy

================================================ FILE: ru/configuration/protocols/mtproto.html ================================================ MTProto · Project V Official

MTProto

  • Название: mtproto
  • Тип: входящий / исходящий

MTProto proxy - специальный прокол для Telegram. Он состоит из пары входящих и исходящих прокси в V2Ray. Они обычно используются вместе для создания прокси для Telegram.

На данный момент V2Ray поддерживает только IPv4 адрес сервера Telegram.

InboundConfigurationObject

{
  "users": [{
    "email": "love@v2ray.com",
    "level": 0,
    "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
  }]
}

users: [UserObject]

Массив пользователей. Пока обрабатывается только первый пользователь.

UserObject

{
  "email": "love@v2ray.com",
  "level": 0,
  "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}

email: string

Электронная почта пользователя. Используется для сбора статистики. См. Статистика.

level: number

Уровень пользователя.

secret: string

Секрет пользователя. В Telegram секрет пользователя должен быть длиной 32 символа и содержать только символы от 0 до 9, и от a до f.

Используйте для генерации секрета MTProto эту команду: openssl rand -hex 16

Конфигурация исходящего соединения

{
}

Пример

MTProto может использоваться только для трафика Telegram. Для объединения соответствующего входящего и исходящего может потребоваться правило маршрутизации. Вот неполный образец.

Входящее соединение:

{
  "tag": "tg-in",
  "port": 443,
  "protocol": "mtproto",
  "settings": {
    "users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
  }
}

Исходящее соединение:

{
  "tag": "tg-out",
  "protocol": "mtproto",
  "settings": {}
}

Маршрутизация:

{
  "type": "field",
  "inboundTag": ["tg-in"],
  "outboundTag": "tg-out"
}

Настройте приложение Telegram для подключения к 443 порту на этом устройстве.

================================================ FILE: ru/configuration/protocols/shadowsocks.html ================================================ Shadowsocks · Project V Official

Shadowsocks

  • Name: shadowsocks
  • Тип: входящий / исходящий

Протокол Shadowsocks поддерживает входящие и исходящие соединения.

Совместим с официальной версией:

  • Поддерживает как TCP, так и UDP соединения. UDP может быть отключен.
  • Поддерживает OTA
    • Клиент может отключать и включать поддержку при необходимости.
    • Сервер может принудительно включить, отключить поддержку или использовать конфигурация клиента.
  • Методы шифрования (AEAD шифры, добавленные в V2Ray 3.0):
    • aes-256-cfb
    • aes-128-cfb
    • chacha20
    • chacha20-ietf
    • aes-256-gcm
    • aes-128-gcm
    • chacha20-poly1305 a.k.a. chacha20-ietf-poly1305
  • Плагины:
    • Поддержка obfs через автономный режим.

InboundConfigurationObject

{
  "email": "love@v2ray.com",
  "method": "aes-128-cfb",
  "password": "password",
  "level": 0,
  "ota": true,
  "network": "tcp"
}

email: string

Адрес электронной почты. Используется для идентификации пользователя.

method: string

Required. See Encryption methods for available values.

password: string

Required. Password in Shadowsocks protocol. Can be any string.

level: number

Пользовательский уровень. По умолчанию 0. См. Локальная политика.

ota: true | false

Whether or not to force OTA. If true and the incoming connection doesn't enable OTA, V2Ray will reject this connection. Vice versa.

If this field is not specified, V2Ray auto detects OTA settings from incoming connections.

Когда используется шифрование AEAD, значение ota не используется.

network: "tcp" | "udp" | "tcp,udp"

Проксируемые протоколы. По умолчанию "tcp".

OutboundConfigurationObject

{
  "servers": [
    {
      "email": "love@v2ray.com",
      "address": "127.0.0.1",
      "port": 1234,
      "method": "method",
      "password": "password",
      "ota": false,
      "level": 0
    }
  ]
}

Где:

  • email: Адрес электронной почты. Используется для идентификации пользователя.
  • address: Адрес сервера Shadowsocks. Может быть IPv4, IPv6 или доменом.
  • port: Порт используемый Shadowsocks сервером.
  • method: Метод шифрования. Значение по умолчанию отсутствует. Возможные варианты:
    • "aes-256-cfb"
    • "aes-128-cfb"
    • "chacha20"
    • "chacha20-ietf"
    • "aes-256-gcm"
    • "aes-128-gcm"
    • "chacha20-poly1305" или "chacha20-ietf-poly1305"
  • password: Пароль. Может быть любой строкой.
  • ota: Использовать или не использовать OTA.
    • Когда используется AEAD, значение ota не используется.
  • userLevel: Пользовательский уровень.

servers: [ServerObject]

An array of ServerObjects.

ServerObject

{
  "email": "love@v2ray.com",
  "address": "127.0.0.1",
  "port": 1234,
  "method": "加密方式",
  "password": "密码",
  "ota": false,
  "level": 0
}

email: string

Адрес электронной почты. Используется для идентификации пользователя.

address: address

Required. Shadowsocks server address. May be IPv4, IPv6 or domain address.

port: number

Required. Shadowsocks server port.

method: string

Required. See Encryption methods for available values.

password: string

Required. Password in Shadowsocks protocol. Can be any string.

ota: true | false

Whether or not to use OTA. Default value is false.

Если используется шифрование AEAD, это поле не используется.

level: number

Уровень пользователя.

Методы шифрования

  • "aes-256-cfb"
  • "aes-128-cfb"
  • "chacha20"
  • "chacha20-ietf"
  • "aes-256-gcm"
  • "aes-128-gcm"
  • "chacha20-poly1305" или "chacha20-ietf-poly1305"
================================================ FILE: ru/configuration/protocols/socks.html ================================================ SOCKS · Project V Official

Socks

  • Название: socks
  • Тип: входящий / исходящий

Socks - это реализация стандартного протокола SOCKS, совместимого с Socks 4 , Socks 4а и Socks 5 .

Socks configuration consists of two parts, InboundConfigurationObject and OutboundConfigurationObject, for inbound and outbound respectively.

OutboundConfigurationObject

OutboundConfigurationObject is used as settings field in OutboundObject in top level configuration.

{
  "servers": [{
    "address": "127.0.0.1",
    "port": 1234,
    "users": [
      {
        "user": "test user",
        "pass": "test pass",
        "level": 0
      }
    ]
  }]
}

servers: [ ServerObject ]

Массив Socks-серверов.

ServerObject

{
  "address": "127.0.0.1",
  "port": 1234,
  "users": [
    {
      "user": "test user",
      "pass": "test pass",
      "level": 0
    }
  ]
}

address: address

Адрес сервера. Может быть адресом IPv4, IPv6 или доменным именем.

Поддерживаются только Socks 5 сервера.

port: number

Порт Socks-сервера.

users: [ UserObject ]

An array of users. Each element in the array is an user. If the list is not empty. Socks inbound will force user authentication. Otherwise, anonymous user is allowed.

UserObject

{
  "user": "test user",
  "pass": "test pass",
  "level": 0
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

level: number

User level for tracking and policy purpose. Default value is 0.

InboundConfigurationObject

{
  "auth": "noauth",
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "udp": false,
  "ip": "127.0.0.1",
  "userLevel": 0
}

auth: "noauth" | "password"

Socks autentication method. "noauth" is for anonymous authentication, and "password" for authentication with username and password. Default value is "noauth".

accounts: [ AccountObject ]

An array of user accounts, for authenication purpose. Only take effect when auth is set to "password".

udp: true | false

Whether or not to enable UDP. Default value is false.

ip: address

When UDP is enabled, V2Ray needs to know the IP address of current host. Default value is "127.0.0.1". This must be set to the public IP address of the host, if you want to allow public UDP traffic.

userLevel: number

User level. All incoming connections share this user level.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Username as in Socks protocol

pass: string

Password as in Socks protocol

================================================ FILE: ru/configuration/protocols/vmess.html ================================================ VMess · Project V Official

VMess

  • Название: vmess
  • Тип: входящий / исходящий

VMess это протокол для шифрованной передачи информации. Он включает в себя входящий и исходящий прокси.

VMess зависит от системного времени. Убедитесь, что ваше системное время синхронизировано с временем UTC. Часовой пояс не имеет значения. Можно установить ntp службы на Linux для автоматической синхронизации системного времени.

OutboundConfigurationObject

{
  "vnext": [
    {
      "address": "127.0.0.1",
      "port": 37192,
      "users": [
        {
          "id": "27848739-7e62-4138-9fd3-098a63964b6b",
          "alterId": 4,
          "security": "auto",
          "level": 0
        }
      ]
    }
  ]
}

vnext: [ ServerObject ]

An array, where each element presents a remote server

ServerObject

{
  "address": "127.0.0.1",
  "port": 37192,
  "users": []
}

address: address

Server address, may be IPv4, IPv6 or domain name.

port: number

Server port

users: [ UserObject ]

An array where each element is an VMess user

UserObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "alterId": 16,
  "security": "auto",
  "level": 0
}

id: string

Идентификатор пользователя в формате UUID.

alterId: number

Number of alternative IDs. The alternative IDs will be generated in a deterministic way. Default to 0. Maximum 65535. Recommend 4. Its value must be not larger than the one in corresponding Inbound.

level: number

User level. See Policy for more detail.

security: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none"

Method for encrypting payload. This setting is only available at outbound. The VMess inbound will automatically recognize this setting and decrypt payload accordingly. Options are:

  • "aes-128-gcm": Рекомендуется для ПК.
  • "chacha20-poly1305": Рекомендуется для мобильных устройств.
  • "auto": Значение по умолчанию. Используйте aes-128-gcm на AMD64, ARM64 и S390x, или chacha20-poly1305 в остальных случаях.
  • "none": Не использовать шифрование.

Используйте "auto" где это возможно, для лучшей совместимости.

InboundConfigurationObject

{
  "clients": [
    {
      "id": "27848739-7e62-4138-9fd3-098a63964b6b",
      "level": 0,
      "alterId": 4,
      "email": "love@v2ray.com"
    }
  ],
  "default": {
    "level": 0,
    "alterId": 4
  },
  "detour": {
    "to": "tag_to_detour"
  },
  "disableInsecureEncryption": false
}

clients: [ ClientObject ]

Массив для действительных учетных записей пользователей. Может быть пустым при использовании функции динамического порта.

detour: DetourObject

Optional feature to suggest client to take a detour. If specified, this inbound will instruct the outbound to use another inbound.

default: DefaultObject

Optional default client configuration. Usually used with detour.

disableInsecureEncryption: true | false

Запретить клиенту использовать небезопасные методы шифрования. Если установлено значение true, соединения будут немедленно разорваны, если будут использоваться следующие методы шифрования. Значение по умолчанию: false.

  • none
  • aes-128-cfb

ClientObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "level": 0,
  "alterId": 4,
  "email": "love@v2ray.com"
}

id: string

Идентификатор пользователя в формате UUID.

level: number

User level. See Policy for its usage.

alterId: number

Число альтернативных идентификаторов. То же, что и в Исходящем соединении (см выше).

email: string

Email address for user identification.

DetourObject

{
  "to": "tag_to_detour"
}

to: string

The tag of an inbound proxy. See Overview. If configured, VMess will suggest its client to use the detour for further connections.

DefaultObject

{
  "level": 0,
  "alterId": 4
}

level: number

Уровень пользователя.

alterId: number

Number of alternative IDs. Default value 64. Recommend 4.

================================================ FILE: ru/configuration/protocols.html ================================================ Протоколы · Project V Official

Протоколы

V2Ray поддерживает следующие протоколы (каждый может быть входящим и/или исходящим):

================================================ FILE: ru/configuration/reverse.html ================================================ Обратный прокси · Project V Official

Reverse Proxy

Reverse proxy is an optional feature in V2Ray. It redirects traffic from a server to a client. Thus is so called "Reverse" proxying.

Reverse proxy is available in V2Ray 4.0+. It is now in beta, and may be improved in near future.

Reverse proxy works in the following way:

  • Suppose there is a device A that runs a web server. Device A has no public IP address, and can't be accessed from internet. There is another device B, say a cloud server, which can be access from internet. We need to use B as portal, to redirect traffice to A.
  • Now we install a V2Ray on device A, named bridge. And then install a V2Ray on device B, named portal.
  • bridge will open connections to portal. Their target can be customized for routing purpose. portal will receive these connections, as well as connections from other uses in the internet. portal will "connect" these two kind of connections. Then the interent traffic will be tunneled to bridge.
  • After bridge receives traffic from internet through portal, it will send these traffic to the web server on localhost. You may configure routing for these traffic as well.
  • bridge will control load balance based of the amount of traffic.

Reverse proxy has already leveraged Mux. It is not necessary to configure Mux again on its outbound.

ReverseObject

ReverseObject is used as reverse field in top level configuration.

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }],
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"
  }]
}

bridges: [BridgeObject]

An array of bridges. Each bridge is a BridgeObject.

portals: [PortalObject]

An array of portals. Each portal is a PortalObject.

BridgeObject

{
  "tag": "bridge",
  "domain": "test.v2ray.com"
}

tag: string

A tag. All traffic initiated by this bridge will have this tag. It can be used for routing, identified as inboundTag.

domain: string

A domain. All connections initiated by bridge towards portal will use this domain as target. This domain is only used for communication between bridge and portal. It is not necessary to be actually registered.

PortalObject

tag: string

A Tag. You need to redirect all traffic to this portal, by targeting outboundTag to this tag. The traffic includes the connections from bridge, as well as internet traffic.

domain: string

A domain. When a connection targeting this domain, portal considers it is a connection from bridge, otherwise it is an internet connection.

Like other usages, a V2Ray instance can be used as a bridge, or a portal, or both as the same time.

Example configuration

bridge usually needs two outbounds. One for connecting portal, and another for connecting local web server.

Reverse:

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }]
}

Outbound:

{
  "tag": "out"
  "protocol": "freedom",
  "settings": {
    "redirect": "127.0.0.1:80" // Send traffic to local web server
  }
},
{
  "protocol": "vmess",
  "settings": {
    "vnext": [{
      "address": "portal的IP地址",
      "port": 1024,
      "users": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
    }]
  },
  "tag": "interconn"
}

Routing:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["bridge"],
    "domain": ["full:test.v2ray.com"],
    "outboundTag": "interconn"
  },{
    "type": "field",
    "inboundTag": ["bridge"],
    "outboundTag": "out"
  }]
}

portal usually needs two inbounds. One for connections from bridge, and another for internet connections.

Reverse:

{
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"  // Must be the same as in bridge
  }]
}

Inbound:

{
  "tag": "external",
  "port": 80,  // Open port 80 for internet HTTP traffic
  "protocol": "dokodemo-door",
  "settings": {
    "address": "127.0.0.1",
    "port": 80,
    "network": "tcp"
  }
},
{
  "port": 1024, // For bridge connections
  "tag": "interconn",
  "protocol": "vmess",
  "settings": {
    "clients": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
  }
}

Routing:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["external"],
    "outboundTag": "portal"
  },{
    "type": "field",
    "inboundTag": ["interconn"],
    "outboundTag": "portal"
  }]
}

In practice, you may want to run bridge first and then portal.

================================================ FILE: ru/configuration/routing.html ================================================ Маршрутизация · Project V Official

Маршрутизация

V2Ray has an internal routing mechanism. It routes inbound connections to various outbound based on rules. A common scenario is to split traffic by country. V2Ray can detect target country (by Geo IP) of a connection, and sends then connection to corresponding outbound proxy.

RoutingObject

RoutingObject is used as routing in top level configuration.

{
  "domainStrategy": "AsIs",
  "rules": [],
  "balancers": []
}

domainStrategy: "AsIs" | "IPIfNonMatch" | "IPOnDemand"

Domain resolution strategy. Choices are:

  • "AsIs": Only use domain for routing. Default value.
  • "IPIfNonMatch": When no rule matches current domain, V2Ray resolves it into IP addresses (A or AAAA records) and try all rules again.
    • If a domain has multiple IP addresses, V2Ray tries all of them.
    • The resolved IPs are only used for routing decisions, the traffic is still sent to original domain address.
  • "IPOnDemand": As long as there is a IP-based rule, V2Ray resolves the domain into IP immediately.

rules: [RuleObject]

An array of rules. For each inbound connection, V2Ray tries these rules from top down one by one. If a rule takes effect, the connection will be routed to the outboundTag (or balancerTag, V2Ray 4.4+) of the rule.

balancers: [ BalancerObject ]

(V2Ray 4.4+) An array of load balancers. When a routing rule points to a load balancer, the balancer will select an outbound based on configuration. Then traffic will be sent to that outbound.

RuleObject

{
  "type": "field",
  "domain": [
    "baidu.com",
    "qq.com",
    "geosite:cn"
  ],
  "ip": [
    "0.0.0.0/8",
    "10.0.0.0/8",
    "fc00::/7",
    "fe80::/10",
    "geoip:cn"
  ],
  "port": "53,443,1000-2000",
  "network": "tcp",
  "source": [
    "10.0.0.1"
  ],
  "user": [
    "love@v2ray.com"
  ],
  "inboundTag": [
    "tag-vmess"
  ],
  "protocol":["http", "tls", "bittorrent"],
  "attrs": "attrs[':method'] == 'GET'",
  "outboundTag": "direct",
  "balancerTag": "balancer"
}

When multiple fields are specified, these fields have to be all satisfied, in order to make the rule effective. If you need both domain and ip rules, it is highly likely you need put them into separate rules.

type: "field"

The only valid value for now is "field".

domain: [ string ]

An array of domains. Available formats are:

  • Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule "sina.com" matches targeting domain "sina.com", "sina.com.cn" and "www.sina.com", but not "sina.cn".
  • Regular expression: Begining with "regexp:", the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule "regexp:\\.goo.*\\.com$" matches "www.google.com" and "fonts.googleapis.com", but not "google.com".
  • Subdomain (recommended): Begining with "domain:" and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule "domain:v2ray.com" matches "www.v2ray.com", "v2ray.com", but not "xv2ray.com".
  • Full domain: Begining with "full:" and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule "domain:v2ray.com" matches "v2ray.com", but not "www.v2ray.com".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.
  • Domains from file: Such as "ext:file:tag". The value must begin with ext: (lowercase), and followed by filename and tag. The file is placed in resource directory, and has the same format of geosite.dat. The tag must exist in the file.

ip: [string]

An array of IP ranges. When the targeting IP is in one of the ranges, this rule takes effect. Available formats:

  • IP: such as "127.0.0.1".
  • CIDR: such as "127.0.0.0/8".
  • GeoIP: such as "geoip:cn". It begins with geoip: (lower case) and followed by two letter of country code.
    • Special value "geoip:private": for all private addresses such as 127.0.0.1.
  • IPs from file: Such as "ext:file:tag". The value must begin with ext: (lowercase), and followed by filename and tag. The file is placed in resource directory, and has the same format of geoip.dat. The tag must exist in the file.

"ext:geoip.dat:cn" is equivalent to "geoip:cn".

port:number | string

Port range. Formats are:

  • "a-b": Both a and b are positive integers and less than 65536. When the targeting port is in [a, b), this rule takes effect.
  • a: a is a positive integer, and less than 65536. When the targeting port is a, this rule takes effect.
  • Mix of the two above, separated by ",". Such as "53,443,1000-2000".

network: "tcp" | "udp" | "tcp,udp"

When the connection has in the chosen network, this rule take effect.

source: [string]

An array of IP ranges. Same format as ip. When the source IP of the connection is in the IP range, this rule takes effect.

user: [string]

An array of email address. When the inbound connection uses an user account of the email address, this rule takes effect. For now Shadowsocks and VMess support user with email.

inboundTag: [string]

An array of string as inbound proxy tags. When the connection comes from one of the specified inbound proxy, this rule takes effect.

protocol: [ "http" | "tls" | "bittorrent" ]

An array of string as protocol types. When the connection uses one of the protocols, this rule takes effect. To recognize the protocol of a connection, one must enable sniffing option in inbound proxy.

attrs: string

(V2Ray 4.18+) A Starlark script, used for detecting traffic attributes. When this script returns true, this rule takes effect.

Starlark is a subset of Python. The script takes a global varible named attrs. It contains all attributes of the traffic.

At the moment, only http inbound sets attrs.

Examples:

  • Detect HTTP GET: "attrs[':method'] == 'GET'"
  • Detect HTTP Path: "attrs[':path'].startswith('/test')"
  • Detect Content Type: "attrs['accept'].index('text/html') >= 0"

outboundTag string

Tag of the outbound that the connection will be sent to, if this rule take effect.

balancerTag: string

Tag of an load balancer. Then this rule takes effect, V2Ray will use the balancer to select an outbound. Either outboundTag or balancerTag must be specified. When both are specified, outboundTag takes priority.

BalancerObject

Configuration for a load balancer. When a load balancer takes effective, it selects one outbound from matching outbounds. This outbound will be used for send out-going traffic.

{
  "tag": "balancer",
  "selector": []
}

tag: string

Tag of this BalancerObject, to be matched from balancerTag in RuleObject.

selector: [ string ]

An array of strings. These strings are used to select outbounds with prefix matching. For example, with the following outbound tags: [ "a", "ab", "c", "ba" ],selector ["a"] matches [ "a", "ab" ].

When multiple outbounds are selected, load balancer for now picks one final outbound at random.

Pre-defined domain lists

This is a domain lists maintained by domain-list-community project. It provides a file named geosite.dat for some predefined domain lists. Notably:

  • category-ads: Common ads domains.
  • category-ads-all: Common ads domains and ads providers' domains.
  • cn: Equivalent to an union of geolocation-cn and tld-cn.
  • google: All Google domains.
  • facebook: All Facebook domains.
  • geolocation-cn: Common domains that serve in China.
  • geolocation-!cn: Common domains that don't serve in China
  • speedtest: All domains used by Speedtest.
  • tld-cn: All .cn and .中国 domains.
================================================ FILE: ru/configuration/stats.html ================================================ Статистика · Project V Official

Статистика

V2Ray предоставляет информацию о своём состоянии.

StatsObject

StatsObject используется как поле stats на верхнем уровне конфигурации.

{
}

На данный момент в настройках статистики нет параметров. Статистика включается автоматически, когда StatsObject установлен в конфигурации верхнего уровня. Вам также необходимо включить соответствующие настройки в Policy, чтобы отслеживать статистику пользователя или системы.

Все счетчики статистики перечислены ниже:

Пользовательский трафик

Если у пользователя не указан адрес электронной почты в настройках протокола, статистика трафика не будет включена.

user>>>[email]>>>traffic>>>uplink

Выходной трафик отдельного пользователя, в байтах.

user>>>[email]>>>traffic>>>downlink

Входной трафик отдельного пользователя, в байтах.

Глобальный трафик

inbound>>>[tag]>>>traffic>>>uplink

Выходной трафик отдельного соединения, в байтах.

inbound>>>[tag]>>>traffic>>>downlink

Входной трафик отдельного соединения, в байтах.

================================================ FILE: ru/configuration/transport/domainsocket.html ================================================ DomainSocket · Project V Official

Доставка через сокет домена

Сокет домена использует стандартный сокет домена Unix для доставки данных. Сокет домена - это внутрисистемный канал передачи данных. Он не создаёт задержек в сетевом буфере и может быть немного быстрее, чем передача через локальную петлю (loopback).

Сокет домена может использоваться только на платформах, которые его поддерживают: Unix, macOS и Linux. ОС Windows не поддерживается.

Когда используется сокет домена, IP и порт, указанные во входящем/исходящем прокси, будут проигнорированы. Весь трафик туннелируется через сокет домена.

DomainSocketObject

DomainSocketObject используется в поле dsSettings в TransportObject и StreamSettingsObject.

{
  "path": "/path/to/ds/file"
}

path: string

Реальный абсолютный путь к файлу. Перед запуском V2Ray указанный файл не должен существовать.

================================================ FILE: ru/configuration/transport/h2.html ================================================ HTTP/2 · Project V Official

Доставка через HTTP/2

Доставка через HTTP/2 добавлена в V2Ray 3.17. Оно основано на стандарте HTTP/2 и может быть проксировано через другие HTTP сервера, например Nginx.

В соответствии с рекомендациями HTTP/2, входящие и исходящие соединения должны использовать TLS.

HttpObject

DomainSocketObject используется в поле httpSettings в TransportObject и StreamSettingsObject.

{
  "host": ["v2ray.com"],
  "path": "/random/path"
}

host: [ string ]

Массив строк. Каждый элемент - домен. Клиент выбирает домен произвольно для каждого запроса. Сервер проверяет, находится ли запрашиваемый домен в списке.

path: string

Путь HTTP. Клиент и сервер должны иметь одинаковые значения.

================================================ FILE: ru/configuration/transport/mkcp.html ================================================ mKCP · Project V Official

Доставка через mKCP

mKCP is a reliable stream transport. It is an UDP based protocol. mKCP sends more traffic for lower latency. To transfer the same amount of data, mKCP usually requires more throughput than TCP does.

KcpObject

{
  "mtu": 1350,
  "tti": 20,
  "uplinkCapacity": 5,
  "downlinkCapacity": 20,
  "congestion": false,
  "readBufferSize": 1,
  "writeBufferSize": 1,
  "header": {
    "type": "none"
  }
}

mtu: number

Maximum transmission unit. It indicates the maxium number bytes that an UDP packet can carry. Recommended value is between 576 and 1460. Default value 1350.

tti: number

Transmission time interval, in milli-second. mKCP sends data in this interval. Recommended value is between 10 and 100. Default value 50.

uplinkCapacity: number

Uplink bandwidth, in MB/s. The maximum bandwidth for the V2Ray instance to upload data to a remote one. Default value is 5. Please note it is byte (in MB/s), not bit. One may use value 0 for a small bandwidth.

downlinkCapacity: number

Downlink bandwidth, in MB/s. The maximum bandwidth for the V2Ray instance to download data. Default value is 20. Please note it is byte (in MB/s), not bit. One may use value 0 for a small bandwidth.

uplinkCapacity and downlinkCapacity determine the speed of mKCP. On client side, uplinkCapacity specifies the speed for client sending data to server. On sever side, downlinkCapacity specifies the speed of server receiving data. The minimum of this pair is effective in an actual connection.

congestion: true | false

Whether or not to enable congestion control. Default value is false. When congestion control is enabled, V2Ray will detect network quality. It will send less packets when packet loss is severe, or more data when network is not fully filled.

readBufferSize: number

Read buffer size for a single connection, in MB. Default value is 2.

writeBufferSize: number

Write buffer size for a single connection, in MB. Default value is 2.

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

type: string

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "none": Default value. No obfuscation is used.
  • "srtp": Obfuscated as SRTP traffic. It may be recognized as video calls such as Facetime.
  • "utp": Obfuscated as uTP traffic. It may be recognized as Bittorrent traffic.
  • "wechat-video": Obfuscated to WeChat traffic.
  • "dtls": Obfuscated as DTLS 1.2 packets.
  • "wireguard": Obfuscated as WireGuard packets. (NOT true WireGuard protocol)

Благодарности

  • @skywind3000 invented the original KCP protocol and implemented in C.
  • @xtaci re-implement KCP protocol in Go.
  • @xiaokangwang integrated KCP into V2Ray.
================================================ FILE: ru/configuration/transport/quic.html ================================================ QUIC · Project V Official

QUIC

QUIC, or Quick UDP Internet Connection, is a multiplexing transport based on UDP, initially designed, implemented, and deployed by Google.

QUIC has the following advantages:

  1. Reduced number of roundtrips in handshake phase. (1-RTT or 0-RTT)
  2. Multiplexing without head of line blocking as in TCP
  3. Connection migration, especially for clients. For example, connections don't break when device moves from Wi-Fi to 4G.

QUIC is now an experiment in V2Ray. It implements IETF specification. As the spec is still being standardized, compatibility can't be guaranteed.

Update History

V2Ray 4.7:

  • Initial version to support QUIC.
  • Default settings:
    • 12 byte Connection ID
    • Connection timeout in 30 seconds if no data traffic. (May have impact on some long HTTP connections)

QuicObject

QUIC is used as quicSettings in transport settings. The configuration must be exactly the same between connecting peers.

QUIC requires TLS. If TLS is not enabled in transport settings, V2Ray will automatically issue a TLS certificate for it. When QUIC transport is used, encryption in VMess can be turned off.

{
  "security": "none",
  "key": "",
  "header": {
    "type": "none"
  }
}

security: "none" | "aes-128-gcm" | "chacha20-poly1305"

Extra encryption over entire QUIC packet, include the frame head part. Default value is "none" for no encryption. After being encrypted, QUIC packets can't be sniff'ed.

key: string

Key for the encryption above. Can be any string. Only effective when security is not "none".

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

type: string

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "none": Default value. No obfuscation is used.
  • "srtp": Obfuscated as SRTP traffic. It may be recognized as video calls such as Facetime.
  • "utp": Obfuscated as uTP traffic. It may be recognized as Bittorrent traffic.
  • "wechat-video": Obfuscated to WeChat traffic.
  • "dtls": Obfuscated as DTLS 1.2 packets.
  • "wireguard": Obfuscated as WireGuard packets. (NOT true WireGuard protocol)

When neither encryption nor obfuscation is enabled, QUIC transport is compatible with other QUIC tools. However it is recommended to enable either or both for better undetectable communication.

================================================ FILE: ru/configuration/transport/tcp.html ================================================ TCP · Project V Official

Доставка через TCP

TcpObject

{
  "header": {
    "type": "none"
  }
}

header: NoneHeaderObject | HttpHeaderobject

Header obfuscation. Default value is NoneHeaderObject.

NoneHeaderObject

No header obfuscation.

{
  "type": "none"
}

type: "none"

Disable header obfuscation.

HttpHeaderObject

HTTP header obfuscation. The configuration must be the same between connecting inbound and outbound.

{
  "type": "http",
  "request": {},
  "response": {}
}

type: "http"

Enable HTTP header obfuscation.

request: HTTPRequestObject

HTTP request template.

response: HTTPResponseObject

HTTP response template.

HTTPRequestObject

{
  "version": "1.1",
  "method": "GET",
  "path": ["/"],
  "headers": {
    "Host": ["www.baidu.com", "www.bing.com"],
    "User-Agent": [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
    ],
    "Accept-Encoding": ["gzip, deflate"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

method: string

HTTP method. Default value is "GET"

path: [ string ]

HTTP path. An array is string. The path will be chosen randomly for every connection.

headers: map{string, [ string ] }

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

HTTPResponseObject

{
  "version": "1.1",
  "status": "200",
  "reason": "OK",
  "headers": {
    "Content-Type": ["application/octet-stream", "video/mpeg"],
    "Transfer-Encoding": ["chunked"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

HTTP version. Default value is "1.1".

status: string

HTTP status. Default value is "200"

reason: string

HTTP status message. Default value is "OK".

headers: map{string, string}

HTTP header. The key of each entry is the key of HTTP header. The value of each entry is a list of strings. The actual HTTP header value will be chosen randomly from the list for each connection. Default value is the values in the example above.

In a connection, all keys in the specified map will be set to the HTTP header.

================================================ FILE: ru/configuration/transport/websocket.html ================================================ WebSocket · Project V Official

WebSocket

Использует стандартный WebSocket для передачи данных. Соединения Websocket могут быть проксифицированы HTTP-сервером, например Nginx.

WebSocketObject

WebSocketObject используется как wsSettings в TransportObject и StreamSettingsObject.

Websocket распознает HTTP-заголовок X-Forwarded-For и использует его в качестве адреса входящего источника.

{
  "path": "/",
  "headers": {
    "Host": "v2ray.com"
  }
}

path: string

Путь, используемый для WebSocket. По умолчанию корень домена "/".

headers: map{string, string}

Пользовательский HTTP-заголовок. Это массив, в котором каждая запись представляет собой пару ключевых значений в строке, для заголовка и значения в заголовке HTTP. По умолчанию пуст.

================================================ FILE: ru/configuration/transport.html ================================================ Доставка · Project V Official

Параметры транспорта

Transport is for how V2Ray sends and receives data from its peers. The responsibility of a transport is to reliably transfer data to a peer. Usually a connection has matching transports on both endpoints. For example, if a V2Ray outbound uses WebSocket as its transport, the inbound it talks to also has to use WebSocket, otherwise a connection can't be established.

The transport settings devides into two parts: global settings and per proxy settings. Per-proxy settings specifies how each individual proxy handles its data, while global settings is for all proxies. Usually the inbound and outbound proxies between the connecting peer must have the same transport settings. When a proxy has no transport settings, the global settings applies.

TransportObject

TransportObject is used as transport field in top level configuration.

{
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {}
}

tcpSettings: TcpObject

Settings for TCP transport.

kcpSettings: KcpObject

Settings for mKCP transport.

wsSettings: WebSocketObject

Settings for WebSocket transport.

httpSettings: HttpObject

Settings for HTTP/2 transport.

dsSettings: DomainSocketObject

Settings for Domain Socket transport.

quicSettings: QUICObject

(V2Ray 4.7+) Settings for QUIC transport.

StreamSettingsObject

Each inbound and outbound proxy may has its own transport settings, as specified in streamSettings field in top level configuration.

{
  "network": "tcp",
  "security": "none",
  "tlsSettings": {},
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {},
  "sockopt": {
    "mark": 0,
    "tcpFastOpen": false,
    "tproxy": "off"
  }
}

network: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"

Network type of the stream transport. Default value "tcp".

security: "none" | "tls"

Type of security. Choices are "none" (default) for no extra security, or "tls" for using TLS.

tlsSettings: TLSObject

TLS settings. TLS is provided by Golang. Support up to TLS 1.2. DTLS is not supported.

tcpSettings: TcpObject

TCP transport configuration for current proxy. Effective only when the proxy uses TCP transport. Configuration is the same as it is in global configuration.

kcpSettings: KcpObject

mKCP transport configuration for current proxy. Effective only when the proxy uses mKCP transport. Configuration is the same as it is in global configuration.

wsSettings: WebSocketObject

WebSocket transport configuration for current proxy. Effective only when the proxy uses WebSocket transport. Configuration is the same as it is in global configuration.

httpSettings: HttpObject

HTTP/2 transport configuration for current proxy. Effective only when the proxy uses HTTP/2 transport. Configuration is the same as it is in global configuration.

dsSettings: DomainSocketObject

Domain socket transport configuration for current proxy. Effective only when the proxy uses domain socket transport. Configuration is the same as it is in global configuration.

quicSettings: QUICObject

(V2Ray 4.7+) QUIC transport configuration for current proxy. Effective only when the proxy uses QUIC transport. Configuration is the same as it is in global configuration.

sockopt: SockoptObject

Socket options for incoming and out-going connections.

TLSObject

{
  "serverName": "v2ray.com",
  "allowInsecure": false,
  "alpn": ["http/1.1"],
  "certificates": [],
  "disableSystemRoot": false
}

serverName: string

Server name (usually domain) used for TLS authentication. Typically this is used when corressponding inbound/outbound uses IP for communication.

When domain name is specified from inbound proxy, or get sniffed from the connection, it will be automatically used for connection. It is not necessary to set serverName in such case.

alpn: [ string ]

An array of strings, to specifiy the ALPN value in TLS handshake. Default value is ["http/1.1"].

allowInsecure: true | false

If true, V2Ray allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.

allowInsecureCiphers: true | false

Whehter or not to allow insecure cipher suites. By default TLS only uses cipher suites from TLS 1.3 spec. Turn on this option to allow cipher suites with static RSA keys.

disableSystemRoot: true | false

(V2Ray 4.18+) Whether or not to disable system root CAs for TLS handshake. Default value is false. If set to true, V2Ray will use only certificates for TLS handshake.

certificates: [ CertificateObject ]

List of TLS certificates. Each entry is one certificate.

CertificateObject

{
  "usage": "encipherment",

  "certificateFile": "/path/to/certificate.crt",
  "keyFile": "/path/to/key.key",

  "certificate": [
    "-----BEGIN CERTIFICATE-----",
    "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
    "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
    "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
    "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
    "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
    "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
    "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
    "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
    "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
    "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
    "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
    "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
    "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
    "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
    "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
    "-----END CERTIFICATE-----"
  ],
  "key": [
    "-----BEGIN RSA PRIVATE KEY-----",
    "MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
    "bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
    "GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
    "jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
    "itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
    "IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
    "qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
    "C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
    "/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
    "aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
    "/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
    "bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
    "8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
    "pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
    "L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
    "3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
    "az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
    "gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
    "TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
    "eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
    "64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
    "8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
    "GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
    "ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
    "cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
    "-----END RSA PRIVATE KEY-----"
  ]
}

usage: "encipherment" | "verify" | "issue"

Purpose of the certificate. Default value "encipherment". Choices are:

  • "encipherment": Certificate is used for TLS authentication and encryption.
  • "verify": Certificate is used for validating TLS certificates from remote peer. In this case, the certificate has to be a CA certificate.
  • "issue": Certificate is used for issuing other certificates. In this case, the certificate has to be a CA certificate.

On Windows, you have to install your CA certificate to system, in order to verify cerificates issued from the CA.

When there is a new client request, say for serverName = "v2ray.com", V2Ray will find a certificate for "v2ray.com" first. If not found, V2Ray will try to issue a new certificate using any existing certificate whose usage is "issue" for "v2ray.com". The new certificate expires in one hour, and will be added to certificate pool for later reuse.

certificateFile: string

File path to the certificate. If the certificate is generated by OpenSSL, the path ends with ".crt".

Use v2ctl cert -ca command to generate a new CA certificate.

certificate: [ string ]

List of strings as content of the certificate. See the example above. Either certificate or certificateFile must not be empty.

keyFile: string

File path to the private key. If generated by OpenSSL, the file usually ends with ".key". Key file with password is not supported.

key: [ string ]

List of strings as content of the private key. See the example above. Either key or keyFile must not be empty.

When certificateFile and certificate are both filled in. V2Ray uses certificateFile. Same for keyFile and key.

When usage is "verify", both keyFile and key can be empty.

SockoptObject

{
  "mark": 0,
  "tcpFastOpen": false,
  "tproxy": "off"
}

mark: number

An integer. If non-zero, the value will be set to out-going connections via socket option SO_MARK. This mechanism only applies on Linux and requires CAP_NET_ADMIN permission.

tcpFastOpen: true | false

Whether or not to enable TCP Fast Open. When set to true, V2Ray enables TFO for current connection. When set to false, V2Ray disables TFO. If this entry doesn't exist, V2Ray uses default settings from operating system.

  • Only apply on the following operating systems:
    • Windows 10 (1604) or later
    • Mac OS 10.11 / iOS 9 or later
    • Linux 3.16 or later: Enabled by system default.
  • Applicable for both inbound and outbound connections.

tproxy: "redirect" | "tproxy" | "off"

Whether or not to enable transparent proxy on Linux. Choices are:

  • "off": Default value. Not enable TProxy at all.
  • "redirect": Enable TProxy with Redirect mode. Supports TCP/IPv4 and UDP traffic.
  • "tproxy": Enable TProxy with TProxy mode. Supports TCP and UDP traffic.

Transparent proxy requires Root or CAP_NET_ADMIN permission.

If TProxy is not set, and allowRedirect is set in dokodemo-door, the value of TProxy will be set to "redirect" automatically.

================================================ FILE: ru/developer/tools.html ================================================ Инструменты · Project V Official

Инструменты

Сторонние SDK

Автоматизация

V2Ray использует следующие инструменты автоматизации для сборки и выпуска.

  • Bazel: Сборка и опакечивание.
  • Azure DevOps: Автоматизированные релизы.
  • Google Cloud: Автоматизированные релизы.
  • CloudFlare: Официальный сайт и домен.
================================================ FILE: ru/gitbook/gitbook-plugin-anchors/plugin.css ================================================ a.plugin-anchor { color: inherit !important; display: none; margin-left: -30px; padding-left: 40px; cursor: pointer; position: absolute; top: 0; left: 0; bottom: 0; } a.plugin-anchor i { margin-left: -30px; font-size: 15px !important; } h1, h2, h3, h4, h5, h6 { position: relative; } h1:hover a.plugin-anchor, h2:hover a.plugin-anchor, h3:hover a.plugin-anchor, h4:hover a.plugin-anchor, h5:hover a.plugin-anchor, h6:hover a.plugin-anchor { display: inline-block; } .book .book-body .page-wrapper .page-inner section.normal { overflow: visible; } ================================================ FILE: ru/gitbook/gitbook-plugin-ga/plugin.js ================================================ require(["gitbook"], function(gitbook) { // Load analytics.js gitbook.events.bind("start", function(e, config) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); var cfg = config.ga; ga('create', cfg.token, cfg.configuration); }); // Notify pageview gitbook.events.bind("page.change", function() { ga('send', 'pageview', window.location.pathname+window.location.search); }); }); ================================================ FILE: ru/gitbook/gitbook-plugin-hints/plugin-hints.css ================================================ .hints-icon { display: table-cell; padding-right: 15px; padding-left: 5px; } .hints-container { display: table-cell; } ================================================ FILE: ru/gitbook/gitbook-plugin-mermaid-gb3/book/plugin.js ================================================ require([ 'gitbook' ], function (gitbook) { gitbook.events.bind('page.change', function () { mermaid.init(); }); }); ================================================ FILE: ru/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #ECECFF; stroke: #CCCCFF; stroke-width: 1px; } .arrowheadPath { fill: #333333; } .edgePath .path { stroke: #333333; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #ffffde !important; rx: 4 !important; stroke: #aaaa33 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #CCCCFF; fill: #ECECFF; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #CCCCFF; fill: #ECECFF; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #CCCCFF; } .note { stroke: #aaaa33; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: rgba(102, 102, 255, 0.49); } .section2 { fill: #fff400; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #8a90dd; stroke: #534fbc; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #bfc7ff; stroke: #534fbc; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #bfc7ff; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #9370DB; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #ECECFF; stroke: #9370DB; } g.classGroup line { stroke: #9370DB; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #ECECFF; opacity: 0.5; } svg .classLabel .label { fill: #9370DB; font-size: 10px; } .relation { stroke: #9370DB; stroke-width: 1; fill: none; } .composition { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .aggregation { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationStart { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationEnd { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #dependencyStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #dependencyEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #ffffde; border: 1px solid #aaaa33; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: ru/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.forest.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { font-family: 'trebuchet ms', verdana, arial; color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #cde498; stroke: #13540c; stroke-width: 1px; } .arrowheadPath { fill: green; } .edgePath .path { stroke: green; stroke-width: 1.5px; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #cdffb2 !important; rx: 4 !important; stroke: #6eaa49 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #13540c; fill: #cde498; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #326932; fill: #cde498; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #326932; } .note { stroke: #6eaa49; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: #6eaa49; } .section2 { fill: #6eaa49; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #487e3a; stroke: #13540c; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #cde498; stroke: #13540c; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #cde498; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #13540c; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #cde498; stroke: #13540c; } g.classGroup line { stroke: #13540c; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #cde498; opacity: 0.5; } svg .classLabel .label { fill: #13540c; font-size: 10px; } .relation { stroke: #13540c; stroke-width: 1; fill: none; } .composition { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .aggregation { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationStart { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationEnd { fill: #cde498; stroke: #13540c; stroke-width: 1; } #dependencyStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #dependencyEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #cdffb2; border: 1px solid #6eaa49; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-a11y-dark.css ================================================ /** * a11y-dark theme for JavaScript, CSS, and HTML * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css * @author ericwbailey */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: 0.5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #d4d0ab; } .token.punctuation { color: #fefefe; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ffa07a; } .token.boolean, .token.number { color: #00e0e0; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #abe338; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #00e0e0; } .token.atrule, .token.attr-value, .token.function { color: #ffd700; } .token.keyword { color: #00e0e0; } .token.regex, .token.important { color: #ffd700; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } @media screen and (-ms-high-contrast: active) { code[class*="language-"], pre[class*="language-"] { color: windowText; background: window; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: window; } .token.important { background: highlight; color: window; font-weight: normal; } .token.atrule, .token.attr-value, .token.function, .token.keyword, .token.operator, .token.selector { font-weight: bold; } .token.attr-value, .token.comment, .token.doctype, .token.function, .token.keyword, .token.operator, .token.property, .token.string { color: highlight; } .token.attr-value, .token.url { font-weight: normal; } } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-atom-dark.css ================================================ /** * atom-dark theme for `prism.js` * Based on Atom's `atom-dark` theme: https://github.com/atom/atom-dark-syntax * @author Joe Gibson (@gibsjose) */ code[class*="language-"], pre[class*="language-"] { color: #c5c8c6; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #1d1f21; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #7C7C7C; } .token.punctuation { color: #c5c8c6; } .namespace { opacity: .7; } .token.property, .token.keyword, .token.tag { color: #96CBFE; } .token.class-name { color: #FFFFB6; text-decoration: underline; } .token.boolean, .token.constant { color: #99CC99; } .token.symbol, .token.deleted { color: #f92672; } .token.number { color: #FF73FD; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #A8FF60; } .token.variable { color: #C6C5FE; } .token.operator { color: #EDEDED; } .token.entity { color: #FFFFB6; /* text-decoration: underline; */ } .token.url { color: #96CBFE; } .language-css .token.string, .style .token.string { color: #87C38A; } .token.atrule, .token.attr-value { color: #F9EE98; } .token.function { color: #DAD085; } .token.regex { color: #E9C062; } .token.important { color: #fd971f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-base16-ateliersulphurpool.light.css ================================================ /* Name: Base16 Atelier Sulphurpool Light Author: Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) Prism template by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/prism/) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #f5f7ff; color: #5e6687; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #dfe2f1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #dfe2f1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #898ea4; } .token.punctuation { color: #5e6687; } .token.namespace { opacity: .7; } .token.operator, .token.boolean, .token.number { color: #c76b29; } .token.property { color: #c08b30; } .token.tag { color: #3d8fd1; } .token.string { color: #22a2c9; } .token.selector { color: #6679cc; } .token.attr-name { color: #c76b29; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #22a2c9; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #ac9739; } .token.statement, .token.regex, .token.atrule { color: #22a2c9; } .token.placeholder, .token.variable { color: #3d8fd1; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #202746; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c94922; } .token.entity { cursor: help; } pre > code.highlight { outline: 0.4em solid #c94922; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #dfe2f1; } .line-numbers-rows > span:before { color: #979db4; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(107, 115, 148, 0.2); background: -webkit-linear-gradient(left, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); background: linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-cb.css ================================================ /* * Based on Plugin: Syntax Highlighter CB * Plugin URI: http://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js * Description: Highlight your code snippets with an easy to use shortcode based on Lea Verou's Prism.js. * Version: 1.0.0 * Author: c.bavota * Author URI: http://bavotasan.comhttp://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js/ */ /* http://cbavota.bitbucket.org/syntax-highlighter/ */ /* ===== ===== */ code[class*="language-"], pre[class*="language-"] { color: #fff; text-shadow: 0 1px 1px #000; font-family: Menlo, Monaco, "Courier New", monospace; direction: ltr; text-align: left; word-spacing: normal; white-space: pre; word-wrap: normal; line-height: 1.4; background: none; border: 0; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"] code { float: left; padding: 0 15px 0 0; } pre[class*="language-"], :not(pre) > code[class*="language-"] { background: #222; } /* Code blocks */ pre[class*="language-"] { padding: 15px; margin: 1em 0; overflow: auto; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 5px 10px; line-height: 1; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797979; } .token.selector, .token.operator, .token.punctuation { color: #fff; } .token.namespace { opacity: .7; } .token.tag, .token.boolean { color: #ffd893; } .token.atrule, .token.attr-value, .token.hex, .token.string { color: #B0C975; } .token.property, .token.entity, .token.url, .token.attr-name, .token.keyword { color: #c27628; } .token.regex { color: #9B71C6; } .token.entity { cursor: help; } .token.function, .token.constant { color: #e5a638; } .token.variable { color: #fdfba8; } .token.number { color: #8799B0; } .token.important, .token.deliminator { color: #E45734; } /* Line highlight plugin */ pre[data-line] { position: relative; padding: 1em 0 1em 3em; } .line-highlight { position: absolute; left: 0; right: 0; margin-top: 1em; /* Same as .prism's padding-top */ background: rgba(255,255,255,.2); pointer-events: none; line-height: inherit; white-space: pre; } .line-highlight:before, .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .3em; left: .6em; min-width: 1em; padding: 0 .5em; background-color: rgba(255,255,255,.3); color: #fff; font: bold 65%/1.5 sans-serif; text-align: center; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; text-shadow: none; } .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } /* for line numbers */ .line-numbers-rows { margin: 0; } .line-numbers-rows span { padding-right: 10px; border-right: 3px #d9d336 solid; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-darcula.css ================================================ /** * Darcula theme * * Adapted from a theme based on: * IntelliJ Darcula Theme (https://github.com/bulenkov/Darcula) * * @author Alexandre Paradis * @version 1.0 */ code[class*="language-"], pre[class*="language-"] { color: #a9b7c6; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { color: inherit; background: rgba(33,66,131,.85); } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { color: inherit; background: rgba(33,66,131,.85); } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.cdata { color: #808080; } .token.delimiter, .token.boolean, .token.keyword, .token.selector, .token.important, .token.atrule { color: #cc7832; } .token.operator, .token.punctuation, .token.attr-name { color: #a9b7c6; } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: #e8bf6a; } .token.entity, .token.number, .token.symbol { color: #6897bb; } .token.property, .token.constant, .token.variable { color: #9876aa; } .token.string, .token.char { color: #6a8759; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: #ffc66d; } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #294436; } .token.deleted { background: #484a4a; } /*code.language-css .token.punctuation { color: #cc7832; }*/ code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-dracula.css ================================================ /** * Dracula Theme originally by Zeno Rocha [@zenorocha] * https://draculatheme.com/ * * Ported for PrismJS by Albert Vallverdu [@byverdu] */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #282a36; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6272a4; } .token.punctuation { color: #f8f8f2; } .namespace { opacity: .7; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ff79c6; } .token.boolean, .token.number { color: #bd93f9; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #50fa7b; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #f8f8f2; } .token.atrule, .token.attr-value, .token.function, .token.class-name { color: #f1fa8c; } .token.keyword { color: #8be9fd; } .token.regex, .token.important { color: #ffb86c; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-duotone-dark.css ================================================ /* Name: Duotone Dark Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-evening-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2734; color: #9a86fd; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6a51e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6a51e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6c6783; } .token.punctuation { color: #6c6783; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #e09142; } .token.property, .token.function { color: #9a86fd; } .token.tag-id, .token.selector, .token.atrule-id { color: #eeebff; } code.language-javascript, .token.attr-name { color: #c4b9fe; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #ffcc99; } .token.placeholder, .token.variable { color: #ffcc99; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #eeebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c4b9fe; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #8a75f5; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c2937; } .line-numbers-rows > span:before { color: #3c3949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(224, 145, 66, 0.2); background: -webkit-linear-gradient(left, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); background: linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-duotone-earth.css ================================================ /* Name: Duotone Earth Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-earth-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #322d29; color: #88786d; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6f5849; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6f5849; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6a5f58; } .token.punctuation { color: #6a5f58; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #bfa05a; } .token.property, .token.function { color: #88786d; } .token.tag-id, .token.selector, .token.atrule-id { color: #fff3eb; } code.language-javascript, .token.attr-name { color: #a48774; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fcc440; } .token.placeholder, .token.variable { color: #fcc440; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #fff3eb; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #a48774; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #816d5f; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #35302b; } .line-numbers-rows > span:before { color: #46403d; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(191, 160, 90, 0.2); background: -webkit-linear-gradient(left, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); background: linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-duotone-forest.css ================================================ /* Name: Duotone Forest Author: by Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-forest-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2d2a; color: #687d68; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #435643; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #435643; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #535f53; } .token.punctuation { color: #535f53; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #a2b34d; } .token.property, .token.function { color: #687d68; } .token.tag-id, .token.selector, .token.atrule-id { color: #f0fff0; } code.language-javascript, .token.attr-name { color: #b3d6b3; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #e5fb79; } .token.placeholder, .token.variable { color: #e5fb79; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #f0fff0; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #b3d6b3; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #5c705c; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c302c; } .line-numbers-rows > span:before { color: #3b423b; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(162, 179, 77, 0.2); background: -webkit-linear-gradient(left, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); background: linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-duotone-light.css ================================================ /* Name: Duotone Light Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-morning-light.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #faf8f5; color: #728fcb; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #faf8f5; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #faf8f5; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #b6ad9a; } .token.punctuation { color: #b6ad9a; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #063289; } .token.property, .token.function { color: #b29762; } .token.tag-id, .token.selector, .token.atrule-id { color: #2d2006; } code.language-javascript, .token.attr-name { color: #896724; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #728fcb; } .token.placeholder, .token.variable { color: #93abdc; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #2d2006; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #896724; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #896724; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #ece8de; } .line-numbers-rows > span:before { color: #cdc4b1; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(45, 32, 6, 0.2); background: -webkit-linear-gradient(left, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); background: linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-duotone-sea.css ================================================ /* Name: Duotone Sea Author: by Simurai, adapted from DuoTone themes by Simurai for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-sea-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #1d262f; color: #57718e; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #004a9e; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #004a9e; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #4a5f78; } .token.punctuation { color: #4a5f78; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #0aa370; } .token.property, .token.function { color: #57718e; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebf4ff; } code.language-javascript, .token.attr-name { color: #7eb6f6; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #47ebb4; } .token.placeholder, .token.variable { color: #47ebb4; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebf4ff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #7eb6f6; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #34659d; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #1f2932; } .line-numbers-rows > span:before { color: #2c3847; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(10, 163, 112, 0.2); background: -webkit-linear-gradient(left, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); background: linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-duotone-space.css ================================================ /* Name: Duotone Space Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-space-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #24242e; color: #767693; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #5151e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #5151e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #5b5b76; } .token.punctuation { color: #5b5b76; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #dd672c; } .token.property, .token.function { color: #767693; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebebff; } code.language-javascript, .token.attr-name { color: #aaaaca; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fe8c52; } .token.placeholder, .token.variable { color: #fe8c52; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #aaaaca; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #7676f4; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #262631; } .line-numbers-rows > span:before { color: #393949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(221, 103, 44, 0.2); background: -webkit-linear-gradient(left, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); background: linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-ghcolors.css ================================================ /** * GHColors theme by Avi Aryan (http://aviaryan.in) * Inspired by Github syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #b3d4fc; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #999988; font-style: italic; } .token.namespace { opacity: .7; } .token.string, .token.attr-value { color: #e3116c; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.entity, .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.property, .token.regex, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-name, .language-autohotkey .token.selector { color: #00a4db; } .token.function, .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.tag, .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.function, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-hopscotch.css ================================================ @import url(https://fonts.googleapis.com/css?family=Fira+Mono); /* * Hopscotch * by Jan T. Sott * https://github.com/idleberg/Hopscotch * * This work is licensed under the Creative Commons CC0 1.0 Universal License */ code[class*="language-"], pre[class*="language-"] { color: #ffffff; font-family: "Fira Mono", Menlo, Monaco, "Lucida Console","Courier New", Courier, monospace; font-size: 16px; line-height: 1.375; direction: ltr; text-align: left; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; background: #322931; color: #b9b5b8; } pre > code[class*="language-"] { font-size: 1em; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797379; } .token.punctuation { color: #b9b5b8; } .namespace { opacity: .7; } .token.null, .token.operator, .token.boolean, .token.number { color: #fd8b19; } .token.property { color: #fdcc59; } .token.tag { color: #1290bf; } .token.string { color: #149b93; } .token.selector { color: #c85e7c; } .token.attr-name { color: #fd8b19; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #149b93; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #8fc13e; } .token.statement, .token.regex, .token.atrule { color: #149b93; } .token.placeholder, .token.variable { color: #1290bf; } .token.important { color: #dd464c; font-weight: bold; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid red; outline-offset: .4em; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-material-dark.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #eee; background: #2f2f2f; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #a5e844; } .token.attribute { color: #a5e844; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.comment { color: #616161; } .token.constant { color: #c792ea; } .token.deleted { color: #ff6666; } .token.doctype { color: #616161; } .token.entity { color: #ff6666; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #616161; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #a5e844; } .token.pseudo-element { color: #a5e844; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #ff6666; } .token.string { color: #a5e844; } .token.symbol { color: #c792ea; } .token.tag { color: #ff6666; } .token.unit { color: #fd9170; } .token.url { color: #ff6666; } .token.variable { color: #ff6666; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-material-light.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #90a4ae; background: #fafafa; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #cceae7; color: #263238; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #cceae7; color: #263238; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #f76d47; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #7c4dff; } .token.attr-name { color: #39adb5; } .token.attr-value { color: #f6a434; } .token.attribute { color: #f6a434; } .token.boolean { color: #7c4dff; } .token.builtin { color: #39adb5; } .token.cdata { color: #39adb5; } .token.char { color: #39adb5; } .token.class { color: #39adb5; } .token.class-name { color: #6182b8; } .token.comment { color: #aabfc9; } .token.constant { color: #7c4dff; } .token.deleted { color: #e53935; } .token.doctype { color: #aabfc9; } .token.entity { color: #e53935; } .token.function { color: #7c4dff; } .token.hexcode { color: #f76d47; } .token.id { color: #7c4dff; font-weight: bold; } .token.important { color: #7c4dff; font-weight: bold; } .token.inserted { color: #39adb5; } .token.keyword { color: #7c4dff; } .token.number { color: #f76d47; } .token.operator { color: #39adb5; } .token.prolog { color: #aabfc9; } .token.property { color: #39adb5; } .token.pseudo-class { color: #f6a434; } .token.pseudo-element { color: #f6a434; } .token.punctuation { color: #39adb5; } .token.regex { color: #6182b8; } .token.selector { color: #e53935; } .token.string { color: #f6a434; } .token.symbol { color: #7c4dff; } .token.tag { color: #e53935; } .token.unit { color: #f76d47; } .token.url { color: #e53935; } .token.variable { color: #e53935; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-material-oceanic.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #c3cee3; background: #263238; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #c3e88d; } .token.attribute { color: #c3e88d; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.color { color: #f2ff00; } .token.comment { color: #546e7a; } .token.constant { color: #c792ea; } .token.deleted { color: #f07178; } .token.doctype { color: #546e7a; } .token.entity { color: #f07178; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; font-style: italic; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #546e7a; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #c3e88d; } .token.pseudo-element { color: #c3e88d; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #f07178; } .token.string { color: #c3e88d; } .token.symbol { color: #c792ea; } .token.tag { color: #f07178; } .token.unit { color: #f07178; } .token.url { color: #fd9170; } .token.variable { color: #f07178; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-pojoaque.css ================================================ /* * Pojoaque Style by Jason Tate * http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html * Based on Solarized Style from http://ethanschoonover.com/solarized * http://softwaremaniacs.org/media/soft/highlight/test.html */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 15px; line-height: 1.5; color: #dccf8f; text-shadow: 0; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre) > code[class*="language-"] { border-radius: 5px; border: 1px solid #000; color: #DCCF8F; background: #181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top; } pre[class*="language-"] { padding: 12px; overflow: auto; } :not(pre) > code[class*="language-"] { padding: 2px 6px; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #586e75; font-style: italic; } .token.number, .token.string, .token.char, .token.builtin, .token.inserted { color: #468966; } .token.attr-name { color: #b89859; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #dccf8f; } .token.selector, .token.regex { color: #859900; } .token.atrule, .token.keyword { color: #cb4b16; } .token.attr-value { color: #468966; } .token.function, .token.variable, .token.placeholder { color: #b58900; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol { color: #b89859; } .token.tag { color: #ffb03b; } .token.important, .token.statement, .token.deleted { color: #dc322f; } .token.punctuation { color: #dccf8f; } .token.entity { cursor: help; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } /* .pojoaque-colors { color: #586e75; color: #b64926; color: #468966; color: #ffb03b; color: #b58900; color: #b89859; color: #dccf8f; color: #d3a60c; color: #cb4b16; color: #dc322f; color: #073642; color: #181914; } */ ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-shades-of-purple.css ================================================ /** * Shades of Purple Theme for Prism.js * * @author Ahmad Awais * @support Follow/tweet at https://twitter.com/MrAhmadAwais/ */ code[class*='language-'], pre[class*='language-'] { color: #9efeff; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; font-family: 'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-weight: 400; font-size: 17px; line-height: 25px; letter-spacing: 0.5px; text-shadow: 0 1px #222245; } pre[class*='language-']::-moz-selection, pre[class*='language-'] ::-moz-selection, code[class*='language-']::-moz-selection, code[class*='language-'] ::-moz-selection, pre[class*='language-']::selection, pre[class*='language-'] ::selection, code[class*='language-']::selection, code[class*='language-'] ::selection { color: inherit; background: #a599e9; } /* Code blocks. */ pre[class*='language-'] { padding: 2em; margin: 0.5em 0; overflow: auto; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #1e1e3f; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; } .token { font-weight: 400; } .token.comment, .token.prolog, .token.cdata { color: #b362ff; } .token.delimiter, .token.keyword, .token.selector, .token.important, .token.atrule { color: #ff9d00; } .token.operator, .token.attr-name { color: rgb(255, 180, 84); } .token.punctuation { color: #ffffff; } .token.boolean { color: rgb(255, 98, 140); } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: rgb(255, 157, 0); } .token.entity, .token.symbol { color: #6897bb; } .token.number { color: #ff628c; } .token.property, .token.constant, .token.variable { color: #ff628c; } .token.string, .token.char { color: #a5ff90; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: rgb(250, 208, 0); } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #00ff00; } .token.deleted { background: #ff000d; } code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } .token.class-name { color: #fb94ff; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { background: none; } pre .line-highlight, pre .line-highlight.line-highlight, pre > code.line-highlight { margin-top: 36px; background: linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent); } pre .line-highlight:before, pre > code.line-highlight:before, pre .line-highlight[data-end]:after, pre > code.line-highlight[data-end]:after { content: ''; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-synthwave84.css ================================================ /* * Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code * Demo: https://marc.dev/demo/prism-synthwave84 * * Ported for PrismJS by Marc Backes [@themarcba] */ code[class*="language-"], pre[class*="language-"] { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background-color: transparent !important; background-image: linear-gradient(to bottom, #2a2139 75%, #34294f); } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.block-comment, .token.prolog, .token.doctype, .token.cdata { color: #8e8e8e; } .token.punctuation { color: #ccc; } .token.tag, .token.attr-name, .token.namespace, .token.number, .token.unit, .token.hexcode, .token.deleted { color: #e2777a; } .token.property, .token.selector { color: #72f1b8; text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475; } .token.function-name { color: #6196cc; } .token.boolean, .token.selector .token.id, .token.function { color: #fdfdfd; text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975; } .token.class-name { color: #fff5f6; text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75; } .token.constant, .token.symbol { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; } .token.important, .token.atrule, .token.keyword, .token.selector .token.class, .token.builtin { color: #f4eee4; text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575; } .token.string, .token.char, .token.attr-value, .token.regex, .token.variable { color: #f87c32; } .token.operator, .token.entity, .token.url { color: #67cdcc; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } .token.inserted { color: green; } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-vs.css ================================================ /** * VS theme by Andrew Lock (https://andrewlock.net) * Inspired by Visual Studio syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #C1DEF1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #C1DEF1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #008000; font-style: italic; } .token.namespace { opacity: .7; } .token.string { color: #A31515; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, .language-json .token.number, code[class*="language-css"]{ color: #0000ff; } .token.function { color: #393A34; } .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.class-name, .language-json .token.property { color: #2B91AF; } .token.tag, .token.selector { color: #800000; } .token.attr-name, .token.property, .token.regex, .token.entity { color: #ff0000; } .token.directive.tag .tag { background: #ffff00; color: #393A34; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #a5a5a5; } .line-numbers-rows > span:before { color: #2B91AF; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(193, 222, 241, 0.2); background: -webkit-linear-gradient(left, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); background: linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); } ================================================ FILE: ru/gitbook/gitbook-plugin-prism/prism-xonokai.css ================================================ /** * xonokai theme for JavaScript, CSS and HTML * based on: https://github.com/MoOx/sass-prism-theme-base by Maxime Thirouin ~ MoOx --> http://moox.fr/ , which is Loosely based on Monokai textmate theme by http://www.monokai.nl/ * license: MIT; http://moox.mit-license.org/ */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 2; -o-tab-size: 2; tab-size: 2; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-wrap: normal; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 14px; color: #76d9e6; text-shadow: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre)>code[class*="language-"] { background: #2a2a2a; } pre[class*="language-"] { padding: 15px; border-radius: 4px; border: 1px solid #e1e1e8; overflow: auto; } pre[class*="language-"] { position: relative; } pre[class*="language-"] code { white-space: pre; display: block; } :not(pre)>code[class*="language-"] { padding: 0.15em 0.2em 0.05em; border-radius: .3em; border: 0.13em solid #7a6652; box-shadow: 1px 1px 0.3em -0.1em #000 inset; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6f705e; } .token.operator, .token.boolean, .token.number { color: #a77afe; } .token.attr-name, .token.string { color: #e6d06c; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #e6d06c; } .token.selector, .token.inserted { color: #a6e22d; } .token.atrule, .token.attr-value, .token.keyword, .token.important, .token.deleted { color: #ef3b7d; } .token.regex, .token.statement { color: #76d9e6; } .token.placeholder, .token.variable { color: #fff; } .token.important, .token.statement, .token.bold { font-weight: bold; } .token.punctuation { color: #bebec5; } .token.entity { cursor: help; } .token.italic { font-style: italic; } code.language-markup { color: #f9f9f9; } code.language-markup .token.tag { color: #ef3b7d; } code.language-markup .token.attr-name { color: #a6e22d; } code.language-markup .token.attr-value { color: #e6d06c; } code.language-markup .token.style, code.language-markup .token.script { color: #76d9e6; } code.language-markup .token.script .token.keyword { color: #76d9e6; } /* Line highlight plugin */ pre[class*="language-"][data-line] { position: relative; padding: 1em 0 1em 3em; } pre[data-line] .line-highlight { position: absolute; left: 0; right: 0; padding: 0; margin-top: 1em; background: rgba(255, 255, 255, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } pre[data-line] .line-highlight:before, pre[data-line] .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .4em; left: .6em; min-width: 1em; padding: 0.2em 0.5em; background-color: rgba(255, 255, 255, 0.4); color: black; font: bold 65%/1 sans-serif; height: 1em; line-height: 1em; text-align: center; border-radius: 999px; text-shadow: none; box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); } pre[data-line] .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } ================================================ FILE: ru/gitbook/gitbook.js ================================================ !function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=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)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,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(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(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(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!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,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.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:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.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 A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(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&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(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&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.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):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.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=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.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)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.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,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,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":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.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 de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de("

Проект V

Проект V - это набор инструментов, которые помогут вам создать собственную сеть конфиденциальности через Интернет. Ядро проекта V с именем V2Rayотвечает за сетевые протоколы и коммуникации. Он может работать самостоятельно, а также сочетаться с другими инструментами.

Этот веб-сайт является главным образом пособием для V2Ray с дополнительной информацией по всему проекту.

Характеристики

  • Несколько входящих / исходящих прокси: один экземпляр V2Ray поддерживает параллельные множественные входящие и исходящие протоколы. Каждый протокол работает независимо.
  • Настраиваемая маршрутизация: входящий трафик может быть отправлен на различные исходящие из-за конфигурации маршрутизации. Легко маршрутизировать трафик по целевому региону или домену.
  • Несколько протоколов: V2Ray поддерживает несколько протоколов, включая Socks, HTTP, Shadowsocks, VMess и т. Д. Каждый протокол может иметь собственный транспорт, такой как TCP, mKCP, WebSocket и т. Д.
  • Obfuscation: V2Ray встроена в обфускацию, чтобы скрыть трафик в TLS и может работать параллельно с веб-серверами.
  • Обратный прокси: общая поддержка обратного прокси. Может использоваться для создания туннелей на localhost.
  • Несколько платформ: V2Ray запускается изначально на Windows, Mac OS, Linux и т. Д. Существует также сторонняя поддержка на мобильных устройствах.

Спонсоры

v2net

Этот сайт генерируется GitBook и хостится через GitHub. Если вы хотите изменить его содержимое, отправьте pull-запрос в этот репозиторий.

================================================ FILE: ru/styles/website.css ================================================ .book-summary { font-family: "Helvetica Neue", "Open Sans", sans-serif; font-size: 14px; } .book-header .btn { padding: 0 5px; } .markdown-section { font-family: "Helvetica Neue", "Open Sans", sans-serif; font-weight: 400; font-size: 14px; } .markdown-section pre>code { font-family: "Source Code Pro", monospace; font-weight: 400; font-size: 14px; } .markdown-section code:not([class]) { white-space: nowrap; padding: 0; } .markdown-section blockquote { margin: 0; margin-bottom: .85em; padding: 0 15px; border-left: 4px solid #64b5f6; border-top: 1px solid #64b5f6; color: #000000; margin-top: 10px; } ================================================ FILE: ru/ui_client/README.md ================================================ --- refcn: ui_client/index refen: ui_client/index --- # Клиенты Project V Кроме ядра V2ray, Project V включает в себя различные графические клиенты на многих платформах. Обратите внимание на список ниже, в подкатегориях много полезного. * [Windows](windows.md) * [Mac OS X](osx.md) * [iOS](ios.md) * [Android](android.md) * [Онлайн сервисы](ui_client/service.md) ================================================ FILE: ru/ui_client/android.md ================================================ --- refcn: ui_client/android refen: ui_client/android --- # Клиенты Android ## BifrostV BifrostV - приложение для Android, основанное на ядре V2Ray. Поддерживает протоколы VMess, Shadowsocks, socks. * Загрузить: [Play Store](https://play.google.com/store/apps/details?id=com.github.dawndiy.bifrostv) * Загрузить: [APK Pure](https://apkpure.com/bifrostv/com.github.dawndiy.bifrostv) ## V2RayNG V2RayNG - приложение для Android, основанное на V2Ray. Оно обеспечивает тот же набор функций, что и ядро ​​V2Ray. * Загрузить: [Play Store](https://play.google.com/store/apps/details?id=com.v2ray.ang) * Исходный код: [GitHub](https://github.com/2dust/v2rayNG) ## V2Ray Go * Загрузить: [Play Store](https://play.google.com/store/apps/details?id=org.kkdev.v2raygo) * Исходный код: [GitHub](https://github.com/xiaokangwang/V2RayGO) ## Actinium * Загрузить: Play Store (недоступно) * Исходный код: [GitHub](https://github.com/V2Ray-Android/Actinium) ## Другие инструменты {#other} ### JuiceSSH Клиент SSH. * Загрузить: [Play Store](https://play.google.com/store/apps/details?id=com.sonelli.juicessh) * Веб-сайт: [JuiceSSH.com](https://juicessh.com/) ### Termius Клиент SSH * Загрузить: [Play Store](https://play.google.com/store/apps/details?id=com.server.auditor.ssh.client) ### Telegram Зашифрованное общение. * Веб-сайт: [telegram.org](https://telegram.org/) * Загрузить: [Play Store](https://play.google.com/store/apps/details?id=org.telegram.messenger) ================================================ FILE: ru/ui_client/ios.md ================================================ --- refcn: ui_client/ios refen: ui_client/ios --- # Клиенты iOS ## Kitsunebi Kitsunebi - приложение для iOS, основанное на V2Ray. Обеспечивает полную функциональность V2Ray. Присутствует импорт и экспорт настроек в JSON, совместимом с V2Ray. * Загрузить: [iTunes](https://itunes.apple.com/us/app/kitsunebi-proxy-utility/id1446584073?mt=8) ## Kitsunebi Lite Облегченная версия Kitsunebi. * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/kitsunebi-lite/id1387913765/) ## Shadowrocket Shadowrocket - универсальный VPN. Поддерживает разнообразные протоколы: Shadowsocks, VMess, SSR и другие. * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/shadowrocket/id932747118/) ## Pepi (ранее ShadowRay) {#pepi} Pepi - приложение, совместимое с V2Ray. Может создавать VPN-соединения на основе протокола VMess и обмениваться данными с любыми серверами V2Ray. * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/pepi/id1283082051/) ## Quantumult * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/quantumult/id1252015438/) ## Другие инструменты {#other} ### HyperApp Утилита для создания серверов при помощи Docker. * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/hyperapp/id1179750280/) * Веб-сайт: [HyperApp.fun](https://www.hyperapp.fun/) ### Termius Клиент SSH. * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/termius/id549039908/) ### Telegram Зашифрованное общение. * Веб-сайт: [telegram.org](https://telegram.org/) * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/telegram-messenger/id686449807/) ### ProtonMail Зашифрованная почта. * Веб-сайт: [protonmail.com](https://protonmail.com/) * Загрузить: [iTunes](https://www.v2ray.com/itunes/us/protonmail-encrypted-email/id979659905/) ================================================ FILE: ru/ui_client/osx.md ================================================ --- refcn: ui_client/osx refen: ui_client/osx --- # Mac OS X ## V2RayX * Загрузить: [GitHub](https://github.com/Cenmrev/V2RayX) ## V2RayU * Загрузить: [GitHub](https://github.com/yanue/V2rayU) ## Другие инструменты {#other} ### Visual Studio Code Редактор исходного кода от Microsoft. * Веб-сайт: [code.visualstudio.com](https://code.visualstudio.com/) ### Telegram Зашифрованное общение. * Веб-сайт: [telegram.org](https://telegram.org/) * Загрузить: [Mac App Store](https://www.v2ray.com/itunesm/us/telegram-desktop/id946399090/) ### Клиент подключения к удаленному рабочему столу от Microsoft * Загрузить: [Mac App Store](https://www.v2ray.com/itunesm/us/microsoft-remote-desktop/id715768417/) ================================================ FILE: ru/ui_client/service.md ================================================ --- refcn: ui_client/service refen: ui_client/service --- # Онлайн сервисы The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V. ## Связанные с V2Ray * [Генератор конфигурации](https://htfy96.github.io/v2ray-config-gen/) * [Генератор UUID](https://www.uuidgenerator.net/) ## VPN * [BabyDriver](http://babydriver.me/): Поддерживает V2Ray. Скидочный код: bcb518 * [喵帕斯](https://xn--i2ru8q2qg.com/): Поддерживает V2Ray (на стадии внедрения) * [Lanan](https://xn--sjt174g.com/): Сервис VPN, основанный на V2Ray. Скидочный код: v2ray * [多数派](https://dspi.io/aff.php?aff=7): Новый сервис VPN, основанный на V2Ray. * [V2rayPro](https://myv2.us/): VPN service based on V2Ray. Coupon code: v2ray.com * [V2Net](http://v2net.org/): Customized V2Ray service. Promo code: v2ray.com ## Хостинг * [Let's Encrypt](https://letsencrypt.org/): Бесплатные TLS-сертификаты * [Vultr](https://www.vultr.com/?ref=7269307): VPS * [2019 limited promotion, $50 free credit](https://www.vultr.com/?ref=7783021-4F) * [BlueHost](https://www.bluehost.com/track/v2ray/): VPS, веб-хостинг * [ClouDNS](https://www.cloudns.net/aff/id/244749/): Регистрация доменов, DNS, сертификаты SSL ## Криптовалюта * [LocalBitcoins](https://localbitcoins.com/?ch=khtm): Торговля биткоинами в оффлайн * [CoinCola](https://www.coincola.com/mobile/signup?ref=QAcvfy2g): Внебиржевой рынок для торговли BTC, ETH, BCH, USDT. * [Binance](https://www.binance.com/?ref=35382451): Торговая площадка для криптовалют. * [Coinex](https://www.coinex.com/account/signup?refer_code=r3fmp): Торговая площадка для криптовалют. * [CoinPayment](https://www.coinpayments.net/index.php?ref=abc5f542afed6b37b4b3d7fb83242d18): Онлайн-кошелек с криптовалютой. * [PrimeDice](https://primedice.com/?c=default): Игра в кости на биткоины. * [OneHash](https://www.onehash.com/?ap=56d52158f7e04b169ec54d): Ставки на спорт, Bitcoin, Чемпионат мира 2018. * [Bitsler](https://www.bitsler.com/?ref=VictoriaR): Игры в казино на биткоины. ================================================ FILE: ru/ui_client/windows.md ================================================ --- refcn: ui_client/windows refen: ui_client/windows --- # Windows ## V2RayW * Загрузить: [GitHub](https://github.com/Cenmrev/V2RayW) ## V2RayN * Загрузить: [GitHub](https://github.com/2dust/v2rayN) ## V2RayS * Загрузить: [GitHub](https://github.com/Shinlor/V2RayS) ## Другие инструменты {#other} ### PuTTY Клиент SSH. * Веб-сайт: [putty.org](http://www.putty.org/) ### Visual Studio Code Редактор исходного кода от Microsoft. * Веб-сайт: [code.visualstudio.com](https://code.visualstudio.com/) ### Telegram Зашифрованное общение. * Веб-сайт: [telegram.org](https://telegram.org/) ================================================ FILE: ru/welcome/command.html ================================================ Командная строка · Project V Official

Командная строка

V2Ray

V2Ray имеет следующие параметры командной строки:

v2ray [-version] [-test] [-config=config.json] [-format=json]

-version

Вывести версию V2Ray, затем завершить работу.

-test

Считать и проверить настройки, вывести найденные ошибки, затем завершить работу.

-config

URI файла с настройками. Возможные варианты:

  • Путь к локальному файлу с настройками. Может быть как относительным, так и абсолютным.
  • "stdin:": Указывает V2Ray считать настройки через стандартный поток ввода. Вызывающая программа должна закрыть stdin после вывода настроек.
  • Начинающиеся с http:// или https:// (в нижнем регистре): V2Ray пытается загрузить настройки с указанного адреса.

-format

Формат файла с настройками. Возможные варианты:

  • json: формат JSON.
  • pb или protobuf: формат Protobuf.

Если значение -config не задано, V2Ray сначала пытается загрузить конфигурацию из config.json из рабочего каталога, а затем из каталога, заданного переменной среды v2ray.location.asset.

V2Ctl

V2Ctl — это набор инструментов командной строки. Он работает следующим образом:

v2ctl <command> <options>

command

Доступные значения:

  • api: Удалённое управление работающим V2Ray.
  • config: Преобразовать конфигурацию из формата JSON в protobuf.
  • cert: Генерировать сертификаты TLS.
  • fetch: Загрузка удалённого конента.
  • tlsping: (V2Ray 4.17+) Проверить усановление соединения (handshake) TLS.
  • verify: Проверить подпись релиза V2Ray.
  • uuid: Генерировать UUID.

V2Ctl Api

v2ctl api [--server=127.0.0.1:8080] <Service.Method> <Request>

Удалённое управление запущеными серверами V2Ray. Пример:

v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger ''

V2Ctl Config

v2ctl config

Команда без параметров. Принимает конфигурацию в JSON из stdin, преобразует её в Protobuf и выводит в stdout.

V2Ctl Cert

v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h] [--name="V2Ray Inc"] [--org="V2Ray Inc] [--json] [--file=v2ray]

Генерирует сертификат TLS на основе параметров.

--ca

Если указано, сертификат будет сертификатом CA.

--domain

Alternative Names in the certificate. This option can be used multiple times for multiple domains. For example: --domain=v2ray.com --domain=v2ray.cool.

--expire

Expire date of the certificate. Value is a Golang duration.

--name

Command Name in the certificate.

--org

Orgnization in the certificate.

--json

If specified, the certificate will be printed to stdout in the JSON format that is used in V2Ray.

--file

Prints the certificate into files. When --file=a, two files named a_cert.pem and a_key.pem will be generated.

V2Ctl Fetch

v2ctl fetch <url>

Fetch remove resources and print to stdout. Only HTTP and HTTPS URL are supported.

V2Ctl TlsPing

v2ctl tlsping <domain> --ip=[ip]

Test TLS handlshake with specific domain.

domain

Target domain for the TLS handshake.

--ip

The IP address of the domain. If not specifed, V2Ctl resolves it through system DNS.

V2Ctl Verify

v2ctl verify [--sig=/path/to/sigfile] <filepath>

To verify the signature of a V2Ray binary.

--sig

Path to signature file. Default value is the ".sig" file to the path to be verified.

filepath

The file to be verified.

V2Ctl UUID

v2ctl uuid

No options. This command prints a random UUID.

================================================ FILE: ru/welcome/donate.html ================================================ Пожертвование · Project V Official

Пожертвование

V2Ray - некоммерческий проект. Исходный код и программа могут свободно (в основном) использоваться по лицензии MIT. Если вам нравится этот проект, подарите нам чашечку кофе.

Ваше пожертвование не имеет прямой связи с разработкой и обслуживанием Project V. Our development will not be influenced by your donation. Тем не менее, мы отправим благодарственное письмо каждому донору. Если вы не хотите получать такое письмо, оставьте записку в своем пожертвовании.

При жертвований более $50 предусмотрены такие плюшки:

  • Ваше имя или название компании висит на главной странице целый месяц.
  • Измените наш код как хотите. Ограничения: не трогать касающуюся пользователя функциональность; никаких изменений в документации. Правки останутся в коде на месяц.

Обычный способ

Paypal

Вы можете сделать пожертвование через внутренний перевод Paypal или кредитной картой

Пожалуйста, обратите внимание, что Paypal берёт высокую комиссию за обслуживание. Пожертвование менее 1 USD не имеет смысла.

Patreon

Patreon - это платформа для регулярных пожертвований. Вы можете использовать Patreon, если хотите часто делать пожертвования на постоянной основе.

Подарочная карта

Сейчас мы можем принять подарочные карты только от Amazon US. Вы можете купить их на Amazon.com и отправить на love@v2ray.com.

Криптовалюта

Криптовалюта является более надежным способом международных транзакций. Крипто-кошелек обычно является анонимным, и ваше пожертвование не отслеживаемо.

Из-за анонимности, присущей криптовалюте, пожалуйста, отправьте нам электронное письмо до вашего пожертвования, если вы хотите получить благодарственное письмо в ответ.

Bitcoin

Адрес: 3GctrB7R5sMhJ73N4AKo56Bdf9RE3RJsuM

Статистика и QR-код на BlockChain

Bitcoin Cash

Адрес: 15oATKUq5mEfuzasPnsJ58TjJU5SvDJK97

Статистика и QR-код на BlockChain

Ethereum

Адрес: 0x112ee71189704fe04cabed4aa045f4461c8c8696

Статистика и QR-код на BlockChain. А ещё туда можно отправить токены, поддерживающие ERC20: OMG, REP, GNT, и DGD

EOS

Адрес: EOS8Civdok4CBN3jCpsaGQijzesjKof1eyaRFuBU5mLMtWVkLsy8a

Litecoin

Адрес: LVdeH2HkCgGRs8ZEpan7fkAEEPbiJ4McoR

Monero

Адрес: 48kA4NyLRCWQvB7U2A77G66Z25uWbyzmoZSYjxJfrMR1J4dRFW6fWFLDn3wirAqP8ySnR4rnvoXWxfkNFhrK5ZxY1WyBqKg

Ripple

Адрес: r439fPk8DzCf4nSxkpfodEuE2cG4KVZQHq

Тэг не обязателен

Другое

Если вы хотите пожертвовать нам другую валюту, отправьте нам электронное письмо по адресу love@v2ray.com.

================================================ FILE: ru/welcome/faq.html ================================================ ЧаВо · Project V Official

Часто задаваемые вопросы (ЧаВо)

Использование V2Ray

Как обновить V2Ray

  • Загрузите последний пакет, либо
  • Запустите ещё раз скрипт установки (для Linux)

Сбои V2Ray

  • Если вы используете Linux с systemd, вы можете посмотреть в журнал с ошибками, используя команду journalctl -u v2ray.
  • В общем случае вы можете запустить команду v2ray -config =<config-file> -test чтобы увидеть информацию об ошибке.

Обратная совместимость

  • Конфигурационные файлы (например, JSON), обратно совместимы как минимум с последним крупным релизом. Так, V2Ray 4.x поддерживает конфигурационные файлы от V2Ray 3.x.
  • Протоколы на Protobuf, такие как Api, также обратно совместимы как минимум с последним релизом.
  • Бинарные протоколы, такие как Shadowsocks и VMess, всегда обратно совместимы, если версия сервера не старше клиентской. Если клиентская версия новее, обратная совместимость есть миниум с 12 минорными релизами.

Ошибки V2Ray

Socks: Unknown Socks version: 67

Возможная причина

  • Вы настроили в V2Ray socks, но браузер пытается использовать его как HTTP-прокси.

Решение

  • Добавьте в V2Ray HTTP как протокол для входящих соединений, затем в браузере обновите настройки прокси-сервера.

Лицензия этого проекта

Project V использует следующую лицензию.

V2Ray

Исходный код и официальные релизы распространяются под лицензией MIT, включая данные в следующих репозиториях.

V2Ray.Com

Официальный веб-сайт, v2ray.com, лицензируется на условиях Creative Commons Attribution 4.0 International License.

  • Включая все видимые тексты и изображения на веб-сайте.
  • В том числе логотип Project V.
  • Включая весь исходный код, который используется для создания веб-сайта, а именно, v2ray/manual.

Скриншоты и другие файлы

Все файлы третьих лиц, перечисленные ниже, принадлежат их создателям. Файлы принадлежат тем, кто их создал.

  • Включая все скриншоты Project V.
  • Включая все файлы конфигурации, которые используются для запуска Project V.
  • Включая все логи, созданные Project V во время выполнения.

Другой контент

Все не упомянутые выше материалы лицензируются индивидуально.

================================================ FILE: ru/welcome/help.html ================================================ Поддержка · Project V Official

Поддержка

С сообществом Project V можно связаться разными способами.

Команда Project V знает китайский и английский. Пожалуйста, выбирайте из них при задавании вопросов.

Github issues

Мы используем несколько репозиториев для различных дискуссий.

Telegram

Project V предоставляет следующие группы для разных типов обсуждений.

Темы в этих группах в основном на китайском. Если вы создадите ещё одну группу на родном языке, дайте нам знать.

Во всех группах запрещены: взрослый контент, политика, разжигание ненависти. Нарушителей будут карать баном.

Также обратите внимание на канал с объявлениями от Project V.

Twitter

ProjectV2Ray для длительного общения.

E-mail

Если вы хотите поговорить с командой V2Ray тет-а-тет, напишите на один из адресов ниже.

love@v2ray.com: Основной адрес для связи. Проверяется каждый день.

v2ray@protonmail.com: Ящик на ProtonMail с оконечным шифрованием. Проверяем реже из-за сложностей использования.

Мы очень загружены, так что не обещаем ответить на все письма. А общие вопросы лучше отправить в группы выше: другие пользователи, скорее всего, ответят быстрее.

Вы можете получить открытый ключ PGP, поискав love@v2ray.com. Ну или использовать приложенный ниже открытый ключ.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org

mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu
3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85
c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs
0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w
EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk
CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj
OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY
cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m
uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV
va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF
5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB
tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP
eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu
ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY
WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM
iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG
1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5
iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm
ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM
otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe
3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q
dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT
swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh
SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc
tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt
kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB
8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/
ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y
1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO
SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+
GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/
KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/
b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy
ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN
dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP
eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV
9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB
TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt
6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ
IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+
2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT
tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH
iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6
U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD
WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B
X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt
PeRpd1GUXXeoGCw=
=To5T
-----END PGP PUBLIC KEY BLOCK-----
================================================ FILE: ru/welcome/install.html ================================================ Установка · Project V Official

Загрузка и установка

Платформа

V2Ray доступен на следующих платформах:

  • Windows 7 и более поздние версии (x86 / amd64)
  • Mac OS X 10.10 Yosemite и более поздние версии (amd64)
  • Linux 2.6.23 и более поздние версии (x86 / amd64 / arm / arm64 / mips64 / mips)
    • Включая, но не ограничиваясь, Debian 7/8, Ubuntu 12.04 / 14.04 и более поздние версии, CentOS 6/7, Arch Linux
  • FreeBSD (x86 / amd64)
  • OpenBSD (x86 / amd64)
  • Dragonfly BSD (amd64)

Загрузка

Готовые пакеты можно найти здесь:

  1. Github Release: github.com/v2ray/v2ray-core
  2. Зеркало: github.com/v2ray/dist
  3. Homebrew: github.com/v2ray/homebrew-v2ray
  4. Arch Linux: packages/community/x86_64/v2ray/
  5. Snapcraft: snapcraft.io/v2ray-core

Все пакеты находятся в формате ZIP. Загрузите и распакуйте подходящие пакеты в свою систему.

Verify

Существует два способа проверки пакетов.

  1. Каждый .zip-файл имеет одноименный .dgst-файл с контрольной суммой SHA.
  2. Файл подписи GPG для исполняемых файлов (v2ray / v2ray.exe) можно найти в файле v2ray.sig (или v2ray.exe.sig) в том же пакете. Открытый ключ находится в хранилище.

Установка в Windows и Mac OS

Запустите v2ray / v2ray.exe после распаковки пакетов.

Установка в Linux

Мы предоставляем сценарий для установки в Linux. Этот сценарий обнаруживает предыдущую инсталляцию v2ray и затем обновляет старую или устанавливает новую. Если предыдущая версия обнаруживается, конфигурационный файл в /etc/v2ray не будет перезаписан во время обновления.

Следующая команда требует прав суперпользователя.

Выполните следующую команду для установки V2Ray. Если yum или apt доступны, скрипт установит unzip и daemon / systemd. Они необходимы для запуска V2Ray в качестве службы. Вам необходимо установить их вручную, если ваша система Linux не поддерживает yum или apt.

curl -Ls https://install.direct/go.sh | sudo bash

Этот сценарий устанавливает следующие файлы.

  • /usr/bin/v2ray/v2ray: Исполняемый файл V2Ray
  • /usr/bin/v2ray/v2ctl: Утилита управления
  • /etc/v2ray/config.json: Файл с настройками
  • /usr/bin/v2ray/geoip.dat: Файл с данными об IP
  • /usr/bin/v2ray/geosite.dat: Файл с данными о доменах

Этот сценарий также настраивает V2Ray для запуска в качестве службы, если systemd доступен.

Конфигурации находятся в следующих местах.

  • /etc/systemd/system/v2ray.service: Systemd
  • /etc/init.d/v2ray: SysV

После установки необходимо:

  1. Изменить файл /etc/v2ray/config.json так, как вам необходимо.
  2. Выполнить команду service v2ray start для запуска V2Ray.
  3. Опционально выполнить service v2ray start|stop|status|reload|restart|force-reload для управления службой V2Ray.

go.sh

go.sh поддерживает следующие параметры.

  • -p или --proxy: Использовать прокси для загрузки пакетов V2Ray. Формат такой же, как и у curl. Например, "socks5://127.0.0.1:1080" или "http://127.0.0.1:3128".
  • -f или --force: Принудительная установка. Сценарий предполагает, что V2Ray не был установлен вообще.
  • --version: Версия, которая должна быть установлена, например "v1.13". Значение по умолчанию - это последняя стабильная версия.
  • --local: Использовать локальный пакет для установки.

Примеры:

  • Использовать SOCKS-прокси 127.0.0.1:1080 для установки последнего пакета: ./go.sh -p socks5://127.0.0.1:1080
  • Установить v1.13 из локального файла:./go.sh --version v1.13 --local /path/to/v2ray.zip

Docker

V2Ray предоставляет два типа докер-контейнеров:

  • v2ray/official: Официальные релизы.
  • v2ray/dev: Свежайший код (в разработке).

Контейнеры имеют ту же структуру, что и установленный Linux.

================================================ FILE: ru/welcome/license.md ================================================ --- refcn: chapter_00/license refen: welcome/license --- # Лицензия Project V использует следующую лицензию. ## V2Ray Исходный код и официальные релизы распространяются под лицензией MIT, включая данные в следующих репозиториях. * [v2ray/v2ray-core](https://www.github.com/v2ray/v2ray-core/) * [v2ray/ext](https://www.github.com/v2ray/ext) ## V2Ray.Com Официальный веб-сайт, [v2ray.com](https://www.v2ray.com/), лицензируется на условиях [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). * Включая все видимые тексты и изображения на веб-сайте. * В том числе логотип Project V. * Включая весь исходный код, который используется для создания веб-сайта, а именно, [v2ray/manual](https://www.github.com/v2ray/manual). ## Скриншоты и другие файлы {#screenshots} Все файлы третьих лиц, перечисленные ниже, принадлежат их создателям. Файлы принадлежат тем, кто их создал. * Включая все скриншоты Project V. * Включая все файлы конфигурации, которые используются для запуска Project V. * Включая все логи, созданные Project V во время выполнения. ## Другой контент {#other} Все не упомянутые выше материалы лицензируются индивидуально. ================================================ FILE: ru/welcome/pgp.md ================================================ --- refcn: chapter_00/pgp refen: welcome/pgp --- # Приватное сообщение Отправьте сообщение на один из адресов ниже, если вы хотите приватно поговорить с командой V2Ray. 1. `love@v2ray.com` 2. `v2ray@protonmail.com` \#1 is based on Gmail. If you concern the privacy of email content, please consider using the PGP public key below. \#2 основан на ProtonMail, который использует сквозное шифрование. К сожалению из-за высокой рабочей нагрузки, не обещаем, что на каждое письмо будет дан ответ. Извините за неудобства. Для быстрого ответа на вопросы, связанные с использованием V2Ray, пожалуйста, обратитесь к нашему [сообществу](../get_started/issue.md). ```text -----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu 3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85 c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs 0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF 5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG 1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5 iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe 3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB 8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/ ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y 1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+ GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/ KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/ b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV 9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt 6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+ 2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6 U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt PeRpd1GUXXeoGCw= =To5T -----END PGP PUBLIC KEY BLOCK----- ``` ================================================ FILE: ru/welcome/start.html ================================================ Быстрый старт · Project V Official

Быстрый старт

Вам необходимо настроить V2Ray после его установки. Вот быстрая конфигурация для демонстрационного запуска. Детально настройки рассматриваются в Обзоре настроек.

Клиент

Запустите V2Ray со следующей конфигурацией на вашем ПК (или мобильном).

{
  "inbounds": [{
    "port": 1080,  // Port of socks5 proxy. Настройте браузер на использование этого порта.
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "server", // Address of your V2Ray server. Может быть IP или доменным именем.
        "port": 10086,  // Порт сервера V2Ray.
        "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
      }]
    }
  },{
    "protocol": "freedom",
    "tag": "direct",
    "settings": {}
  }],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [{
      "type": "field",
      "ip": ["geoip:private"],
      "outboundTag": "direct"
    }]
  }
}

Измените IP-адрес своего сервера V2Ray, как указано выше в комментариях. После этого начнёт V2Ray проксировать весь трафик с вашего ПК на сервер V2Ray, за исключением внутрисетевого трафика.

Сервер

Вам нужен еще один компьютер для запуска V2Ray в качестве сервера. Обычно этот компьютер находится за пределами файрвола (локального или глобального). Вот пример конфигурации.

{
  "inbounds": [{
    "port": 10086, // Port of the server. Должен быть таким же, как упомянутый выше.
    "protocol": "vmess",
    "settings": {
      "clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  }]
}

Убедитесь, что поле id одинаково на клиенте и сервере.

Запуск

  • В Windows и macOS файл конфигурации находится в том же каталоге, что и исполнимый файл V2Ray. Вы можете запустить v2ray или v2ray.exe без дополнительных параметров.
  • На Linux файл конфигурации обычно находится в /etc/v2ray/config.json. Выполните v2ray --config=/etc/v2ray/config.json в консоли или используйте другие инструменты, типа systemd, для запуска V2Ray в качестве фонового процесса.

Детально настройки рассматриваются в Обзоре настроек.

================================================ FILE: ru/welcome/tg.md ================================================ --- refcn: chapter_00/tg refen: welcome/tg --- # Группа в Telegram Project V предоставляет следующие группы для разных типов обсуждений. 1. [Использование](https://t.me/v2fly_chat): Использование Project V. 2. [Другое](https://t.me/joinchat/DNcazUIYaH80uVfeS716jg): Другие темы. Также обратите внимание на [канал с объявлениями от Project V](https://t.me/v2fly). ## Правила Разрешенные/запрещенные темы перечислены ниже. | / | Использование | Другое | | --------------------:|:--------------------------------:|:--------------------------------:| | Разработка Project V | ✔ | ✔ | | Алгоритмы | ✔ | ✔ | | Сети компьютеров | ✔ | ✔ | | Обход цензуры | ✔ | ✔ | | Использование V2Ray | ✔ | ✔ | | Развертывание V2Ray | ✔ | ✔ | | Связанное ПО | ✔ | ✔ | | Картинки с мемами | ✘✘ | ✔ | | Политика | ✘ | ✔ | | Болтовня | ✘ | ✔ | | Реклама | ✘✘ | ✘✘ | | 18+ | ✘✘✘ | ✘✘✘ | | Лучи ненависти | ✘✘✘ | ✘✘✘ | | Кража личных данных | ✘✘✘✘ | ✘✘✘✘ | ### Кара за нарушения 1. ✘ немедленное удаление сразу же после уведомления. 2. ✘✘ - постер улетает в бан на неделю. 3. ✘✘✘ - постер улетает в бан на месяц. 4. ✘✘✘✘ - постер улетает в бан навечно. ================================================ FILE: ru/welcome/versions.html ================================================ История версий · Project V Official

История версий

На этой странице перечислены регулярные выпуски с обновлениями функций. Если релиз Github здесь не указан, он обычно содержит только исправления ошибок.

2019.03.01 v4.18

  • Port list in routing rules now supports mixed format.
  • Updated geosite information in routing, and description for static hosts in DNS.
  • Option to not use system root CAs for TLS handshake.
  • New routing rule for traffic attributes.

2019.02.22 v4.17

  • New sub-command tlsping in V2Ctl.

2019.02.15 v4.16

For end users:

  • DNS outbound proxy now supports to modify DNS server info.

For developers:

  • 'ext' repository is now deprecated. #1541

2019.02.08 v4.15

  • DNS outbound proxy.

2019.02.01 v4.14

  • Static DNS mapping now supports domain to domain mapping.

2019.01.18 v4.13

  • Quic lib updated. It is not compatible with previous versions.
  • DNS now have tag settings.

2019.01.11 v4.11

Для разработчиков:

2018.12.07 v4.8

For end users:

  • Bug fixes

For developers:

2018.11.30 v4.7

  • Freedom now supports for dialing IPv4 or IPv6 address only.
  • New QUIC transport.

2018.11.23 v4.6

  • Freedom now can automatically choose between IPv4 and IPv6 destination address, based on SendThrough settings.

2018.11.16 v4.4

  • Load balancer rules in routing.
  • Memory usage gets optimized.

2018.11.05 v4.1

  • JSON configuration format changes. Old format is still suported.
  • Performance on GeoIP matching is improved.

2018.11.02 v4.0

  • Reverse proxy.
  • Release packages for ppc64 and ppc64le.

2018.10.12 v3.47

  • Migrate to a new continuous delivery pipeline

2018.09.28 v3.44

  • Dokodemo-door now supports TProxy in Linux.

2018.09.21 v3.43

  • DNS now supports on-demand queries by domain.

2018.09.14 v3.40

  • New socket options in transport configuration. It can be used to setup VPNs.
  • New TCP Fast Open option in transport configuration.

2018.09.03 v3.38

  • mKCP has a new WireGuard header.
  • Fix softfloat binaries in mips/mips64.

2018.08.31 v3.37

  • Performance of reading network connection in optilized. See Environment Variables
  • VMess uses AES-128-GCM by default on ARM64.
  • Built by Go 1.11.

2018.08.24 v3.36

  • Great performance improvement on subdomain matching (domain:) in routing.
  • Full domain matching is now supported in routing.

2018.08.07 v3.34

  • Better memory management on most devices.

2018.07.27 v3.32

  • BitTorrent traffic can now be sniff'ed.
  • New protocol option in routing rules for protocol-based routing.
  • New geosite:speedtest option in routing rules to match all public servers of speedtest.net.

2018.07.20 v3.31

2018.07.13 v3.30

  • Fix an issue that may cause broken connections in mKCP.
  • Thanks to our friends who speak Russian. Now our documents are in Russian.

2018.07.06 v3.29

  • New inbound and outbound for MTProto proxy.

2018.06.29 v3.27

  • DNS now supports EDNS client subnet.
  • DNS static host now supports sub-domain matching.

2018.06.15 v3.26

  • Add Dragonfly BSD release.

2018.06.01 v3.24

  • Internal buffer size (per connection) can now be configured in JSON configuration.
  • mKCP now supports DTLS 1.2 header.
  • TLS transport now only support cipher suites in TLS 1.3 spec.

2018.05.25 v3.23

  • In JSON configuration, port can now be specified from env variables.
  • JSON config now supports to load domains and IPs from specified files.

2018.04.20 v3.19

  • Traffic stats for inbound proxies.

2018.04.13 v3.17

  • V2Ray can load config file from HTTP(s).
  • TLS in V2Ray can issue new certificates by provided CA certificates for domains in incoming requests.
  • HTTP/2 transport.

2018.04.06 v3.16

  • Statistics.
  • Shadowsocks inbound now can be configured to only listen on UDP. Strongly recommend to not listen on both TCP and UDP on the same port.

2018.03.02 v3.11

  • A new settings is introduced in VMess inbound, to forbid client using insecure encryption methods.
  • Offers ARMv7 release.
  • Offers MIPS release that doesn't require FPU.

2018.02.23 v3.10

  • Log entries now contain session ID to distinguish proxy sessions.
  • Bug fixes.

2018.02.15 v3.9

  • Happy New Year!
  • Bug fixes.

2018.02.09 v3.7

2017.12.29 v3.5

  • Geoip now supports private network address under name "private".

2017.12.22 v3.4

  • Websocket nows uses value of X-Forwarded-For header as source address.
  • Support s390x CPU architecture.

2017.12.08 v3.1

  • Support policy.
  • Config file location can be specified via environment variable.

2017.12.01 v3.0

  • Support Shadowsocks AEAD

2017.11.18 v2.50

  • v2ray now tried to use v2ctl for configuration parsing. Please make sure these 2 files are in the same directory.
  • New IPOnDemand strategy in routing.

2017.11.10 v2.47

  • geosite data is now in geosite.dat file.
  • Bug fixes.

2017.11.03 v2.46

  • Router now supports geosite:cn, equivalent to existing chinasites, but more flexible.
  • Router now supports geoip.
    • File geoip.dat is added to release packages. This file contains all geoip information and has to stay in the same directory of v2ray program. Due to delayed update of installation script, you may have to copy the file manually.
  • Program v2ctl is added to release packages. You may run v2ctl verify /path/to/v2ray to verify the signature of v2ray program.

2017.10.27 v2.44

  • HTTP now supports Basic Authentication.
  • Some bugs are fixed.

2017.10.06 v2.40

  • Fix an issue that causes memory leak.

2017.09.29 v2.39

  • Inbound proxies now close connections more quickly when remote server closes them.
  • Default connection timeout changes to 5 minutes.

2017.05.12 v2.27

  • New domain mode in router.

2017.05.05 v2.26

  • Stability fixes.

2017.04.28 v2.25

  • Simple sniffing on HTTP and TLS traffic for the actual domain on request.

2017.04.21 v2.24

  • Stabilize Mux.
  • Improves memory efficiency.

2017.04.15 v2.23

  • Performance improvement in Mux.
  • Max number of connections can be configured in Mux now.
  • Performance improvement in HTTP inbound.
  • connectionReuse setting is removed in favor of Mux.

2017.04.08 v2.22

  • Mux.Cool protocol.

2017.02.25 v2.20

  • GPG signature is added to download package.
  • New binary wv2ray.exe is added to Windows package, which runs as a background application.

2017.02.18 v2.19

  • A new mechanism for anti reply attack is now enforced on server side.
    • No impact to existing clients.
  • Upgrade of VMess AES-128-GCM / Chacha20-Poly1305 / None encryption methods.
    • Please upgrade client and server at once.
    • AES-128-CFB is not affected.
  • Built with Golang 1.8. Add 32-bit MIPS support.

2017.02.11 v2.18

  • Cleanup WebSocket code.
  • Remove allowPassive option. Now passive connections are always allowed.
  • Bug fixes

2017.02.04 v2.17

  • Bug fixes.

2017.01.28 v2.16

  • New 'redirect' option in freedom. It can be used to adapt tools like Shadowsocks Obfs.
  • Performance improvement in VMess non-encryption mode. Not compatible with previous versions.
  • Happy New Year!

2017.01.16 v2.15

  • All proxies can use mKCP and WebSocket now.

2017.01.09 v2.14

  • Socks 5 outbound.
  • Bug fixes.

2017.01.02 v2.13

  • Bug fixes.

2016.12.26 v2.12

  • Bug fixes.

2016.12.19 v2.11

  • JSON config file now supports comment.

2016.12.12 v2.10

  • VMess now supports AES-GCM and ChaCha20-Poly1305 encryption methods.

2016.12.05 v2.9

  • Fix compatibility with Alpine Linux.

2016.11.28 v2.8

  • Shadowsocks server now accepts OTA settings.
  • Bug fixes.

2016.11.21 v2.7

  • Main inbound and outbound connection handler can be tagged now.
  • Bug fixes.

2016.11.14 v2.6

  • Data sent by one outbound can be proxied to another outbound.
  • Routing can be based on inbound tag.

2016.11.07 v2.5

  • New Shadowsocks outbound;
  • New TCP header: HTTP;

2016.10.24 v2.4

  • TCP / mKCP / WebSocket can be configured per inbound / outbound;
  • Routing can be done on source IP;

2016.10.17 v2.3

  • Introduce new Protobuf-based configuration;
  • OpenBSD binaries;
  • Small fixes;

2016.09.19 v2.2

2016.09.19 v2.1

  • mKCP performance improvement;

2016.08.20 v2.0

  • One year;

2016.08.15 v1.24

  • New mKCP header: utp;
  • New option in inbound connection config "allowPassive" to allow passive connection;

2016.08.08 v1.23

  • Optimize mKCP packet format. This version of mKCP is NOT compatible with previous ones;
  • mKCP can now be configured to disguise as video data.

2016.08.01 v1.22

  • Fix a memory leak in mKCP;
  • Add FreeBSD release;

2016.07.25 v1.21

  • High performance Chacha20 (Thanks to aead@);
  • Bug fixes;

2016.07.18 v1.20

  • New KCP options: readBufferSize and writeBufferSize;
  • Bug fixes;

2016.07.11 v1.19

  • Enable TLS option for all proxies;
  • Fix a performance issue in KCP;
  • Fix an issue in KCP that could cause EOF response;

2016.07.04 v1.18

  • Fix a "too many open files" issue in KCP;
  • KCP now uses fewer CPU;
  • Other bug fixes;

2016.06.19 v1.17

2016.06.12 v1.16

  • TCP connection reuse is now enabled by default;
  • Dokodemo-door is able to recognize TCP connection redirected by iptables;
  • Blackhole is able to send back HTTP forbidden data;

2016.06.05 v1.15

  • Optionally reuse TCP connection for better performance;
  • Allow listening on a specific IP address;
  • Allow sending data through a specific IP address;
  • Fix an issue in HTTP proxy that may exhaust memory;

2016.05.29 v1.14

  • Fix a panic issue in http proxy;
  • More functionalies in install script;
  • Static route in DNS;
  • Official server address change;

2016.05.16 v1.13

  • Internal DNS server, to provide better routing results combined with chinasites and chinaip;
  • Fix an issue in UDP relay;

2016.05.01 v1.12.1

  • Fix a bug in VMess.

2016.05.01 v1.12

  • Second try to fix the memory usage issue;
  • Improve Shadowsocks performance;
  • New option "none" in loglevel;

2016.04.18 v1.11

  • Try to fix the memory usage issue.

2016.03.07 v1.10

  • Fix an performance issue when dynamic ports refreshes.

2016.02.29 v1.9.1

  • Fix Shadowsocks one-time authentication (OTA) issue.

2016.02.29 v1.9

  • Support for Shadowsocks ChaCha20 encryption;
  • Add more direct connection sites to the default configuration file;
  • Dynamic ports now automatically create an account.

2016.02.22 v1.8

  • Update installation script install-release.sh (thanks, @netcookies):
    • You can now automatically stop the V2Ray process and update automatically after the completion of V2Ray;
    • The install-release.sh accepts the --proxy argument and V2Ray specified proxy download;
  • Use Go 1.6 compiler to improve the performance of AES encryption;
  • Minor fixes;
  • Update the official server IP (please re-download the installation package to get the latest configuration).

2016.02.08 v1.7

  • UDP relay performance improved;
  • Shadowsocks security improved;
  • Minor fixes;
  • Happy new year!
================================================ FILE: ru/welcome/workflow.html ================================================ Принцип работы · Project V Official

Принцип работы

Одиночный сервер

Как и в случае с другими прокси, вам нужен прокси-сервер, с запущенным V2Ray. Вы можете подключаться к Интернету через этот сервер с ПК, мобильных и других устройств.

graph LR; A(ПК) -.- B(Файрвол); B -.-> C(Заблокированный сайт); A --> D(V2Ray/VPS); D --> C; A --> E(Обычный сайт);

V2Ray поддерживает соединения с нескольких устройств с различными протоколами одновременно. В то же время механизм локальной маршрутизации может грамотно проксировать только необходимые соединения.

Мост из серверов

Если вам не хочется настраивать V2Ray на каждом устройстве, вы можете настроить сервер до файрвола, весь трафик будет проходить через этот сервер. Сервер сам будет маршрутизировать соединения.

graph LR; A(ПК) -.-> B(Файрвол); B -.-> C(Заблокированный сайт); A --> D(VPS 1); D --> E(VPS 2); E --> C; D --> F(Обычный сайт);

Внутреннее устройство

Изнутри V2Ray выглядит как показано ниже. Он поддерживает несколько входящих прокси-соединений и несколько исходящих. Каждое из них независимо от других.

graph LR; A1(вход) --> D(Распределитель / Маршрутизатор / DNS); A2(вход) --> D; A3(вход) --> D; A4(вход) --> D; D --> B1(выход); D --> B2(выход); D --> B3(выход); D --> B4(выход);

Замечания:

  • Вы должны настроить как минимум одно входящее и одно исходящее соединение, чтобы заставить V2Ray работать.
  • Прокси на входе взаимодействует с клиентским программным обеспечением, например, браузером.
  • Прокси на выходе взаимодействует с удаленным сервером, например Apache, на котором крутится сайт.
  • Диспетчер выбирает исходящее соединение для запроса на основе настраиваемых правил.

Детально настройки рассматриваются здесь.

================================================ FILE: styles/website.css ================================================ .book-summary { font-family: "Noto Sans CJK SC", "PingFang SC", "Microsoft Yahei", "Hiragino Sans GB", sans-serif; font-size: 14px; } .book-header .btn { padding: 0 5px; } .markdown-section { font-family: "Noto Sans CJK SC", "PingFang SC", "Microsoft Yahei", "Hiragino Sans GB", sans-serif; font-weight: 400; font-size: 14px; } .markdown-section pre>code { font-family: "Source Code Pro", monospace; font-weight: 400; font-size: 14px; } .markdown-section code:not([class]) { white-space: nowrap; padding: 0; } .markdown-section blockquote { margin: 0; margin-bottom: .85em; padding: 0 15px; border-left: 4px solid #64b5f6; border-top: 1px solid #64b5f6; color: #000000; margin-top: 10px; } ================================================ FILE: vi/awesome/ads.html ================================================ With Ads · Project V Official

Some Advertisement

The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V.

Self Hosting

Let's Encrypt

Free TLS certificates

Vultr

VPS

2019 limited promotion, $50 free credit

BlueHost

VPS, web hosting

ClouDNS

Domain registration, DNS, SSL certificate

Bandwagon

Well-known VPS provider. Low price for good product.

VPN

BabyDriver

Supports V2Ray. Coupon code: bcb518

喵帕斯

V2Ray support (beta)

Lanan

V2Ray based VPN service. Coupon code: v2ray

V2Net

Customized V2Ray service. Promo code: v2ray.com

Cryptocurrency

LocalBitcoins

Trade Bitcoins offline

CoinCola

OTC market to trade BTC, ETH, BCH, USDT.

Binance

Trading market for crypto currencies.

Coinex

Trading market for crypto currencies.

CoinPayment

Online crypto currency wallet

================================================ FILE: vi/awesome/tools.html ================================================ Awesome V · Project V Official

Awesome V

Graphic Client

V2RayW

Download: Github

V2RayN

Download: Github

Clash for Windows

Download: Github

V2RayX

Download: Github

V2RayU

Download: Github

V2RayC

Download: Github

ClashX

Download: Github

Qv2ray

Qv2ray: v2ray Cross-Platform GUI written in Qt, supports multi-language, connection edit and auto-check updates

Download: GitHub

Website (Chinese): https://lhy0403.github.io/Qv2ray

Mellow

Mellow is a rule-based global transparent proxy client for Windows, macOS and Linux.

Download: Github

Kitsunebi

Kitsunebi is an iOS app based on V2Ray. It provides full functionality as V2Ray. It also supports importing and exporting V2Ray compatible JSON configuration.

Download: iTunes

i2Ray

i2Ray is another iOS app based on V2Ray with easy-to-use UI design.

Download: iTunes

Shadowrocket

Shadowrocket is a generic VPN app. Is supports multiple protocols such as Shadowsocks, VMess, SSR etc.

Download: iTunes

Pepi (was ShadowRay)

Pepi is V2Ray compatible app. Is is able create VPN connections based on VMess protocol, and communicate with any V2Ray servers.

Download: iTunes

Quantumult

Download: iTunes

BifrostV

BifrostV is an Android app based on V2Ray core. It supports VMess, Shadowsocks, socks protocols.

Download: Play Store | APK Pure

V2RayNG

V2RayNG is an Android app based on V2Ray. It provides same feature set as V2Ray core.

Download: Play Store | GitHub

Online services

Configuration generator

Online configuration generator.

UUID Generator

UUID generator for VMess users.

================================================ FILE: vi/configuration/api.html ================================================ API · Project V Official

API

V2Ray cung cấp một số API để truy cập từ xa. Các API này dựa trên gRPC.

Khi API được bật, V2Ray sẽ tự động tạo proxy đi, được gắn thẻ là thẻ. Người dùng phải định tuyến tất cả các kết nối gRPC cho kết nối này.

ApiObject

ApiObject được sử dụng làm trường api trong cấu hình cấp cao nhất.

{
  "tag": "api",
  "services": [
    "HandlerService",
    "LoggerService",
    "StatsService"
  ]
}

tag: string

Thẻ của proxy gửi đi.

services: [ string ]

Danh sách các API được bật.

Danh sách API được hỗ trợ

HandlerService

API để thao tác proxy trong và ngoài. Các chức năng sau đây được cung cấp:

  • Thêm proxy vào / ra mới.
  • Xóa proxy hiện tại / thư đi.
  • Thêm người dùng mới vào proxy đến (chỉ dành cho VMess).
  • Xóa người dùng hiện tại khỏi proxy gửi đến (chỉ VMess).

LoggerService

Để khởi động lại trình ghi nhật ký nội bộ. Có thể làm việc với logrotate cho các tệp log hoạt động.

StatsService

Hỗ trợ nội bộ Thống kê.

================================================ FILE: vi/configuration/dns.html ================================================ DNS · Project V Official

DNS

V2Ray có một máy chủ DNS nội bộ cung cấp chuyển tiếp DNS cho các thành phần khác.

Do sự phức tạp của giao thức DNS, V2Ray hiện chỉ hỗ trợ các truy vấn IP cơ bản (A và AAAA). Chúng tôi khuyên bạn nên sử dụng một DNS chuyên nghiệp dựa (chẳng hạn như CoreDNS) cho V2Ray.

Các truy vấn DNS được chuyển tiếp bởi dịch vụ DNS này cũng sẽ được gửi đi dựa trên các thiết lập định tuyến. Không cần cấu hình thêm.

DnsObject

DnsObject được sử dụng làm trường dns trong cấu hình mức cao nhất.

{
  "hosts": {
    "baidu.com": "127.0.0.1"
  },
  "servers": [
    {
      "address": "1.2.3.4",
      "port": 5353,
      "domains": [
        "domain:v2ray.com"
      ]
    },
    "8.8.8.8",
    "8.8.4.4",
    "localhost"
  ],
  "clientIp": "1.2.3.4",
  "tag": "dns_inbound"
}

hosts: map{string: address}

A list of static addresses, in the form of domain:address. Each entry has a domain name as key and IP or domain address as value. If a DNS query targets one of the domains in this list, the corresponding IP will be returned immediately and DNS query will not be relayed, or the corresponding domain address will be used for further DNS queries, instead of the previous one.

The format of domains is:

  • Plaintext: When the targeting domain is exactly the value, the rule takes effect. Example: rule "v2ray.com" matches "v2ray.com", but not "www.v2ray.com".
  • Regular expression: Begining with "regexp:", the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule "regexp:\\.goo.*\\.com$" matches "www.google.com" and "fonts.googleapis.com", but not "google.com".
  • Subdomain (recommended): Begining with "domain:" and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule "domain:v2ray.com" matches "www.v2ray.com", "v2ray.com", but not "xv2ray.com".
  • Keyword: Begining with "keyword:" and the rest is a pattern. If this string matches any part of the targeting domain, this rule takes effet. Example: rule "keyword:sina.com" matches targeting domain "sina.com", "sina.com.cn" and "www.sina.com", but not "sina.cn".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.

servers: [string | ServerObject | "localhost" ]

Danh sách các máy chủ DNS. Mỗi máy chủ có thể được chỉ định theo ba định dạng: địa chỉ IP, ServerObjecthoặc "localhost".

Khi máy chủ là địa chỉ IP, chẳng hạn như "8.8.8.8", V2Ray sẽ truy vấn DNS trên cổng UDP 53 trên địa chỉ này.

Khi máy chủ là "localhost", V2Ray sẽ truy vấn máy chủ cục bộ cho DNS.

Khi "localhost" được sử dụng, lưu lượng truy cập DNS không được kiểm soát bởi V2Ray. Tuy nhiên, bạn có thể chuyển hướng truy vấn DNS trở lại V2Ray với cấu hình bổ sung.

clientIp: string

Địa chỉ IP của máy hiện tại. Nếu được chỉ định, V2Ray sử dụng IP này làm EDNS-Client-Subnet. Địa chỉ IP này không thể là địa chỉ riêng tư.

tag: string

(V2Ray 4.13+) All traffic initiated from this DNS, except to localhost, will have this tag as inbound. It can be used for routing.

ServerObject

{
  "address": "1.2.3.4",
  "port": 5353,
  "domains": [
    "domain:v2ray.com"
  ],
}

address: address

Address of the DNS server. For now only UDP servers are supported.

port: number

Port of the DNS server. Usually it is 53 or 5353.

domains: [string]

A list of domains. If the domain of enquire matches one of the list, this DNS server will be prioritized for DNS query for this domain.

Domain name format is the same as in routing.

When a DNS server has the domain in its domain list, the domain will be queried in this server first, and then other servers. Otherwise DNS queries are sent to DNS servers in the order they appear in the config file.

================================================ FILE: vi/configuration/env.html ================================================ Biến Env · Project V Official

Biến môi trường

V2Ray đọc các biến môi trường sau đây.

Kích thước bộ nhớ cache cho mỗi kết nối

  • Tên: v2ray.ray.buffer.size hoặc V2RAY_RAY_BUFFER_SIZE
  • Đơn vị: MBytes
  • Giá trị mặc định: 2 trên x86, amd64, arm64 và s390x. Bộ nhớ cache này bị tắt trên các nền tảng khác.
  • Giá trị đặc biệt: 0 cho kích thước bộ nhớ cache không giới hạn

Deprecated. Use bufferSize in Policy.

For each connection, when there is a difference in speed between inbound and outbound traffic, V2Ray will cache some data for larger throughput. This setting controls the size of the cache. The larger the cache, the better the performance.

Vị trí của tài sản V2Ray

  • Tên: v2ray.location.asset hoặc V2RAY_LOCATION_ASSET
  • Giá trị mặc định: Cùng thư mục nơi v2ray là.

This variable specifies a directory where geoip.dat and geosite.dat files are.

Vị trí của cấu hình V2Ray

  • Tên: v2ray.location.config hoặc V2RAY_LOCATION_CONFIG
  • Giá trị mặc định: Cùng thư mục nơi v2ray là.

This variable specifies a directory where config.json is.

Đọc phân tán

  • Tên: v2ray.buf.readv hoặc V2RAY_BUF_READV
  • Giá trị mặc định: auto

V2Ray 3.37 uses Scatter/Gather IO. This feature will use less memory when connection speed is over 100 MByte/s. Possible values are: auto, enable and disable.

  • bật: Bật đọc phân tán.
  • tắt: Tắt đọc phân tán.
  • auto: Chỉ kích hoạt trên Windows, MacOS, Linux khi CPU là x86, AMD64 hoặc s390x.

When connection speed is less than 100 MByte/s, no matter whether this is enabled or not, there is no obvious difference in terms of memory usage.

================================================ FILE: vi/configuration/index.html ================================================ Cấu hình · Project V Official

Cấu hình

V2Ray sử dụng cấu hình dựa trên protobuf. Vì định dạng protobuf ít có thể đọc được, V2Ray cũng hỗ trợ cấu hình trong JSON. Trước khi V2Ray chạy, nó sẽ tự động chuyển đổi cấu hình JSON thành protobuf. Điều đó đang được nói, các định dạng cấu hình khác có thể được giới thiệu trong furture.

Ở đây chúng tôi giới thiệu cấu hình dựa trên JSON.

JSON, hoặc Ký hiệu đối tượng JavaScript, viết tắt là các đối tượng trong Javascript. Một tệp JSON chứa một và chỉ một đối tượng JSON, bắt đầu bằng "{" và kết thúc bằng "}".

Một đối tượng JSON chứa một danh sách các cặp giá trị khóa. Khóa là một chuỗi và giá trị có thể khác nhau về các loại, chẳng hạn như chuỗi, số, boolean, mảng hoặc đối tượng khác. Một đối tượng điển hình như sau:

{
  "stringValue": "This is a string.",
  "numberValue": 42,
  "boolValue": true,
  "arrayValue": ["this", "is", "a", "string", "array"],
  "objectValue": {
    "another": "object"
  }
}

V2Ray hỗ trợ các chú thích trong JSON , được chú thích bởi "//" hoặc "/ \ \ /". Trong trình chỉnh sửa không hỗ trợ nhận xét, chúng có thể được hiển thị dưới dạng lỗi, nhưng nhận xét thực sự hoạt động tốt trong V2Ray.

Các kiểu dữ liệu JSON

Đây là một giới thiệu ngắn gọn về các kiểu dữ liệu JSON. Chúng sẽ được tham chiếu trong phần còn lại của tài liệu.

boolean: true | false

Giá trị logic, phải là true hoặc false, không có dấu ngoặc kép.

con số

Thông thường các số nguyên không âm, không có dấu ngoặc kép.

chuỗi

Chuỗi ký tự, được bao quanh bởi dấu ngoặc kép.

array: []

Mảng các yếu tố. Loại phần tử của nó thường giống nhau, ví dụ, [string] là một mảng gồm chuỗis.

object: {}

Vật. Nó đi kèm với một danh sách các cặp giá trị quan trọng.

Cặp giá trị khóa thường kết thúc bằng dấu phẩy ",", nhưng không được kết thúc bằng dấu phẩy nếu đó là phần tử cuối cùng của đối tượng.

Các kiểu dữ liệu chung V2Ray

map: object {string, string}

Một đối tượng có khóa và giá trị có các loại cố định.

address: string

Địa chỉ IP hoặc tên miền ở dạng chuỗi, chẳng hạn như "8.8.8.8" hoặc "www.v2ray.com"

address_port: string

Một địa chỉ với cổng, chẳng hạn như "8.8.8.8:53" hoặc "www.v2ray.com:80". Trong một số tập quán, phần địa chỉ có thể được bỏ qua, như ": 443".

================================================ FILE: vi/configuration/mux.html ================================================ Mux · Project V Official

Ghép kênh

Ghép kênh, hoặc Mux, là sử dụng một kết nối TCP vật lý cho nhiều kết nối TCP ảo.

Mux được thiết kế để giảm độ trễ bắt tay TCP. Nó KHÔNG phải cho thông lượng cao. Khi được sử dụng để tải xuống các tệp lớn hoặc đo tốc độ, Mux thường chậm hơn kết nối TCP thông thường.

MuxObject

{
  "enabled": false,
  "concurrency": 8
}

enabled: true | false

Có hay không kích hoạt Mux trên đường đi.

concurrency: number

Số lượng kết nối ghép kênh tối đa mà một kết nối vật lý có thể xử lý tại một thời điểm. Giá trị lớn nhất 1024, giá trị nhỏ nhất 1, mặc định 8.

================================================ FILE: vi/configuration/overview.html ================================================ Tổng quan · Project V Official

Tổng quan về cấu hình

V2Ray chia sẻ cùng một cấu trúc cấu hình giữa phía máy chủ và phía máy khách được hiển thị như bên dưới. Cấu hình máy chủ và máy khách khác nhau trong các phần cụ thể.

Dưới đây là cấu trúc cấp cao nhất của cấu hình. Mỗi phần có định dạng riêng.

{
  "log": {},
  "api": {},
  "dns": {},
  "stats": {},
  "routing": {},
  "policy": {},
  "inbounds": [],
  "outbounds": [],
  "transport": {}
}

log: LogObject

Đăng nhập cấu hình để kiểm soát đầu ra nhật ký.

api: ApiObject

API RPC để điều khiển phiên bản V2Ray. Xem cấu hình API để biết chi tiết.

dns: DnsObject

Cấu hình cho cấu hình máy chủ DNS nội bộ. Nếu phần này bị bỏ qua, V2Ray sẽ sử dụng cấu hình DNS toàn hệ thống của bạn. Để biết chi tiết, xem Cấu hình DNS.

stats: StatsObject

Khi được chỉ định, nội bộ Thống kê được bật.

policy: PolicyObject

Cấu hình cho quyền và các chiến lược bảo mật khác. Để biết chi tiết, xem Chính sách địa phương.

routing: RoutingObject

Cấu hình cho nội bộ Định tuyến chiến lược.

inbounds: [ InboundObject ]

Một mảng InboundObject làm cấu hình cho proxy gửi đến.

outbounds: [ OutboundObject ]

Một mảng OutboundObject làm cấu hình cho các proxy gửi đi. Chuyến đi đầu tiên trong mảng là mảng chính. Đây là định tuyến mặc định trong định tuyến định tuyến.

transport: TransportObject

Cấu hình giao thức vận tải cấp thấp. Để biết chi tiết, xem Giao thức Tùy chọn Giao vận.

LogObject

{
  "access": "/path/to/file",
  "error": "/path/to/file",
  "loglevel": "warning"
}

access: string

Đường dẫn để truy cập nhật ký. Nếu không trống, nó phải là một đường dẫn tập tin hợp pháp, chẳng hạn như "/tmp/v2ray/_access.log"(Linux) hoặc "C: \\ Temp \\ v2ray \\ _ access.log"(Windows ). Nếu trống, V2Ray ghi nhật ký truy cập vào stdout.

error: string

Đường dẫn đến nhật ký lỗi. Nếu không trống, nó phải là một đường dẫn tập tin hợp pháp. Nếu trống, V2Ray ghi nhật ký lỗi tới stdout.

loglevel: "debug" | "info" | "warning" | "error" | "none"

Mức nhật ký được ghi. Các cấp nhật ký khác nhau cho biết nội dung nhật ký khác nhau. Giá trị mặc định là "cảnh báo".

Mức nhật ký:

  • "debug": Thông tin dành cho nhà phát triển. Cũng bao gồm tất cả "thông tin" bản ghi.
  • "thông tin": Thông tin về trạng thái hiện tại của V2Ray. Người dùng không phải chăm sóc những người đó. Cũng bao gồm tất cả "cảnh báo" bản ghi.
  • "cảnh báo": Đã xảy ra sự cố với môi trường, thường nằm ngoài V2Ray, ví dụ: mạng bị vỡ. V2Ray vẫn chạy nhưng người dùng có thể gặp phải một số sự cố. Cũng bao gồm tất cả "lỗi" bản ghi.
  • "lỗi": Đã xảy ra sự cố nghiêm trọng, V2Ray không thể chạy được.
  • "none": Tất cả ghi nhật ký đều bị tắt.

InboundObject

Một InboundObject định nghĩa một proxy gửi đến. Nó xử lý các kết nối đến V2Ray. Proxy có sẵn được liệt kê ở đây.

{
  "port": 1080,
  "listen": "127.0.0.1",
  "protocol": "protocol_name",
  "settings": {},
  "streamSettings": {},
  "tag": "inbound_tag_name",
  "sniffing": {
    "enabled": false,
    "destOverride": ["http", "tls"]
  },
  "allocate": {
    "strategy": "always",
    "refresh": 5,
    "concurrency": 3
  },
}

port: number | "env:variable" | string

Cổng mà proxy đang nghe. Các định dạng có thể chấp nhận là:

  • Số nguyên: số cổng thực tế.
  • Biến môi trường: Bắt đầu bằng "env:", biến env chỉ định cổng ở định dạng chuỗi, chẳng hạn như "env: PORT". V2Ray sẽ giải mã biến thành chuỗi.
  • Chuỗi: Giá trị chuỗi số, chẳng hạn như "1234"hoặc một loạt các cổng, chẳng hạn như "5-10" cho tổng số 6 cổng.

Các cổng thực tế để mở cũng phụ thuộc vào phân bổ thiết lập. Xem bên dưới.

listen: address

Địa chỉ cần nghe. Giá trị mặc định là "0.0.0.0" cho các kết nối đến trên tất cả các giao diện mạng. Nếu không, giá trị phải là địa chỉ của giao diện mạng hiện có.

protocol: string

Tên của giao thức gửi đến. Xem từng cá nhân để biết các giá trị có sẵn.

settings: InboundConfigurationObject

Cài đặt giao thức cụ thể. Xem InboundConfigurationObject được định nghĩa trong mỗi giao thức.

streamSettings: [StreamSettingsObject]

Xem Giao thức Giao thức Tùy chọn để biết chi tiết.

tag: string

Thẻ của proxy đến. Nó có thể được sử dụng cho các quyết định định tuyến. Nếu không trống, nó phải là duy nhất trong số tất cả các proxy gửi đến.

sniffing: SniffingObject

Cấu hình cho nội dung đánh hơi.

allocate: AllocateObject

Cấu hình cho cổng phân bổ.

SniffingObject

{
  "enabled": false,
  "destOverride": ["http", "tls"]
}

enabled: true | false

Có hay không kích hoạt nội dung đánh hơi.

destOverride: ["http" | "tls"]

Một loại nội dung. Nếu loại nội dung của lưu lượng truy cập đến được chỉ định trong danh sách, đích của kết nối sẽ bị ghi đè bởi giá trị bị đánh hơi.

AllocateObject

{
  "strategy": "always",
  "refresh": 5,
  "concurrency": 3
}

strategy: "always" | "random"

Chiến lược phân bổ cảng. Khi nó được đặt thành "luôn luôn", tất cả cổng trong trường cổng sẽ được cấp phát để nghe. Nếu "ngẫu nhiên" được thiết lập, V2Ray sẽ nghe số đồng thời cổng và danh sách các cổng được giới thiệu sau mỗi làm mới phút.

refresh: number

Số phút để làm mới các cổng nghe. Giá trị nhỏ nhất là 2. Cài đặt này chỉ hiệu quả khi chiến lược được đặt thành "ngẫu nhiên".

concurrency: number

Số cổng để nghe. Giá trị nhỏ nhất là 1. Giá trị tối đa là một phần ba toàn bộ phạm vi cổng.

OutboundObject

An OutboundObject định nghĩa proxy gửi đi để xử lý các kết nối đang diễn ra. Các giao thức có sẵn được liệt kê tại đây.

{
  "sendThrough": "0.0.0.0",
  "protocol": "protocol_name",
  "settings": {},
  "tag": "this_outbound_tag_name",
  "streamSettings": {},
  "proxySettings": {
    "tag": "another_outbound_tag_name"
  },
  "mux": {}
}

sendThrough: address

Địa chỉ IP để gửi lưu lượng truy cập. Giá trị mặc định, "0.0.0.0" là để chọn ngẫu nhiên một IP có sẵn trên máy chủ. Nếu không, giá trị phải là một địa chỉ IP từ các giao diện mạng hiện có.

protocol: string

Tên giao thức của outbound này. Xem Giao thức cho tất cả các giá trị có sẵn.

settings: OutboundConfigurationObject

Cài đặt giao thức cụ thể. Xem OutboundConfigurationObject trong mỗi giao thức riêng lẻ.

tag: string

Thẻ của lối ra này. Nếu không trống, nó phải là duy nhất trong số tất cả các giới hạn.

streamSettings: StreamSettingsObject

Cài đặt vận chuyển ở mức độ thấp. Xem Giao thức Giao thức Tùy chọn.

proxySettings: ProxySettingsObject

Cấu hình cho ủy quyền lưu lượng truy cập từ này đi khác. Khi điều này được thiết lập, streamSettings của outbound này sẽ không có hiệu lực.

mux: MuxObject

Xem cấu hình Mux để biết chi tiết.

ProxySettingsObject

{
  "tag": "another-outbound-tag"
}

tag: string

Khi thẻ được đặt thành thẻ của một kênh khác, lưu lượng truy cập ra ngoài hiện tại sẽ được chuyển đến thẻ được chỉ định.

================================================ FILE: vi/configuration/policy.html ================================================ Chính sách · Project V Official

Chính sách địa phương

Chính sách cục bộ quản lý cài đặt chính sách của phiên bản V2Ray hiện tại, chẳng hạn như thời gian chờ kết nối. Các policys có thể được áp dụng cho mỗi cấp độ người dùng, hoặc toàn bộ hệ thống.

PolicyObject

PolicyObject được sử dụng làm trường chính sách trong cấu hình cấp cao nhất.

{
  "levels": {
    "0": {
      "handshake": 4,
      "connIdle": 300,
      "uplinkOnly": 2,
      "downlinkOnly": 5,
      "statsUserUplink": false,
      "statsUserDownlink": false
    }
  },
  "system": {
    "statsInboundUplink": false,
    "statsInboundDownlink": false
  }
}

level: map{string: LevelPolicyObject}

Một danh sách các cặp giá trị khóa. Mỗi khóa là một chuỗi số nguyên (bị giới hạn bởi JSON), chẳng hạn như "0", "1", v.v. Giá trị số cho một cấp độ người dùng nhất định.

Mức người dùng có thể được đặt trên mỗi proxy gửi đến và đi. V2Ray sẽ áp dụng các chính sách khác nhau dựa trên cấp độ người dùng.

system: SystemPolicyObject

Chính sách toàn hệ thống

LevelPolicyObject

{
  "handshake": 4,
  "connIdle": 300,
  "uplinkOnly": 2,
  "downlinkOnly": 5,
  "statsUserUplink": false,
  "statsUserDownlink": false,
  "bufferSize": 10240
}

handshake: number

Thời gian chờ để thiết lập kết nối, tính bằng giây. Giá trị mặc định 4. Ở giai đoạn bắt tay của một proxy gửi đến đối phó với một kết nối mới, hãy nói tiêu đề yêu cầu đọc VMess, nếu nó mất nhiều hơn bắt tay lần, V2Ray sẽ hủy kết nối.

connIdle: number

Hết thời gian chờ kết nối không hoạt động, tính bằng giây. Giá trị mặc định 300. Nếu không có dữ liệu nào được truyền qua kết nối trong connIdle , V2Ray sẽ hủy kết nối.

uplinkOnly: number

Thời gian để giữ các kết nối mở sau khi đường lên của kết nối được đóng lại, tính bằng giây. Giá trị mặc định 2. Sau khi remote (server) đóng đường xuống của kết nối, V2Ray sẽ hủy kết nối sau uplinkOnly lần.

downlinkOnly: number

Thời gian để giữ các kết nối mở sau khi đường xuống của kết nối bị đóng, tính bằng giây. Giá trị mặc định 5. Sau khi máy khách (trình duyệt) đóng đường lên của kết nối, V2Ray hủy bỏ kết nối sau downlinkChỉ lần.

Trong một kịch bản trình duyệt trang web đơn giản, nó là an toàn để thiết lập uplinkOnlydownlinkOnly cả đến 0, cho hiệu suất tốt hơn.

statsUserUplink: true | false

Khi được đặt thành true, V2Ray cho phép bộ đếm stat để lưu lượng truy cập đường lên cho tất cả người dùng ở cấp này.

statsUserDownlink: true | false

Khi được đặt thành true, V2Ray cho phép bộ đếm stat truy cập đường xuống cho tất cả người dùng ở cấp này.

bufferSize: number

Kích thước của bộ đệm trong mỗi kết nối, tính bằng kilo-byte. Giá trị mặc định là 10240. Khi nó được đặt thành 0, bộ đệm bên trong bị tắt.

Default value (V2Ray 4.4+):

  • 0 on ARM, MIPS and MIPSLE.
  • 4 on ARM64, MIPS64 and MIPS64LE.
  • 512 on other platforms.

Default value (V2Ray 4.3-):

  • 16 on ARM, ARM64, MIPS, MIPS64, MIPSLE and MIPS64LE.
  • 2048 on other platforms.

bufferSize overrides v2ray.ray.buffer.size settings in env variables.

SystemPolicyObject

{
  "statsInboundUplink": false,
  "statsInboundDownlink": false
}

statsInboundUplink: true | false

When set to true, V2Ray enables stat counter for all uplink traffic in all inbound proxies.

statsInboundDownlink: true | false

When set to true, V2Ray enables stat counter for all downlink traffic in all inbound proxies.

================================================ FILE: vi/configuration/protocols/blackhole.html ================================================ Blackhole · Project V Official

Blackhole

  • Tên: blackhole
  • Loại: Đi

Blackhole là một giao thức cho các kết nối gửi đi. Nó chặn tất cả các kết nối với các câu trả lời được xác định trước. Kết hợp với Định tuyến, điều này có thể được sử dụng để chặn truy cập vào một số trang web.

ConfigurationObject

{
  "response": {
    "type": "none"
  }
}

response: ResponseObject

Phản hồi được xác định trước. Blockhole sẽ gửi (nếu có) dữ liệu được xác định trước ngay lập tức cho bất kỳ kết nối nào được truyền tới nó và đóng kết nối.

ResponseObject

{
  "type": "none"
}

type: "none" | "http"

Loại phản hồi, các tùy chọn có sẵn là:

  • "none": Giá trị mặc định. Phản hồi trống.
  • "http": Đáp ứng HTTP 403 hợp lệ.
================================================ FILE: vi/configuration/protocols/dns.html ================================================ DNS · Project V Official

DNS

  • Name: dns
  • Type: Outbound

DNS is an outbound proxy. It is mainly used for intercept and proxy DNS queries and responses. This outbound proxy can only accept DNS traffic, including both TCP and UDP based DNS queries. Other type of traffic will result in errors.

When proxying DNS queries, DNS outbound will redirect IP queries (A and AAAA) to internal DNS server. It will send other type of queries directly to its original destination.

DNS outbound proxy is introduced in V2Ray 4.15.

OutboundConfigurationObject

{
    "network": "tcp",
    "address": "1.1.1.1",
    "port": 53
}

network: "tcp" | "udp"

(V2Ray 4.16+) Modify the transport protocol of the DNS traffic. The value may be either "tcp" or "udp". If it is not specified, the original protocol remains unchanged.

address: address

(V2Ray 4.16+) Modify the DNS server address in the request. If it is not specified, the original DNS server address remain unchanged.

port: number

(V2Ray 4.16+) Modify the DNS server port in the request. If it is not specified, the original DNS server port remain unchanged.

================================================ FILE: vi/configuration/protocols/dokodemo.html ================================================ Dokodemo · Project V Official

refcn: chapter_02/protocols/dokodemo refen: configuration/protocols/dokodemo


Dokodemo-door

  • Tên: dokodemo-cửa
  • Loại: Inbound

Cửa Dokodemo là giao thức cho các kết nối gửi đến. Nó lấy bất kỳ kết nối nào và chuyển chúng đến đích đã chỉ định.

Cửa Dokodemo cũng có thể (nếu được cấu hình) hoạt động như một proxy trong suốt.

ConfigurationObject

{
  "address": "8.8.8.8",
  "port": 53,
  "network": "tcp",
  "followRedirect": false,
  "userLevel": 0
}

address: address

Địa chỉ của máy chủ đích. Có thể là IPv4, IPv6 hoặc tên miền, dưới dạng chuỗi. Khi followRedirect (xem bên dưới) là true, address có thể rỗng.

port: number

Cổng của máy chủ đích.

network: "tcp" | "udp" | "tcp,udp"

Loại mạng được chấp nhận. Nếu "tcp" được chỉ định, tất cả lưu lượng UDP được gửi tới cửa sổ dokodemo này sẽ bị hủy.

followRedirect: true | false

Khi đặt thành true, dokodemo-door sẽ nhận ra đích từ TProxy và sử dụng nó làm đích đến của nó. Xem TProxy trong phương tiện giao thông để xem chi tiết.

userLevel: number

Cấp người dùng. Tất cả các kết nối đều chia sẻ cấp độ này. Xem Chính sách để biết chi tiết.

Ví dụ về proxy trong suốt

Thêm một cửa dokodemo vào trong như dưới đây.

{
  "network": "tcp,udp",
  "timeout": 30,
  "followRedirect": true
}

Cấu hình iptables như dưới đây.

# Tạo chuỗi mới
iptables -t nat -N V2RAY
iptables -t mangle -N V2RAY
iptables -t mangle -N V2RAY_MARK

# Bỏ qua địa chỉ máy chủ V2Ray của bạn
# Nó rất QUAN TRỌNG, hãy cẩn thận.
iptables -t nat -A V2RAY -d 123.123.123.123 -j TRỞ LẠI

# Bỏ qua mạng LAN và bất kỳ địa chỉ nào khác mà bạn muốn bỏ qua proxy
# Xem Wikipedia và RFC5735 để có danh sách đầy đủ các mạng được bảo lưu.
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j TRỞ LẠI
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j TRỞ LẠI
iptables -t nat -A V2RAY-127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY-169.254.0.0/16 -j TRỞ LẠI
iptables -t nat -A V2RAY-172.16.0.0/12 -j TRỞ LẠI
iptables -t nat -A V2RAY-192.168 .0.0 / 16 -j RETURN
iptables -t nat -A V2RAY-224.0.0.0/4 -j TRẢ LẠI
iptables -t nat -A V2RAY-240.0.0.0/4 -j TRẢ LẠI

# Mọi thứ khác cần được chuyển hướng đến cổng địa phương của cửa Dokodemo
iptables -t nat -A V2RAY -p tcp -j ĐỔI MỚI - sang-cổng 12345

# Thêm bất kỳ quy tắc UDP nào
tuyến IP thêm địa chỉ mặc định dev lo table 100
ip rule add fwmark 1 tra cứu 100
iptables -t mangle -A V2RAY -p udp --dữ 53 -j TPROXY --on-port 12345 --tinxy-mark 0x01 / 0x01
iptables -t mangle -A V2RAY_MARK -p udp --dẫn 53 -j MARK --set-mark 1

# Áp dụng các quy tắc
iptables -t nat -Một OUTPUT -p tcp -j V2RAY
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -A OUTPUT -j V2RAY_MARK
================================================ FILE: vi/configuration/protocols/freedom.html ================================================ Freedom · Project V Official

Freedom

  • Tên: tự do
  • Loại: Đi

Tự do là một giao thức cho các kết nối gửi đi. Nó chuyển tất cả kết nối TCP hoặc UDP đến đích của họ. Điều này gửi đi được sử dụng khi bạn muốn gửi lưu lượng truy cập đến đích thực của nó.

ConfigurationObject

{
  "domainStrategy": "AsIs",
  "redirect": "127.0.0.1:3366",
  "userLevel": 0
}

domainStrategy: "AsIs" | "UseIP"

Chiến lược phân giải tên miền. Các tùy chọn là:

  • "AsIs": Giá trị mặc định. Giải quyết tên miền theo hệ thống.
  • "UseIP": Sử dụng DNS nội bộ cho độ phân giải tên miền.
  • "UseIPv4": Use IPv4 address only, after resolved by internal DNS.
  • "UseIPv6": Use IPv6 address only, after resolved by internal DNS.

(V2Ray 4.6+) In UseIP mode, when sendThrough is specified in OutboundObject, Freedom will automatically choose between IPv4 and IPv6 address for destination based on sendThrough settings.

(V2Ray 4.7+) If sendThrough address conflicts with "UseIPv4" or "UseIPv6", Freedom will fail to dial out-going connections.

redirect: address_port

Redirect all connections to this address, in form like "127.0.0.1:80" or ":1234".

  • Khi địa chỉ trống, ví dụ: ": 443", Tự do sẽ sử dụng địa chỉ đích ban đầu.
  • Khi cổng là 0, ví dụ "v2ray.com:0", Tự do sẽ sử dụng cổng gốc.

userLevel: number

User level. All connections share this level.

================================================ FILE: vi/configuration/protocols/http.html ================================================ HTTP · Project V Official

HTTP

  • Tên: http
  • Loại: Inbound

HTTP là giao thức cho các kết nối gửi đến. Nó tương thích với HTTP / 1.1.

InboundConfigurationObject

{
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "allowTransparent": false,
  "userLevel": 0
}

accounts: [AccountObject]

Một mảng trong đó mỗi mục là một tài khoản. Nó được để trống theo mặc định. Nếu không trống, Xác thực HTTP cơ bản là bắt buộc đối với các yêu cầu gửi đến.

allowTransparent: true | false

Nếu được đặt thành true, tất cả yêu cầu HTTP được gửi đến thư đến này sẽ được proxy, bao gồm cả yêu cầu không phải proxy.

userLevel: number

Cấp người dùng. Tất cả các kết nối đều chia sẻ cấp độ này.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Tên người dùng để xác thực HTTP.

pass: string

mật khẩu để xác thực HTTP.

Sử dụng các cài đặt sau trong Linux để sử dụng proxy HTTP trong phiên hiện tại.

  • xuất khẩu http_proxy = http: //127.0.0.1: 8080/ (URL có thể thay đổi theo cấu hình của bạn)
  • xuất https_proxy =$http_proxy

================================================ FILE: vi/configuration/protocols/mtproto.html ================================================ MTProto · Project V Official

MTProto

  • Tên: mtproto
  • Loại: Inbound / Outbound

Proxy MTProto là một procol đặc biệt cho Telegram. Nó bao gồm một cặp proxy gửi đến và outboud trong V2Ray. Chúng thường được sử dụng cùng nhau để xây dựng một proxy cho Telegram

Hiện tại V2Ray chỉ hỗ trợ địa chỉ IPv4 của máy chủ Telegram.

InboundConfigurationObject

{
  "users": [{
    "email": "love@v2ray.com",
    "level": 0,
    "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
  }]
}

users: [UserObject]

Một mảng người dùng. Hiện tại chỉ người dùng đầu tiên mới có hiệu quả.

UserObject

{
  "email": "love@v2ray.com",
  "level": 0,
  "secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}

email: string

Email người dùng. Được sử dụng cho mục đích theo dõi. Xem Thống kê.

level: number

Cấp người dùng.

secret: string

Bí mật của người dùng. Trong Telegram, sử dụng bí mật phải dài 32 ký tự, và chỉ chứa các ký tự giữa 0 để 9, và mộtđể f.

Bạn có thể sử dụng lệnh sau để tạo bí mật MTProto: openssl rand -hex 16

Cấu hình đi

{
}

Mẫu vật

MTProto chỉ có thể được sử dụng cho giao thông Telegram. Bạn có thể cần một quy tắc định tuyến để kết hợp tương ứng trong và ngoài. Đây là một mẫu không đầy đủ.

Trong nước:

{
  "tag": "tg-in",
  "port": 443,
  "protocol": "mtproto",
  "settings": {
    "users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
  }
}

Outbound:

{
  "tag": "tg-out",
  "protocol": "mtproto",
  "settings": {}
}

Định tuyến:

{
  "type": "field",
  "inboundTag": ["tg-in"],
  "outboundTag": "tg-out"
}

Định cấu hình ứng dụng Telegram của bạn để kết nối với cổng 443 trên máy này.

================================================ FILE: vi/configuration/protocols/shadowsocks.html ================================================ Shadowsocks · Project V Official

Shadowsocks

  • Tên: bóng
  • Loại: Inbound / Outbound

Giao thức Shadowsocks , cho cả kết nối trong và ngoài.

Khả năng tương thích với phiên bản chính thức:

  • Hỗ trợ cả kết nối TCP và UDP, trong đó UDP có thể được tắt tùy chọn.
  • Hỗ trợ OTA
    • Khách hàng có thể chọn bật hoặc tắt.
    • Máy chủ có thể chọn bật, tắt hoặc tự động.
  • Phương thức mã hóa (AEAD mật mã được thêm vào trong V2Ray 3.0):
    • aes-256-cfb
    • aes-128-cfb
    • chacha20
    • chacha20-ietf
    • aes-256-gcm
    • aes-128-gcm
    • chacha20-poly1305 aka chacha20-ietf-poly1305
  • Bổ sung:
    • Hỗ trợ obfs thông qua chế độ độc lập.

InboundConfigurationObject

{
  "email": "love@v2ray.com",
  "method": "aes-128-cfb",
  "password": "password",
  "level": 0,
  "ota": true,
  "network": "tcp"
}

email: string

Địa chỉ email. Được sử dụng để nhận dạng người dùng.

method: string

Cần thiết. Xem Phương thức mã hóa để biết các giá trị có sẵn.

password: string

Cần thiết. Mật khẩu trong giao thức Shadowsocks. Có thể là bất kỳ chuỗi nào.

level: number

Cấp người dùng. Mặc định là 0. Xem Chính sách.

ota: true | false

Có hay không ép buộc OTA. Nếu true và kết nối đến không bật OTA, V2Ray sẽ từ chối kết nối này. Ngược lại.

Nếu trường này không được chỉ định, V2Ray sẽ tự động phát hiện cài đặt OTA từ các kết nối đến.

Khi mã hóa AEAD được sử dụng, ota không có hiệu lực.

network: "tcp" | "udp" | "tcp,udp"

Loại mạng được hỗ trợ. Mặc định là "tcp".

OutboundConfigurationObject

{
  "servers": [
    {
      "email": "love@v2ray.com",
      "address": "127.0.0.1",
      "port": 1234,
      "method": "method",
      "password": "password",
      "ota": false,
      "level": 0
    }
  ]
}

Ở đâu:

  • email: Địa chỉ email. Được sử dụng để nhận dạng người dùng.
  • địa chỉ: Địa chỉ của máy chủ Shadowsocks. Có thể là IPv4, IPv6 hoặc tên miền.
  • cổng: Cổng của máy chủ Shadowsocks.
  • phương pháp: Phương thức mã hóa. Không có giá trị mặc định. Các tùy chọn là:
    • "aes-256-cfb"
    • "aes-128-cfb"
    • "chacha20"
    • "chacha20-ietf"
    • "aes-256-gcm"
    • "aes-128-gcm"
    • "chacha20-poly1305" hoặc "chacha20-ietf-poly1305"
  • mật khẩu: Mật khẩu. Có thể là bất kỳ chuỗi nào.
  • ota: Có hay không sử dụng OTA.
    • Khi sử dụng AEAD, ota không có hiệu lực.
  • cấp độ: Cấp độ người dùng.

servers: [ServerObject]

Một mảng ServerObjects.

ServerObject

{
  "email": "love@v2ray.com",
  "address": "127.0.0.1",
  "port": 1234,
  "method": "加密方式",
  "password": "密码",
  "ota": false,
  "level": 0
}

email: string

Địa chỉ email. Được sử dụng để nhận dạng người dùng.

address: address

Cần thiết. Địa chỉ máy chủ Shadowsocks. Có thể là IPv4, IPv6 hoặc địa chỉ miền.

port: number

Cần thiết. Cổng máy chủ Shadowsocks.

method: string

Cần thiết. Xem Phương thức mã hóa để biết các giá trị có sẵn.

password: string

Cần thiết. Mật khẩu trong giao thức Shadowsocks. Có thể là bất kỳ chuỗi nào.

ota: true | false

Có hay không sử dụng OTA. Giá trị mặc định là false.

Khi sử dụng mã hóa AEAD, trường này không có hiệu lực.

level: number

Cấp người dùng.

Phương thức mã hóa

  • "aes-256-cfb"
  • "aes-128-cfb"
  • "chacha20"
  • "chacha20-ietf"
  • "aes-256-gcm"
  • "aes-128-gcm"
  • "chacha20-poly1305" hoặc "chacha20-ietf-poly1305"
================================================ FILE: vi/configuration/protocols/socks.html ================================================ SOCKS · Project V Official

Socks

  • Tên: vớ
  • Loại: Inbound / Outbound

Socks là một thực hiện giao thức SOCKS chuẩn, tương thích với Socks 4, Socks 4a và Socks 5.

Cấu hình Socks bao gồm hai phần, InboundConfigurationObjectOutboundConfigurationObject, cho tương ứng trong và ngoài.

OutboundConfigurationObject

OutboundConfigurationObject được sử dụng làm trường cài đặt trong OutboundObject trong cấu hình mức cao nhất.

{
  "servers": [{
    "address": "127.0.0.1",
    "port": 1234,
    "users": [
      {
        "user": "test user",
        "pass": "test pass",
        "level": 0
      }
    ]
  }]
}

servers: [ ServerObject ]

Một loạt các máy chủ Socks.

ServerObject

{
  "address": "127.0.0.1",
  "port": 1234,
  "users": [
    {
      "user": "test user",
      "pass": "test pass",
      "level": 0
    }
  ]
}

address: address

Vớ địa chỉ máy chủ. Có thể là IPv4, IPv6 hoặc địa chỉ miền.

Chỉ hỗ trợ Socks 5 servers.

port: number

Vớ cổng máy chủ.

users: [ UserObject ]

Một mảng người dùng. Mỗi phần tử trong mảng là một người dùng. Nếu danh sách không trống. Socks inbound sẽ buộc người dùng xác thực. Nếu không, người dùng ẩn danh được cho phép.

UserObject

{
  "user": "test user",
  "pass": "test pass",
  "level": 0
}

user: string

Tên người dùng như trong giao thức Socks

pass: string

Mật khẩu như trong giao thức Socks

level: number

Cấp người dùng cho mục đích theo dõi và chính sách. Giá trị mặc định là 0.

InboundConfigurationObject

{
  "auth": "noauth",
  "accounts": [
    {
      "user": "my-username",
      "pass": "my-password"
    }
  ],
  "udp": false,
  "ip": "127.0.0.1",
  "userLevel": 0
}

auth: "noauth" | "password"

Vớ phương pháp xác thực. "noauth" dành cho xác thực ẩn danh và "mật khẩu" để xác thực bằng tên người dùng và mật khẩu. Giá trị mặc định là "noauth".

accounts: [ AccountObject ]

Một loạt tài khoản người dùng, cho mục đích tự động. Chỉ có hiệu lực khi auth được đặt thành "password".

udp: true | false

Có hay không kích hoạt UDP. Giá trị mặc định là false.

ip: address

Khi UDP được bật, V2Ray cần biết địa chỉ IP của máy chủ hiện tại. Giá trị mặc định là "127.0.0.1". Điều này phải được đặt thành địa chỉ IP công khai của máy chủ lưu trữ, nếu bạn muốn cho phép lưu lượng truy cập UDP công khai.

userLevel: number

Cấp người dùng. Tất cả các kết nối đến đều chia sẻ cấp độ người dùng này.

AccountObject

{
  "user": "my-username",
  "pass": "my-password"
}

user: string

Tên người dùng như trong giao thức Socks

pass: string

Mật khẩu như trong giao thức Socks

================================================ FILE: vi/configuration/protocols/vmess.html ================================================ VMess · Project V Official

VMess

  • Tên: vmess
  • Loại: Inbound / Outbound

VMess là một giao thức cho truyền thông được mã hóa. Nó bao gồm cả proxy trong và ngoài.

VMess phụ thuộc vào thời gian hệ thống. Hãy đảm bảo rằng thời gian hệ thống của bạn được đồng bộ với thời gian UTC. Múi giờ không quan trọng. Người ta có thể cài đặt dịch vụ ntp trên Linux để tự động điều chỉnh thời gian hệ thống.

OutboundConfigurationObject

{
  "vnext": [
    {
      "address": "127.0.0.1",
      "port": 37192,
      "users": [
        {
          "id": "27848739-7e62-4138-9fd3-098a63964b6b",
          "alterId": 4,
          "security": "auto",
          "level": 0
        }
      ]
    }
  ]
}

vnext: [ ServerObject ]

Một mảng, trong đó mỗi phần tử trình bày một máy chủ từ xa

ServerObject

{
  "address": "127.0.0.1",
  "port": 37192,
  "users": []
}

address: address

Địa chỉ máy chủ, có thể là IPv4, IPv6 hoặc tên miền.

port: number

Cổng máy chủ

users: [ UserObject ]

Một mảng trong đó mỗi phần tử là một người dùng VMess

UserObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "alterId": 16,
  "security": "auto",
  "level": 0
}

id: string

ID người dùng, ở dạng UUID.

alterId: number

Number of alternative IDs. The alternative IDs will be generated in a deterministic way. Default to 0. Maximum 65535. Recommend 4. Its value must be not larger than the one in corresponding Inbound.

level: number

Cấp người dùng. Xem Chính sách để biết thêm chi tiết.

security: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none"

Phương pháp mã hóa tải trọng. Cài đặt này chỉ khả dụng ở bên ngoài. VMess inbound sẽ tự động nhận ra thiết lập này và giải mã payload cho phù hợp. Các tùy chọn là:

  • "aes-128-gcm": Được khuyến nghị cho PC.
  • "chacha20-poly1305": Được đề xuất cho thiết bị di động.
  • "auto": Giá trị mặc định. Sử dụng aes-128-gcm trên AMD64, ARM64 và S390x hoặc chacha20-poly1305 nếu không.
  • "none": Giao thông không được mã hóa.

Sử dụng "auto" bất cứ nơi nào có thể để tương thích tốt hơn.

InboundConfigurationObject

{
  "clients": [
    {
      "id": "27848739-7e62-4138-9fd3-098a63964b6b",
      "level": 0,
      "alterId": 4,
      "email": "love@v2ray.com"
    }
  ],
  "default": {
    "level": 0,
    "alterId": 4
  },
  "detour": {
    "to": "tag_to_detour"
  },
  "disableInsecureEncryption": false
}

clients: [ ClientObject ]

Một mảng cho các tài khoản người dùng hợp lệ. Có thể trống khi được sử dụng cho tính năng cổng động.

detour: DetourObject

Tính năng tùy chọn để đề xuất khách hàng sử dụng đường vòng. Nếu được chỉ định, nội dung này sẽ hướng dẫn bên ngoài sử dụng một thư đến khác.

default: DefaultObject

Cấu hình máy khách mặc định tùy chọn. Thường được sử dụng với đường vòng.

disableInsecureEncryption: true | false

Ngăn cấm khách hàng sử dụng các phương thức mã hóa không an toàn. Khi được đặt thành true, các kết nối sẽ bị chấm dứt ngay lập tức nếu sử dụng mã hóa sau. Giá trị mặc định sai.

  • không ai
  • aes-128-cfb

ClientObject

{
  "id": "27848739-7e62-4138-9fd3-098a63964b6b",
  "level": 0,
  "alterId": 4,
  "email": "love@v2ray.com"
}

id: string

ID người dùng, ở dạng UUID.

level: number

Cấp người dùng. Xem Chính sách để biết cách sử dụng.

alterId: number

Số ID thay thế. Giống như trong Outbound.

email: string

Địa chỉ email để nhận dạng người dùng.

DetourObject

{
  "to": "tag_to_detour"
}

to: string

Thẻ của proxy đến. Xem Tổng quan. Nếu được cấu hình, VMess sẽ đề xuất ứng dụng khách của nó để sử dụng đường vòng cho các kết nối khác.

DefaultObject

{
  "level": 0,
  "alterId": 4
}

level: number

Cấp người dùng.

alterId: number

Number of alternative IDs. Default value 64. Recommend 4.

================================================ FILE: vi/configuration/protocols.html ================================================ Giao thức · Project V Official

Giao thức

V2Ray hỗ trợ các giao thức sau. Mỗi giao thức có thể là giao thức gửi đến hoặc giao thức gửi đi hoặc cả hai.

================================================ FILE: vi/configuration/reverse.html ================================================ Đảo ngược · Project V Official

Proxy ngược

Proxy ngược là một tính năng tùy chọn trong V2Ray. Nó chuyển hướng lưu lượng truy cập từ máy chủ đến máy khách. Vì vậy, được gọi là "Reverse" proxy.

Proxy ngược có sẵn trong V2Ray 4.0+. Nó hiện đang trong giai đoạn thử nghiệm và có thể được cải thiện trong tương lai gần.

Proxy ngược hoạt động theo cách sau:

  • Giả sử có một thiết bị A chạy một máy chủ web. Thiết bị A không có địa chỉ IP công khai và không thể truy cập được từ internet. Có một thiết bị B khác, nói một máy chủ đám mây, có thể truy cập từ internet. Chúng ta cần sử dụng B làm cổng thông tin, để chuyển hướng traffice sang A.
  • Bây giờ chúng tôi cài đặt V2Ray trên thiết bị A, có tên là bridge. Và sau đó cài đặt V2Ray trên thiết bị B, có tên là cổng.
  • cầu sẽ mở các kết nối tới cổng. Mục tiêu của họ có thể được tùy chỉnh cho mục đích định tuyến. cổng sẽ nhận các kết nối này, cũng như các kết nối từ các ứng dụng khác trên internet. cổng sẽ "kết nối" hai loại kết nối này. Sau đó, giao thông interent sẽ được tunneled cầu.
  • Sau khi cầu nhận lưu lượng truy cập từ internet thông qua cổng, nó sẽ gửi lưu lượng truy cập đến máy chủ web trên máy chủ cục bộ. Bạn cũng có thể định cấu hình định tuyến cho các lưu lượng truy cập này.
  • cầu sẽ kiểm soát cân bằng tải dựa trên lượng lưu lượng truy cập.

Proxy ngược đã tận dụng Mux. Nó không phải là cần thiết để cấu hình Mux một lần nữa trên đường đi của nó.

ReverseObject

ReverseObject được sử dụng làm ngược trong cấu hình mức cao nhất.

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }],
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"
  }]
}

bridges: [BridgeObject]

Một mảng cầus. Mỗi cầuBridgeObject.

portals: [PortalObject]

Một mảng cổngs. Mỗi cổng `` là PortalObject.

BridgeObject

{
  "tag": "bridge",
  "domain": "test.v2ray.com"
}

tag: string

Một thẻ. Tất cả lưu lượng khởi xướng của thành viên này cầu sẽ có thẻ này. Nó có thể được sử dụng cho định tuyến, được xác định là inboundTag.

domain: string

Tên miền. Tất cả các kết nối được khởi tạo bởi cầu hướng tới cổng sẽ sử dụng tên miền này làm mục tiêu. Tên miền này chỉ được sử dụng để liên lạc giữa cầucổng. Nó không phải là cần thiết để được thực sự đăng ký.

PortalObject

tag: string

Thẻ. Bạn cần phải chuyển hướng tất cả lưu lượng truy cập đến cổng thông tin này, bằng cách nhắm mục tiêu outboundTag đến thẻ này. Lưu lượng truy cập bao gồm các kết nối từ cầu, cũng như lưu lượng truy cập internet.

domain: string

Tên miền. Khi một kết nối nhắm mục tiêu tên miền này, cổng xem xét nó là một kết nối từ cầu, nếu không nó là một kết nối internet.

Giống như tập quán khác, một trường hợp V2Ray có thể được sử dụng như một cầuhoặc cổng, hoặc cả hai như cùng một lúc.

Cấu hình ví dụ

cầu thường cần hai outbounds. Một để kết nối cổngvà một cho kết nối máy chủ web cục bộ.

Đảo ngược:

{
  "bridges": [{
    "tag": "bridge",
    "domain": "test.v2ray.com"
  }]
}

Outbound:

{
  "tag": "out"
  "protocol": "freedom",
  "settings": {
    "redirect": "127.0.0.1:80" // Send traffic to local web server
  }
},
{
  "protocol": "vmess",
  "settings": {
    "vnext": [{
      "address": "portal的IP地址",
      "port": 1024,
      "users": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
    }]
  },
  "tag": "interconn"
}

Định tuyến:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["bridge"],
    "domain": ["full:test.v2ray.com"],
    "outboundTag": "interconn"
  },{
    "type": "field",
    "inboundTag": ["bridge"],
    "outboundTag": "out"
  }]
}

cổng thông tin thường cần hai giới hạn. Một cho các kết nối từ cầuvà một cho kết nối internet.

Đảo ngược:

{
  "portals": [{
    "tag": "portal",
    "domain": "test.v2ray.com"  // Must be the same as in bridge
  }]
}

Trong nước:

{
  "tag": "external",
  "port": 80,  // Open port 80 for internet HTTP traffic
  "protocol": "dokodemo-door",
  "settings": {
    "address": "127.0.0.1",
    "port": 80,
    "network": "tcp"
  }
},
{
  "port": 1024, // For bridge connections
  "tag": "interconn",
  "protocol": "vmess",
  "settings": {
    "clients": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
  }
}

Định tuyến:

"routing": {
  "rules": [{
    "type": "field",
    "inboundTag": ["external"],
    "outboundTag": "portal"
  },{
    "type": "field",
    "inboundTag": ["interconn"],
    "outboundTag": "portal"
  }]
}

Trong thực tế, bạn có thể muốn chạy cầu đầu tiên và sau đó là cổng.

================================================ FILE: vi/configuration/routing.html ================================================ định tuyến · Project V Official

định tuyến

V2Ray có cơ chế định tuyến nội bộ. Nó định tuyến các kết nối gửi đến nhiều hướng đi khác nhau dựa trên các quy tắc. Một tình huống phổ biến là chia lưu lượng truy cập theo quốc gia. V2Ray có thể phát hiện quốc gia mục tiêu (theo địa lý IP) của một kết nối và sau đó gửi kết nối tới proxy đi tương ứng.

RoutingObject

RoutingObject is used as routing in top level configuration.

{
  "domainStrategy": "AsIs",
  "rules": [],
  "balancers": []
}

domainStrategy: "AsIs" | "IPIfNonMatch" | "IPOnDemand"

Chiến lược phân giải miền. Lựa chọn là:

  • "AsIs": Chỉ sử dụng miền để định tuyến. Giá trị mặc định.
  • "IPIfNonMatch": Khi không có quy tắc nào khớp với miền hiện tại, V2Ray sẽ giải quyết nó thành địa chỉ IP (bản ghi A hoặc AAAA) và thử lại tất cả các quy tắc.
    • Nếu một miền có nhiều địa chỉ IP, V2Ray sẽ thử tất cả các địa chỉ đó.
    • Các IP được giải quyết chỉ được sử dụng cho các quyết định định tuyến, lưu lượng truy cập vẫn được gửi đến địa chỉ tên miền ban đầu.
  • "IPOnDemand": Miễn là có quy tắc dựa trên IP, V2Ray sẽ giải quyết miền đó thành IP ngay lập tức.

rules: [RuleObject]

An array of rules. For each inbound connection, V2Ray tries these rules from top down one by one. If a rule takes effect, the connection will be routed to the outboundTag (or balancerTag, V2Ray 4.4+) of the rule.

balancers: [ BalancerObject ]

(V2Ray 4.4+) An array of load balancers. When a routing rule points to a load balancer, the balancer will select an outbound based on configuration. Then traffic will be sent to that outbound.

RuleObject

{
  "type": "field",
  "domain": [
    "baidu.com",
    "qq.com",
    "geosite:cn"
  ],
  "ip": [
    "0.0.0.0/8",
    "10.0.0.0/8",
    "fc00::/7",
    "fe80::/10",
    "geoip:cn"
  ],
  "port": "53,443,1000-2000",
  "network": "tcp",
  "source": [
    "10.0.0.1"
  ],
  "user": [
    "love@v2ray.com"
  ],
  "inboundTag": [
    "tag-vmess"
  ],
  "protocol":["http", "tls", "bittorrent"],
  "attrs": "attrs[':method'] == 'GET'",
  "outboundTag": "direct",
  "balancerTag": "balancer"
}

When multiple fields are specified, these fields have to be all satisfied, in order to make the rule effective. If you need both domain and ip rules, it is highly likely you need put them into separate rules.

type: "field"

The only valid value for now is "field".

domain: [ string ]

An array of domains. Available formats are:

  • Plaintext: Nếu chuỗi này khớp với bất kỳ phần nào của miền nhắm mục tiêu, quy tắc này sẽ có hiệu lực. Ví dụ: quy tắc "sina.com" phù hợp với nhắm mục tiêu tên miền "sina.com", "sina.com.cn""www.sina.com", nhưng không phải "sina.cn".
  • Cụm từ thông dụng: Bắt đầu bằng "regexp:", phần còn lại là cụm từ thông dụng. Khi regexp khớp với miền nhắm mục tiêu, quy tắc này có hiệu lực. Ví dụ: quy tắc "regexp: \\. Goo. * \\. Com $" khớp với "www.google.com""fonts.googleapis.com", nhưng không phải "google.com".
  • Tên miền phụ (được khuyến nghị): Bắt đầu bằng "tên miền:" và phần còn lại là tên miền. Khi tên miền nhắm mục tiêu chính xác là giá trị hoặc là tên miền phụ của giá trị, quy tắc này có hiệu lực. Ví dụ: quy tắc "tên miền: v2ray.com" khớp với "www.v2ray.com", "v2ray.com", nhưng không phải "xv2ray.com".
  • Tên miền đầy đủ: Bắt đầu bằng "đầy đủ:" và phần còn lại là tên miền. Khi tên miền nhắm mục tiêu chính xác là giá trị, quy tắc sẽ có hiệu lực. Ví dụ: quy tắc "tên miền: v2ray.com" khớp với "v2ray.com", nhưng không phải "www.v2ray.com".
  • Pre-defined domain list: Begining with "geosite:" and the rest is a name, such as geosite:google or geosite:cn. See Pre-defined domain list for more detail.
  • Domains from file: Such as "ext:file:tag". The value must begin with ext: (lowercase), and followed by filename and tag. The file is placed in resource directory, and has the same format of geosite.dat. The tag must exist in the file.

ip: [string]

An array of IP ranges. When the targeting IP is in one of the ranges, this rule takes effect. Available formats:

  • IP: chẳng hạn như "127.0.0.1".
  • CIDR: chẳng hạn như "127.0.0.0/8".
  • GeoIP: chẳng hạn như "geoip: cn". Nó bắt đầu với geoip: (chữ thường) và theo sau là hai chữ cái của mã quốc gia.
    • Giá trị đặc biệt "geoip: private": cho tất cả các địa chỉ riêng như 127.0.0.1.
  • IP từ tệp: Chẳng hạn như "ext: file: tag". Giá trị phải bắt đầu bằng ext: (chữ thường) và tiếp theo là tên tệp và thẻ. Tệp được đặt trong thư mục tài nguyênvà có cùng định dạng geoip.dat. Thẻ phải tồn tại trong tệp.

"ext:geoip.dat:cn" is equivalent to "geoip:cn".

port:number | string

Port range. Formats are:

  • "a-b": Both a and b are positive integers and less than 65536. When the targeting port is in [a, b), this rule takes effect.
  • a: a is a positive integer, and less than 65536. When the targeting port is a, this rule takes effect.
  • Mix of the two above, separated by ",". Such as "53,443,1000-2000".

network: "tcp" | "udp" | "tcp,udp"

When the connection has in the chosen network, this rule take effect.

source: [string]

An array of IP ranges. Same format as ip. When the source IP of the connection is in the IP range, this rule takes effect.

user: [string]

An array of email address. When the inbound connection uses an user account of the email address, this rule takes effect. For now Shadowsocks and VMess support user with email.

inboundTag: [string]

An array of string as inbound proxy tags. When the connection comes from one of the specified inbound proxy, this rule takes effect.

protocol: [ "http" | "tls" | "bittorrent" ]

An array of string as protocol types. When the connection uses one of the protocols, this rule takes effect. To recognize the protocol of a connection, one must enable sniffing option in inbound proxy.

attrs: string

(V2Ray 4.18+) A Starlark script, used for detecting traffic attributes. When this script returns true, this rule takes effect.

Starlark is a subset of Python. The script takes a global varible named attrs. It contains all attributes of the traffic.

At the moment, only http inbound sets attrs.

Examples:

  • Detect HTTP GET: "attrs[':method'] == 'GET'"
  • Detect HTTP Path: "attrs[':path'].startswith('/test')"
  • Detect Content Type: "attrs['accept'].index('text/html') >= 0"

outboundTag string

Tag of the outbound that the connection will be sent to, if this rule take effect.

balancerTag: string

Tag of an load balancer. Then this rule takes effect, V2Ray will use the balancer to select an outbound. Either outboundTag or balancerTag must be specified. When both are specified, outboundTag takes priority.

BalancerObject

Configuration for a load balancer. When a load balancer takes effective, it selects one outbound from matching outbounds. This outbound will be used for send out-going traffic.

{
  "tag": "balancer",
  "selector": []
}

tag: string

Tag of this BalancerObject, to be matched from balancerTag in RuleObject.

selector: [ string ]

An array of strings. These strings are used to select outbounds with prefix matching. For example, with the following outbound tags: [ "a", "ab", "c", "ba" ],selector ["a"] matches [ "a", "ab" ].

When multiple outbounds are selected, load balancer for now picks one final outbound at random.

Pre-defined domain lists

This is a domain lists maintained by domain-list-community project. It provides a file named geosite.dat for some predefined domain lists. Notably:

  • category-ads: Common ads domains.
  • category-ads-all: Common ads domains and ads providers' domains.
  • cn: Equivalent to an union of geolocation-cn and tld-cn.
  • google: All Google domains.
  • facebook: All Facebook domains.
  • geolocation-cn: Common domains that serve in China.
  • geolocation-!cn: Common domains that don't serve in China
  • speedtest: All domains used by Speedtest.
  • tld-cn: All .cn and .中国 domains.
================================================ FILE: vi/configuration/stats.html ================================================ Số liệu thống kê · Project V Official

Số liệu thống kê

V2Ray cung cấp một số thông tin về nội bộ của nó.

StatsObject

StatsObject được sử dụng như số liệu thống kê trường trong cấu hình cấp cao nhất.

{
}

Tại thời điểm này không có tham số trong cài đặt thống kê. Số liệu thống kê được bật tự động khi StatsObject được đặt ở cấu hình cấp cao nhất. Bạn cũng cần bật cài đặt tương ứng trong Chính sách, để theo dõi số liệu thống kê người dùng hoặc hệ thống.

Tất cả các số liệu thống kê quầy được liệt kê dưới đây:

Lưu lượng người dùng

Nếu người dùng không có địa chỉ email được đặt trong cài đặt giao thức, thống kê lưu lượng truy cập sẽ không được bật.

người dùng>>>[email]>>>giao thông>>>uplink

Lưu lượng truy cập uplink tích lũy của người dùng cụ thể, tính theo byte.

người dùng>>>[email]>>>lưu lượng truy cập>>>đường xuống

Lưu lượng truy cập đường xuống tích lũy của người dùng cụ thể, tính theo byte.

Lưu lượng truy cập toàn cầu

trong nước>>>[tag]>>>giao thông>>>uplink

Lưu lượng truy cập uplink tích lũy cụ thể trong nước, tính theo byte.

gửi đến>>>[tag]>>>lưu lượng truy cập>>>đường xuống

Lưu lượng truy cập đường xuống được tích lũy của cụ thể trong nước, tính theo byte.

================================================ FILE: vi/configuration/transport/domainsocket.html ================================================ DomainSocket · Project V Official

Domain Socket Transport

Domain Socket sử dụng ổ cắm miền Unix chuẩn để truyền tải dữ liệu. Ổ cắm tên miền là kênh chuyển tiếp giữa các hệ thống. Nó không gây nhiễu bộ đệm mạng và có thể nhanh hơn một chút so với trasnferring thông qua mạng loopback cục bộ.

Ổ cắm miền chỉ có thể được sử dụng trên các nền tảng hỗ trợ ổ cắm miền Unix, chẳng hạn như macOS và Linux. Nó không có sẵn trên Windows.

Khi ổ cắm miền được sử dụng, IP và cổng được chỉ định trên proxy đến / đi sẽ bị bỏ qua. Tất cả lưu lượng truy cập đều được tunnel qua socket miền.

DomainSocketObject

DomainSocketObject được sử dụng trong dsSettings trường trong TransportObjectStreamSettingsObject.

{
  "path": "/path/to/ds/file"
}

path: string

Đường dẫn tệp tuyệt đối hợp lệ. Trước khi chạy V2Ray, tệp trên đường dẫn này không được tồn tại.

================================================ FILE: vi/configuration/transport/h2.html ================================================ HTTP/2 · Project V Official

Giao thức HTTP / 2

Giao thức HTTP / 2 được thêm vào trong V2Ray 3.17. Nó dựa trên HTTP / 2 tiêu chuẩn và có thể là proxy thông qua máy chủ HTTP khác, chẳng hạn như Nginx.

Do đề xuất HTTP / 2, việc truyền vào trong và ra ngoài phải cho phép TLS sử dụng phương tiện này.

HttpObject

DomainSocketObject được sử dụng trong httpSettings trong TransportObjectStreamSettingsObject.

{
  "host": ["v2ray.com"],
  "path": "/random/path"
}

host: [ string ]

Một mảng chuỗi. Mỗi phần tử là một miền. Khách hàng chọn ngẫu nhiên tên miền cho mỗi yêu cầu. Máy chủ kiểm tra xem tên miền trong yêu cầu đến có nằm trong danh sách hay không.

path: string

Đường dẫn HTTP. Máy khách và máy chủ phải có cùng giá trị.

================================================ FILE: vi/configuration/transport/mkcp.html ================================================ mKCP · Project V Official

mKCP Transport

mKCP là một phương tiện giao thông đáng tin cậy. Nó là một giao thức dựa trên UDP. mKCP gửi nhiều lưu lượng truy cập hơn cho độ trễ thấp hơn. Để chuyển cùng một lượng dữ liệu, mKCP thường đòi hỏi nhiều thông lượng hơn TCP.

KcpObject

{
  "mtu": 1350,
  "tti": 20,
  "uplinkCapacity": 5,
  "downlinkCapacity": 20,
  "congestion": false,
  "readBufferSize": 1,
  "writeBufferSize": 1,
  "header": {
    "type": "none"
  }
}

mtu: number

Đơn vị truyền tối đa. Nó chỉ ra số byte tối đa mà gói UDP có thể mang theo. Giá trị được đề xuất nằm trong khoảng từ 576 đến 1460. Giá trị mặc định 1350.

tti: number

Khoảng thời gian truyền, tính bằng mili giây. mKCP gửi dữ liệu trong khoảng thời gian này. Giá trị được đề xuất nằm trong khoảng từ 10 đến 100. Giá trị mặc định 50.

uplinkCapacity: number

Băng thông Uplink, tính bằng MB / s. Băng thông tối đa cho phiên bản V2Ray để tải dữ liệu lên một thiết bị từ xa. Giá trị mặc định là 5. Xin lưu ý rằng nó là byte (tính bằng MB / s), không phải bit. Người ta có thể sử dụng giá trị 0 cho một băng thông nhỏ.

downlinkCapacity: number

Băng thông đường xuống, tính bằng MB / s. Băng thông tối đa cho phiên bản V2Ray để tải xuống dữ liệu. Giá trị mặc định là 20. Xin lưu ý rằng nó là byte (tính bằng MB / s), không phải bit. Người ta có thể sử dụng giá trị 0 cho một băng thông nhỏ.

uplinkCapacitydownlinkCapacity xác định tốc độ của mKCP. Ở phía máy khách, uplinkCapacity chỉ định tốc độ cho máy khách gửi dữ liệu đến máy chủ. Ở phía máy chủ, downlinkCapacity chỉ định tốc độ nhận dữ liệu của máy chủ. Tối thiểu của cặp này có hiệu quả trong một kết nối thực tế.

congestion: true | false

Có hay không để cho phép kiểm soát tắc nghẽn. Giá trị mặc định là false. Khi điều khiển tắc nghẽn được bật, V2Ray sẽ phát hiện chất lượng mạng. Nó sẽ gửi các gói ít hơn khi mất gói dữ liệu nghiêm trọng, hoặc nhiều dữ liệu hơn khi mạng không được điền đầy đủ.

readBufferSize: number

Đọc kích thước bộ đệm cho một kết nối duy nhất, tính bằng MB. Giá trị mặc định là 2.

writeBufferSize: number

Ghi kích thước bộ đệm cho một kết nối duy nhất, tính bằng MB. Giá trị mặc định là 2.

header: HeaderObject

Cấu hình cho obfuscation tiêu đề gói.

HeaderObject

{
  "type": "none"
}

type: string

Loại obfuscation. Proxy tương ứng vào và ra phải có cùng cài đặt. Lựa chọn là:

  • "none": Giá trị mặc định. Không có obfuscation được sử dụng.
  • "srtp": Làm xáo trộn lưu lượng truy cập SRTP. Nó có thể được công nhận là cuộc gọi video như FaceTime.
  • "utp": Làm xáo trộn lưu lượng truy cập uTP. Nó có thể được công nhận là lưu lượng truy cập Bittorrent.
  • "wechat-video": Làm xáo trộn lưu lượng truy cập WeChat.
  • "dtls": Obfuscated dưới dạng gói tin 1.2.
  • "wireguard": Làm xáo trộn các gói WireGuard. (KHÔNG đúng giao thức WireGuard)

Tín dụng

  • @ skywind3000 đã phát minh ra giao thức KCP gốc và được triển khai trong C.
  • @xtaci tái triển khai giao thức KCP trong Go.
  • @xiaokangwang tích hợp KCP vào V2Ray.
================================================ FILE: vi/configuration/transport/quic.html ================================================ QUIC · Project V Official

QUIC

QUIC, or Quick UDP Internet Connection, is a multiplexing transport based on UDP, initially designed, implemented, and deployed by Google.

QUIC has the following advantages:

  1. Reduced number of roundtrips in handshake phase. (1-RTT or 0-RTT)
  2. Multiplexing without head of line blocking as in TCP
  3. Connection migration, especially for clients. For example, connections don't break when device moves from Wi-Fi to 4G.

QUIC is now an experiment in V2Ray. It implements IETF specification. As the spec is still being standardized, compatibility can't be guaranteed.

Update History

V2Ray 4.7:

  • Initial version to support QUIC.
  • Default settings:
    • 12 byte Connection ID
    • Connection timeout in 30 seconds if no data traffic. (May have impact on some long HTTP connections)

QuicObject

QUIC is used as quicSettings in transport settings. The configuration must be exactly the same between connecting peers.

QUIC requires TLS. If TLS is not enabled in transport settings, V2Ray will automatically issue a TLS certificate for it. When QUIC transport is used, encryption in VMess can be turned off.

{
  "security": "none",
  "key": "",
  "header": {
    "type": "none"
  }
}

security: "none" | "aes-128-gcm" | "chacha20-poly1305"

Extra encryption over entire QUIC packet, include the frame head part. Default value is "none" for no encryption. After being encrypted, QUIC packets can't be sniff'ed.

key: string

Key for the encryption above. Can be any string. Only effective when security is not "none".

header: HeaderObject

Configuration for packet header obfuscation.

HeaderObject

{
  "type": "none"
}

type: string

Type of obfuscation. Corresponding inbound and outbound proxy must have the same settings. Choices are:

  • "none": Default value. No obfuscation is used.
  • "srtp": Obfuscated as SRTP traffic. It may be recognized as video calls such as Facetime.
  • "utp": Obfuscated as uTP traffic. It may be recognized as Bittorrent traffic.
  • "wechat-video": Obfuscated to WeChat traffic.
  • "dtls": Obfuscated as DTLS 1.2 packets.
  • "wireguard": Obfuscated as WireGuard packets. (NOT true WireGuard protocol)

When neither encryption nor obfuscation is enabled, QUIC transport is compatible with other QUIC tools. However it is recommended to enable either or both for better undetectable communication.

================================================ FILE: vi/configuration/transport/tcp.html ================================================ TCP · Project V Official

TCP Transport

TcpObject

{
  "header": {
    "type": "none"
  }
}

header: NoneHeaderObject | HttpHeaderobject

Tiêu đề obfuscation. Giá trị mặc định là NoneHeaderObject.

NoneHeaderObject

Không có tiêu đề obfuscation.

{
  "type": "none"
}

type: "none"

Vô hiệu hóa tiêu đề obfuscation.

HttpHeaderObject

Tiêu đề HTTP obfuscation. Cấu hình phải giống nhau giữa kết nối trong và ngoài.

{
  "type": "http",
  "request": {},
  "response": {}
}

type: "http"

Bật tính năng obfuscation của tiêu đề HTTP.

request: HTTPRequestObject

Mẫu yêu cầu HTTP.

response: HTTPResponseObject

Mẫu phản hồi HTTP.

HTTPRequestObject

{
  "version": "1.1",
  "method": "GET",
  "path": ["/"],
  "headers": {
    "Host": ["www.baidu.com", "www.bing.com"],
    "User-Agent": [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
    ],
    "Accept-Encoding": ["gzip, deflate"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

Phiên bản HTTP. Giá trị mặc định là "1.1".

method: string

Phương thức HTTP. Giá trị mặc định là "NHẬN"

path: [ string ]

Đường dẫn HTTP. Một mảng là chuỗi. Đường dẫn sẽ được chọn ngẫu nhiên cho mọi kết nối.

headers: map{string, [ string ] }

Tiêu đề HTTP. Chìa khóa của mỗi mục nhập là khóa của tiêu đề HTTP. Giá trị của mỗi mục là một danh sách các chuỗi. Giá trị tiêu đề HTTP thực tế sẽ được chọn ngẫu nhiên từ danh sách cho mỗi kết nối. Giá trị mặc định là các giá trị trong ví dụ trên.

Trong kết nối, tất cả các khóa trong bản đồ được chỉ định sẽ được đặt thành tiêu đề HTTP.

HTTPResponseObject

{
  "version": "1.1",
  "status": "200",
  "reason": "OK",
  "headers": {
    "Content-Type": ["application/octet-stream", "video/mpeg"],
    "Transfer-Encoding": ["chunked"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}

version: string

Phiên bản HTTP. Giá trị mặc định là "1.1".

status: string

Trạng thái HTTP. Giá trị mặc định là "200"

reason: string

Thông báo trạng thái HTTP. Giá trị mặc định là "OK".

headers: map{string, string}

Tiêu đề HTTP. Chìa khóa của mỗi mục nhập là khóa của tiêu đề HTTP. Giá trị của mỗi mục là một danh sách các chuỗi. Giá trị tiêu đề HTTP thực tế sẽ được chọn ngẫu nhiên từ danh sách cho mỗi kết nối. Giá trị mặc định là các giá trị trong ví dụ trên.

Trong kết nối, tất cả các khóa trong bản đồ được chỉ định sẽ được đặt thành tiêu đề HTTP.

================================================ FILE: vi/configuration/transport/websocket.html ================================================ WebSocket · Project V Official

WebSocket

Sử dụng WebSocket chuẩn để truyền tải dữ liệu. Các kết nối Websocket có thể được proxy của Nginx ủy nhiệm.

WebSocketObject

WebSocketObject được sử dụng như wsSettings trong TransportObject hoặc StreamSettingsObject.

Websocket nhận ra tiêu đề HTTP X-Forwarded-For và sử dụng nó như là địa chỉ nguồn trong nước.

{
  "path": "/",
  "headers": {
    "Host": "v2ray.com"
  }
}

path: string

Đường dẫn được sử dụng cho WebSocket. Mặc định là root, là "/".

headers: map{string, string}

Tiêu đề HTTP tùy chỉnh. Một mảng trong đó mỗi mục nhập là một cặp giá trị khóa trong chuỗi, cho tiêu đề và giá trị trong tiêu đề HTTP. Mặc định trống.

================================================ FILE: vi/configuration/transport.html ================================================ Vận chuyển · Project V Official

Cài đặt Giao thông

Giao thông vận tải là cách V2Ray gửi và nhận dữ liệu từ các đồng nghiệp của nó. The responsibility of a transport is to reliably transfer data to a peer. Thông thường một kết nối có các kết nối phù hợp trên cả hai điểm cuối. Ví dụ, nếu một V2Ray outbound sử dụng WebSocket như là vận chuyển của nó, thì nó nói đến cũng phải sử dụng WebSocket, nếu không kết nối không thể được thiết lập.

Cài đặt vận chuyển chia thành hai phần: cài đặt chung và mỗi cài đặt proxy. Cài đặt từng proxy xác định cách mỗi proxy riêng xử lý dữ liệu của nó, trong khi cài đặt chung cho tất cả proxy. Thông thường, các proxy gửi đến và gửi đi giữa peer peer phải có cùng các thiết lập truyền tải. Khi proxy không có cài đặt truyền tải, cài đặt chung sẽ được áp dụng.

TransportObject

TransportObject được sử dụng làm vận tải trong cấu hình mức cao nhất.

{
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {}
}

tcpSettings: TcpObject

Cài đặt cho TCP vận chuyển.

kcpSettings: KcpObject

Cài đặt cho vận chuyển mKCP.

wsSettings: WebSocketObject

Cài đặt cho vận chuyển WebSocket.

httpSettings: HttpObject

Cài đặt cho HTTP / 2.

dsSettings: DomainSocketObject

Cài đặt cho vận chuyển Socket miền.

quicSettings: QUICObject

(V2Ray 4.7+) Settings for QUIC transport.

StreamSettingsObject

Each inbound and outbound proxy may has its own transport settings, as specified in streamSettings field in top level configuration.

{
  "network": "tcp",
  "security": "none",
  "tlsSettings": {},
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {},
  "sockopt": {
    "mark": 0,
    "tcpFastOpen": false,
    "tproxy": "off"
  }
}

network: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"

Network type of the stream transport. Default value "tcp".

security: "none" | "tls"

Type of security. Choices are "none" (default) for no extra security, or "tls" for using TLS.

tlsSettings: TLSObject

TLS settings. TLS is provided by Golang. Support up to TLS 1.2. DTLS is not supported.

tcpSettings: TcpObject

TCP transport configuration for current proxy. Effective only when the proxy uses TCP transport. Configuration is the same as it is in global configuration.

kcpSettings: KcpObject

mKCP transport configuration for current proxy. Effective only when the proxy uses mKCP transport. Configuration is the same as it is in global configuration.

wsSettings: WebSocketObject

WebSocket transport configuration for current proxy. Effective only when the proxy uses WebSocket transport. Configuration is the same as it is in global configuration.

httpSettings: HttpObject

HTTP/2 transport configuration for current proxy. Effective only when the proxy uses HTTP/2 transport. Configuration is the same as it is in global configuration.

dsSettings: DomainSocketObject

Domain socket transport configuration for current proxy. Effective only when the proxy uses domain socket transport. Configuration is the same as it is in global configuration.

quicSettings: QUICObject

(V2Ray 4.7+) QUIC transport configuration for current proxy. Effective only when the proxy uses QUIC transport. Configuration is the same as it is in global configuration.

sockopt: SockoptObject

Socket options for incoming and out-going connections.

TLSObject

{
  "serverName": "v2ray.com",
  "allowInsecure": false,
  "alpn": ["http/1.1"],
  "certificates": [],
  "disableSystemRoot": false
}

serverName: string

Server name (usually domain) used for TLS authentication. Typically this is used when corressponding inbound/outbound uses IP for communication.

When domain name is specified from inbound proxy, or get sniffed from the connection, it will be automatically used for connection. It is not necessary to set serverName in such case.

alpn: [ string ]

An array of strings, to specifiy the ALPN value in TLS handshake. Default value is ["http/1.1"].

allowInsecure: true | false

If true, V2Ray allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.

allowInsecureCiphers: true | false

Whehter or not to allow insecure cipher suites. By default TLS only uses cipher suites from TLS 1.3 spec. Turn on this option to allow cipher suites with static RSA keys.

disableSystemRoot: true | false

(V2Ray 4.18+) Whether or not to disable system root CAs for TLS handshake. Default value is false. If set to true, V2Ray will use only certificates for TLS handshake.

certificates: [ CertificateObject ]

List of TLS certificates. Each entry is one certificate.

CertificateObject

{
  "usage": "encipherment",

  "certificateFile": "/path/to/certificate.crt",
  "keyFile": "/path/to/key.key",

  "certificate": [
    "-----BEGIN CERTIFICATE-----",
    "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
    "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
    "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
    "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
    "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
    "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
    "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
    "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
    "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
    "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
    "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
    "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
    "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
    "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
    "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
    "-----END CERTIFICATE-----"
  ],
  "key": [
    "-----BEGIN RSA PRIVATE KEY-----",
    "MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
    "bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
    "GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
    "jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
    "itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
    "IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
    "qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
    "C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
    "/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
    "aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
    "/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
    "bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
    "8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
    "pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
    "L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
    "3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
    "az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
    "gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
    "TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
    "eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
    "64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
    "8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
    "GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
    "ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
    "cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
    "-----END RSA PRIVATE KEY-----"
  ]
}

usage: "encipherment" | "verify" | "issue"

Purpose of the certificate. Default value "encipherment". Choices are:

  • "encipherment": Chứng chỉ được sử dụng để xác thực và mã hóa TLS.
  • "verify": Chứng chỉ được sử dụng để xác thực chứng chỉ TLS từ đồng đẳng từ xa. Trong trường hợp này, chứng chỉ phải là chứng chỉ CA.
  • "issue": Chứng chỉ được sử dụng để phát hành các chứng chỉ khác. Trong trường hợp này, chứng chỉ phải là chứng chỉ CA.

On Windows, you have to install your CA certificate to system, in order to verify cerificates issued from the CA.

When there is a new client request, say for serverName = "v2ray.com", V2Ray will find a certificate for "v2ray.com" first. If not found, V2Ray will try to issue a new certificate using any existing certificate whose usage is "issue" for "v2ray.com". The new certificate expires in one hour, and will be added to certificate pool for later reuse.

certificateFile: string

File path to the certificate. If the certificate is generated by OpenSSL, the path ends with ".crt".

Use v2ctl cert -ca command to generate a new CA certificate.

certificate: [ string ]

List of strings as content of the certificate. See the example above. Either certificate or certificateFile must not be empty.

keyFile: string

File path to the private key. If generated by OpenSSL, the file usually ends with ".key". Key file with password is not supported.

key: [ string ]

List of strings as content of the private key. See the example above. Either key or keyFile must not be empty.

When certificateFile and certificate are both filled in. V2Ray uses certificateFile. Same for keyFile and key.

When usage is "verify", both keyFile and key can be empty.

SockoptObject

{
  "mark": 0,
  "tcpFastOpen": false,
  "tproxy": "off"
}

mark: number

An integer. If non-zero, the value will be set to out-going connections via socket option SO_MARK. This mechanism only applies on Linux and requires CAP_NET_ADMIN permission.

tcpFastOpen: true | false

Whether or not to enable TCP Fast Open. When set to true, V2Ray enables TFO for current connection. When set to false, V2Ray disables TFO. If this entry doesn't exist, V2Ray uses default settings from operating system.

  • Chỉ áp dụng trên các hệ điều hành sau:
    • Windows 10 (1604) trở lên
    • Mac OS 10.11 / iOS 9 trở lên
    • Linux 3.16 trở lên: Được bật theo mặc định hệ thống.
  • Áp dụng cho cả kết nối trong và ngoài nước.

tproxy: "redirect" | "tproxy" | "off"

Whether or not to enable transparent proxy on Linux. Choices are:

  • "off": Giá trị mặc định. Không kích hoạt TProxy.
  • "chuyển hướng": Bật TProxy với chế độ Chuyển hướng. Hỗ trợ lưu lượng TCP / IPv4 và UDP.
  • "tproxy": Bật TProxy với chế độ TProxy. Hỗ trợ lưu lượng TCP và UDP.

Transparent proxy requires Root or CAP_NET_ADMIN permission.

If TProxy is not set, and allowRedirect is set in dokodemo-door, the value of TProxy will be set to "redirect" automatically.

================================================ FILE: vi/developer/tools.html ================================================ Tools · Project V Official

Tools

Third Party SDK

Automation

V2Ray uses the following automation tools for build and releases.

================================================ FILE: vi/gitbook/gitbook-plugin-anchors/plugin.css ================================================ a.plugin-anchor { color: inherit !important; display: none; margin-left: -30px; padding-left: 40px; cursor: pointer; position: absolute; top: 0; left: 0; bottom: 0; } a.plugin-anchor i { margin-left: -30px; font-size: 15px !important; } h1, h2, h3, h4, h5, h6 { position: relative; } h1:hover a.plugin-anchor, h2:hover a.plugin-anchor, h3:hover a.plugin-anchor, h4:hover a.plugin-anchor, h5:hover a.plugin-anchor, h6:hover a.plugin-anchor { display: inline-block; } .book .book-body .page-wrapper .page-inner section.normal { overflow: visible; } ================================================ FILE: vi/gitbook/gitbook-plugin-ga/plugin.js ================================================ require(["gitbook"], function(gitbook) { // Load analytics.js gitbook.events.bind("start", function(e, config) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); var cfg = config.ga; ga('create', cfg.token, cfg.configuration); }); // Notify pageview gitbook.events.bind("page.change", function() { ga('send', 'pageview', window.location.pathname+window.location.search); }); }); ================================================ FILE: vi/gitbook/gitbook-plugin-hints/plugin-hints.css ================================================ .hints-icon { display: table-cell; padding-right: 15px; padding-left: 5px; } .hints-container { display: table-cell; } ================================================ FILE: vi/gitbook/gitbook-plugin-mermaid-gb3/book/plugin.js ================================================ require([ 'gitbook' ], function (gitbook) { gitbook.events.bind('page.change', function () { mermaid.init(); }); }); ================================================ FILE: vi/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #ECECFF; stroke: #CCCCFF; stroke-width: 1px; } .arrowheadPath { fill: #333333; } .edgePath .path { stroke: #333333; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #ffffde !important; rx: 4 !important; stroke: #aaaa33 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #CCCCFF; fill: #ECECFF; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #CCCCFF; fill: #ECECFF; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #CCCCFF; } .note { stroke: #aaaa33; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: rgba(102, 102, 255, 0.49); } .section2 { fill: #fff400; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #8a90dd; stroke: #534fbc; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #bfc7ff; stroke: #534fbc; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #bfc7ff; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #9370DB; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #ECECFF; stroke: #9370DB; } g.classGroup line { stroke: #9370DB; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #ECECFF; opacity: 0.5; } svg .classLabel .label { fill: #9370DB; font-size: 10px; } .relation { stroke: #9370DB; stroke-width: 1; fill: none; } .composition { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #compositionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .aggregation { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationStart { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #aggregationEnd { fill: #ECECFF; stroke: #9370DB; stroke-width: 1; } #dependencyStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #dependencyEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionStart { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } #extensionEnd { fill: #9370DB; stroke: #9370DB; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #ffffde; border: 1px solid #aaaa33; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: vi/gitbook/gitbook-plugin-mermaid-gb3/mermaid/mermaid.forest.css ================================================ /* Flowchart variables */ /* Sequence Diagram variables */ /* Gantt chart variables */ .mermaid .label { font-family: 'trebuchet ms', verdana, arial; color: #333; } .node rect, .node circle, .node ellipse, .node polygon { fill: #cde498; stroke: #13540c; stroke-width: 1px; } .arrowheadPath { fill: green; } .edgePath .path { stroke: green; stroke-width: 1.5px; } .edgeLabel { background-color: #e8e8e8; } .cluster rect { fill: #cdffb2 !important; rx: 4 !important; stroke: #6eaa49 !important; stroke-width: 1px !important; } .cluster text { fill: #333; } .actor { stroke: #13540c; fill: #cde498; } text.actor { fill: black; stroke: none; } .actor-line { stroke: grey; } .messageLine0 { stroke-width: 1.5; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #333; } .messageLine1 { stroke-width: 1.5; stroke-dasharray: "2 2"; stroke: #333; } #arrowhead { fill: #333; } #crosshead path { fill: #333 !important; stroke: #333 !important; } .messageText { fill: #333; stroke: none; } .labelBox { stroke: #326932; fill: #cde498; } .labelText { fill: black; stroke: none; } .loopText { fill: black; stroke: none; } .loopLine { stroke-width: 2; stroke-dasharray: "2 2"; marker-end: "url(#arrowhead)"; stroke: #326932; } .note { stroke: #6eaa49; fill: #fff5ad; } .noteText { fill: black; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } /** Section styling */ .section { stroke: none; opacity: 0.2; } .section0 { fill: #6eaa49; } .section2 { fill: #6eaa49; } .section1, .section3 { fill: white; opacity: 0.2; } .sectionTitle0 { fill: #333; } .sectionTitle1 { fill: #333; } .sectionTitle2 { fill: #333; } .sectionTitle3 { fill: #333; } .sectionTitle { text-anchor: start; font-size: 11px; text-height: 14px; } /* Grid and axis */ .grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispEdges; } .grid path { stroke-width: 0; } /* Today line */ .today { fill: none; stroke: red; stroke-width: 2px; } /* Task styling */ /* Default task */ .task { stroke-width: 2; } .taskText { text-anchor: middle; font-size: 11px; } .taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; } .taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; } /* Specific task settings for the sections*/ .taskText0, .taskText1, .taskText2, .taskText3 { fill: white; } .task0, .task1, .task2, .task3 { fill: #487e3a; stroke: #13540c; } .taskTextOutside0, .taskTextOutside2 { fill: black; } .taskTextOutside1, .taskTextOutside3 { fill: black; } /* Active task */ .active0, .active1, .active2, .active3 { fill: #cde498; stroke: #13540c; } .activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; } /* Completed task */ .done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; } .doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; } /* Tasks on the critical line */ .crit0, .crit1, .crit2, .crit3 { stroke: #ff8888; fill: red; stroke-width: 2; } .activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: #ff8888; fill: #cde498; stroke-width: 2; } .doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: #ff8888; fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispEdges; } .doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; } .activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; } .titleText { text-anchor: middle; font-size: 18px; fill: black; } g.classGroup text { fill: #13540c; stroke: none; font-family: 'trebuchet ms', verdana, arial; font-size: 10px; } g.classGroup rect { fill: #cde498; stroke: #13540c; } g.classGroup line { stroke: #13540c; stroke-width: 1; } svg .classLabel .box { stroke: none; stroke-width: 0; fill: #cde498; opacity: 0.5; } svg .classLabel .label { fill: #13540c; font-size: 10px; } .relation { stroke: #13540c; stroke-width: 1; fill: none; } .composition { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #compositionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .aggregation { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationStart { fill: #cde498; stroke: #13540c; stroke-width: 1; } #aggregationEnd { fill: #cde498; stroke: #13540c; stroke-width: 1; } #dependencyStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #dependencyEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionStart { fill: #13540c; stroke: #13540c; stroke-width: 1; } #extensionEnd { fill: #13540c; stroke: #13540c; stroke-width: 1; } .node text { font-family: 'trebuchet ms', verdana, arial; font-size: 14px; } div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: 'trebuchet ms', verdana, arial; font-size: 12px; background: #cdffb2; border: 1px solid #6eaa49; border-radius: 2px; pointer-events: none; z-index: 100; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-a11y-dark.css ================================================ /** * a11y-dark theme for JavaScript, CSS, and HTML * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css * @author ericwbailey */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: 0.5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #d4d0ab; } .token.punctuation { color: #fefefe; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ffa07a; } .token.boolean, .token.number { color: #00e0e0; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #abe338; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #00e0e0; } .token.atrule, .token.attr-value, .token.function { color: #ffd700; } .token.keyword { color: #00e0e0; } .token.regex, .token.important { color: #ffd700; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } @media screen and (-ms-high-contrast: active) { code[class*="language-"], pre[class*="language-"] { color: windowText; background: window; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: window; } .token.important { background: highlight; color: window; font-weight: normal; } .token.atrule, .token.attr-value, .token.function, .token.keyword, .token.operator, .token.selector { font-weight: bold; } .token.attr-value, .token.comment, .token.doctype, .token.function, .token.keyword, .token.operator, .token.property, .token.string { color: highlight; } .token.attr-value, .token.url { font-weight: normal; } } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-atom-dark.css ================================================ /** * atom-dark theme for `prism.js` * Based on Atom's `atom-dark` theme: https://github.com/atom/atom-dark-syntax * @author Joe Gibson (@gibsjose) */ code[class*="language-"], pre[class*="language-"] { color: #c5c8c6; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #1d1f21; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #7C7C7C; } .token.punctuation { color: #c5c8c6; } .namespace { opacity: .7; } .token.property, .token.keyword, .token.tag { color: #96CBFE; } .token.class-name { color: #FFFFB6; text-decoration: underline; } .token.boolean, .token.constant { color: #99CC99; } .token.symbol, .token.deleted { color: #f92672; } .token.number { color: #FF73FD; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #A8FF60; } .token.variable { color: #C6C5FE; } .token.operator { color: #EDEDED; } .token.entity { color: #FFFFB6; /* text-decoration: underline; */ } .token.url { color: #96CBFE; } .language-css .token.string, .style .token.string { color: #87C38A; } .token.atrule, .token.attr-value { color: #F9EE98; } .token.function { color: #DAD085; } .token.regex { color: #E9C062; } .token.important { color: #fd971f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-base16-ateliersulphurpool.light.css ================================================ /* Name: Base16 Atelier Sulphurpool Light Author: Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) Prism template by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/prism/) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #f5f7ff; color: #5e6687; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #dfe2f1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #dfe2f1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #898ea4; } .token.punctuation { color: #5e6687; } .token.namespace { opacity: .7; } .token.operator, .token.boolean, .token.number { color: #c76b29; } .token.property { color: #c08b30; } .token.tag { color: #3d8fd1; } .token.string { color: #22a2c9; } .token.selector { color: #6679cc; } .token.attr-name { color: #c76b29; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #22a2c9; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #ac9739; } .token.statement, .token.regex, .token.atrule { color: #22a2c9; } .token.placeholder, .token.variable { color: #3d8fd1; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #202746; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c94922; } .token.entity { cursor: help; } pre > code.highlight { outline: 0.4em solid #c94922; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #dfe2f1; } .line-numbers-rows > span:before { color: #979db4; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(107, 115, 148, 0.2); background: -webkit-linear-gradient(left, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); background: linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-cb.css ================================================ /* * Based on Plugin: Syntax Highlighter CB * Plugin URI: http://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js * Description: Highlight your code snippets with an easy to use shortcode based on Lea Verou's Prism.js. * Version: 1.0.0 * Author: c.bavota * Author URI: http://bavotasan.comhttp://wp.tutsplus.com/tutorials/plugins/adding-a-syntax-highlighter-shortcode-using-prism-js/ */ /* http://cbavota.bitbucket.org/syntax-highlighter/ */ /* ===== ===== */ code[class*="language-"], pre[class*="language-"] { color: #fff; text-shadow: 0 1px 1px #000; font-family: Menlo, Monaco, "Courier New", monospace; direction: ltr; text-align: left; word-spacing: normal; white-space: pre; word-wrap: normal; line-height: 1.4; background: none; border: 0; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"] code { float: left; padding: 0 15px 0 0; } pre[class*="language-"], :not(pre) > code[class*="language-"] { background: #222; } /* Code blocks */ pre[class*="language-"] { padding: 15px; margin: 1em 0; overflow: auto; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: 5px 10px; line-height: 1; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797979; } .token.selector, .token.operator, .token.punctuation { color: #fff; } .token.namespace { opacity: .7; } .token.tag, .token.boolean { color: #ffd893; } .token.atrule, .token.attr-value, .token.hex, .token.string { color: #B0C975; } .token.property, .token.entity, .token.url, .token.attr-name, .token.keyword { color: #c27628; } .token.regex { color: #9B71C6; } .token.entity { cursor: help; } .token.function, .token.constant { color: #e5a638; } .token.variable { color: #fdfba8; } .token.number { color: #8799B0; } .token.important, .token.deliminator { color: #E45734; } /* Line highlight plugin */ pre[data-line] { position: relative; padding: 1em 0 1em 3em; } .line-highlight { position: absolute; left: 0; right: 0; margin-top: 1em; /* Same as .prism's padding-top */ background: rgba(255,255,255,.2); pointer-events: none; line-height: inherit; white-space: pre; } .line-highlight:before, .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .3em; left: .6em; min-width: 1em; padding: 0 .5em; background-color: rgba(255,255,255,.3); color: #fff; font: bold 65%/1.5 sans-serif; text-align: center; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; text-shadow: none; } .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } /* for line numbers */ .line-numbers-rows { margin: 0; } .line-numbers-rows span { padding-right: 10px; border-right: 3px #d9d336 solid; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-darcula.css ================================================ /** * Darcula theme * * Adapted from a theme based on: * IntelliJ Darcula Theme (https://github.com/bulenkov/Darcula) * * @author Alexandre Paradis * @version 1.0 */ code[class*="language-"], pre[class*="language-"] { color: #a9b7c6; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { color: inherit; background: rgba(33,66,131,.85); } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { color: inherit; background: rgba(33,66,131,.85); } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #2b2b2b; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.cdata { color: #808080; } .token.delimiter, .token.boolean, .token.keyword, .token.selector, .token.important, .token.atrule { color: #cc7832; } .token.operator, .token.punctuation, .token.attr-name { color: #a9b7c6; } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: #e8bf6a; } .token.entity, .token.number, .token.symbol { color: #6897bb; } .token.property, .token.constant, .token.variable { color: #9876aa; } .token.string, .token.char { color: #6a8759; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: #ffc66d; } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #294436; } .token.deleted { background: #484a4a; } /*code.language-css .token.punctuation { color: #cc7832; }*/ code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-dracula.css ================================================ /** * Dracula Theme originally by Zeno Rocha [@zenorocha] * https://draculatheme.com/ * * Ported for PrismJS by Albert Vallverdu [@byverdu] */ code[class*="language-"], pre[class*="language-"] { color: #f8f8f2; background: none; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #282a36; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6272a4; } .token.punctuation { color: #f8f8f2; } .namespace { opacity: .7; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #ff79c6; } .token.boolean, .token.number { color: #bd93f9; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #50fa7b; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #f8f8f2; } .token.atrule, .token.attr-value, .token.function, .token.class-name { color: #f1fa8c; } .token.keyword { color: #8be9fd; } .token.regex, .token.important { color: #ffb86c; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-duotone-dark.css ================================================ /* Name: Duotone Dark Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-evening-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2734; color: #9a86fd; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6a51e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6a51e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6c6783; } .token.punctuation { color: #6c6783; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #e09142; } .token.property, .token.function { color: #9a86fd; } .token.tag-id, .token.selector, .token.atrule-id { color: #eeebff; } code.language-javascript, .token.attr-name { color: #c4b9fe; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #ffcc99; } .token.placeholder, .token.variable { color: #ffcc99; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #eeebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #c4b9fe; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #8a75f5; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c2937; } .line-numbers-rows > span:before { color: #3c3949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(224, 145, 66, 0.2); background: -webkit-linear-gradient(left, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); background: linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-duotone-earth.css ================================================ /* Name: Duotone Earth Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-earth-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #322d29; color: #88786d; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #6f5849; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #6f5849; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6a5f58; } .token.punctuation { color: #6a5f58; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #bfa05a; } .token.property, .token.function { color: #88786d; } .token.tag-id, .token.selector, .token.atrule-id { color: #fff3eb; } code.language-javascript, .token.attr-name { color: #a48774; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fcc440; } .token.placeholder, .token.variable { color: #fcc440; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #fff3eb; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #a48774; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #816d5f; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #35302b; } .line-numbers-rows > span:before { color: #46403d; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(191, 160, 90, 0.2); background: -webkit-linear-gradient(left, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); background: linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-duotone-forest.css ================================================ /* Name: Duotone Forest Author: by Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-forest-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #2a2d2a; color: #687d68; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #435643; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #435643; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #535f53; } .token.punctuation { color: #535f53; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #a2b34d; } .token.property, .token.function { color: #687d68; } .token.tag-id, .token.selector, .token.atrule-id { color: #f0fff0; } code.language-javascript, .token.attr-name { color: #b3d6b3; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #e5fb79; } .token.placeholder, .token.variable { color: #e5fb79; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #f0fff0; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #b3d6b3; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #5c705c; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #2c302c; } .line-numbers-rows > span:before { color: #3b423b; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(162, 179, 77, 0.2); background: -webkit-linear-gradient(left, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); background: linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-duotone-light.css ================================================ /* Name: Duotone Light Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-morning-light.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #faf8f5; color: #728fcb; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #faf8f5; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #faf8f5; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #b6ad9a; } .token.punctuation { color: #b6ad9a; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #063289; } .token.property, .token.function { color: #b29762; } .token.tag-id, .token.selector, .token.atrule-id { color: #2d2006; } code.language-javascript, .token.attr-name { color: #896724; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #728fcb; } .token.placeholder, .token.variable { color: #93abdc; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #2d2006; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #896724; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #896724; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #ece8de; } .line-numbers-rows > span:before { color: #cdc4b1; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(45, 32, 6, 0.2); background: -webkit-linear-gradient(left, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); background: linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-duotone-sea.css ================================================ /* Name: Duotone Sea Author: by Simurai, adapted from DuoTone themes by Simurai for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-sea-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #1d262f; color: #57718e; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #004a9e; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #004a9e; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #4a5f78; } .token.punctuation { color: #4a5f78; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #0aa370; } .token.property, .token.function { color: #57718e; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebf4ff; } code.language-javascript, .token.attr-name { color: #7eb6f6; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #47ebb4; } .token.placeholder, .token.variable { color: #47ebb4; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebf4ff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #7eb6f6; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #34659d; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #1f2932; } .line-numbers-rows > span:before { color: #2c3847; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(10, 163, 112, 0.2); background: -webkit-linear-gradient(left, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); background: linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-duotone-space.css ================================================ /* Name: Duotone Space Author: Simurai, adapted from DuoTone themes for Atom (http://simurai.com/projects/2016/01/01/duotone-themes) Conversion: Bram de Haan (http://atelierbram.github.io/Base2Tone-prism/output/prism/prism-base2tone-space-dark.css) Generated with Base16 Builder (https://github.com/base16-builder/base16-builder) */ code[class*="language-"], pre[class*="language-"] { font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; font-size: 14px; line-height: 1.375; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; background: #24242e; color: #767693; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #5151e6; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #5151e6; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #5b5b76; } .token.punctuation { color: #5b5b76; } .token.namespace { opacity: .7; } .token.tag, .token.operator, .token.number { color: #dd672c; } .token.property, .token.function { color: #767693; } .token.tag-id, .token.selector, .token.atrule-id { color: #ebebff; } code.language-javascript, .token.attr-name { color: #aaaaca; } code.language-css, code.language-scss, .token.boolean, .token.string, .token.entity, .token.url, .language-css .token.string, .language-scss .token.string, .style .token.string, .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit, .token.statement, .token.regex, .token.atrule { color: #fe8c52; } .token.placeholder, .token.variable { color: #fe8c52; } .token.deleted { text-decoration: line-through; } .token.inserted { border-bottom: 1px dotted #ebebff; text-decoration: none; } .token.italic { font-style: italic; } .token.important, .token.bold { font-weight: bold; } .token.important { color: #aaaaca; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid #7676f4; outline-offset: .4em; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #262631; } .line-numbers-rows > span:before { color: #393949; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(221, 103, 44, 0.2); background: -webkit-linear-gradient(left, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); background: linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-ghcolors.css ================================================ /** * GHColors theme by Avi Aryan (http://aviaryan.in) * Inspired by Github syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #b3d4fc; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #999988; font-style: italic; } .token.namespace { opacity: .7; } .token.string, .token.attr-value { color: #e3116c; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.entity, .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.property, .token.regex, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-name, .language-autohotkey .token.selector { color: #00a4db; } .token.function, .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.tag, .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.function, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-hopscotch.css ================================================ @import url(https://fonts.googleapis.com/css?family=Fira+Mono); /* * Hopscotch * by Jan T. Sott * https://github.com/idleberg/Hopscotch * * This work is licensed under the Creative Commons CC0 1.0 Universal License */ code[class*="language-"], pre[class*="language-"] { color: #ffffff; font-family: "Fira Mono", Menlo, Monaco, "Lucida Console","Courier New", Courier, monospace; font-size: 16px; line-height: 1.375; direction: ltr; text-align: left; word-spacing: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; background: #322931; color: #b9b5b8; } pre > code[class*="language-"] { font-size: 1em; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #797379; } .token.punctuation { color: #b9b5b8; } .namespace { opacity: .7; } .token.null, .token.operator, .token.boolean, .token.number { color: #fd8b19; } .token.property { color: #fdcc59; } .token.tag { color: #1290bf; } .token.string { color: #149b93; } .token.selector { color: #c85e7c; } .token.attr-name { color: #fd8b19; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #149b93; } .token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { color: #8fc13e; } .token.statement, .token.regex, .token.atrule { color: #149b93; } .token.placeholder, .token.variable { color: #1290bf; } .token.important { color: #dd464c; font-weight: bold; } .token.entity { cursor: help; } pre > code.highlight { outline: .4em solid red; outline-offset: .4em; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-material-dark.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #eee; background: #2f2f2f; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #a5e844; } .token.attribute { color: #a5e844; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.comment { color: #616161; } .token.constant { color: #c792ea; } .token.deleted { color: #ff6666; } .token.doctype { color: #616161; } .token.entity { color: #ff6666; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #616161; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #a5e844; } .token.pseudo-element { color: #a5e844; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #ff6666; } .token.string { color: #a5e844; } .token.symbol { color: #c792ea; } .token.tag { color: #ff6666; } .token.unit { color: #fd9170; } .token.url { color: #ff6666; } .token.variable { color: #ff6666; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-material-light.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #90a4ae; background: #fafafa; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #cceae7; color: #263238; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #cceae7; color: #263238; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #f76d47; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #7c4dff; } .token.attr-name { color: #39adb5; } .token.attr-value { color: #f6a434; } .token.attribute { color: #f6a434; } .token.boolean { color: #7c4dff; } .token.builtin { color: #39adb5; } .token.cdata { color: #39adb5; } .token.char { color: #39adb5; } .token.class { color: #39adb5; } .token.class-name { color: #6182b8; } .token.comment { color: #aabfc9; } .token.constant { color: #7c4dff; } .token.deleted { color: #e53935; } .token.doctype { color: #aabfc9; } .token.entity { color: #e53935; } .token.function { color: #7c4dff; } .token.hexcode { color: #f76d47; } .token.id { color: #7c4dff; font-weight: bold; } .token.important { color: #7c4dff; font-weight: bold; } .token.inserted { color: #39adb5; } .token.keyword { color: #7c4dff; } .token.number { color: #f76d47; } .token.operator { color: #39adb5; } .token.prolog { color: #aabfc9; } .token.property { color: #39adb5; } .token.pseudo-class { color: #f6a434; } .token.pseudo-element { color: #f6a434; } .token.punctuation { color: #39adb5; } .token.regex { color: #6182b8; } .token.selector { color: #e53935; } .token.string { color: #f6a434; } .token.symbol { color: #7c4dff; } .token.tag { color: #e53935; } .token.unit { color: #f76d47; } .token.url { color: #e53935; } .token.variable { color: #e53935; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-material-oceanic.css ================================================ code[class*="language-"], pre[class*="language-"] { text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; color: #c3cee3; background: #263238; font-family: Roboto Mono, monospace; font-size: 1em; line-height: 1.5em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } code[class*="language-"]::-moz-selection, pre[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection, pre[class*="language-"] ::-moz-selection { background: #363636; } code[class*="language-"]::selection, pre[class*="language-"]::selection, code[class*="language-"] ::selection, pre[class*="language-"] ::selection { background: #363636; } :not(pre) > code[class*="language-"] { white-space: normal; border-radius: 0.2em; padding: 0.1em; } pre[class*="language-"] { overflow: auto; position: relative; margin: 0.5em 0; padding: 1.25em 1em; } .language-css > code, .language-sass > code, .language-scss > code { color: #fd9170; } [class*="language-"] .namespace { opacity: 0.7; } .token.atrule { color: #c792ea; } .token.attr-name { color: #ffcb6b; } .token.attr-value { color: #c3e88d; } .token.attribute { color: #c3e88d; } .token.boolean { color: #c792ea; } .token.builtin { color: #ffcb6b; } .token.cdata { color: #80cbc4; } .token.char { color: #80cbc4; } .token.class { color: #ffcb6b; } .token.class-name { color: #f2ff00; } .token.color { color: #f2ff00; } .token.comment { color: #546e7a; } .token.constant { color: #c792ea; } .token.deleted { color: #f07178; } .token.doctype { color: #546e7a; } .token.entity { color: #f07178; } .token.function { color: #c792ea; } .token.hexcode { color: #f2ff00; } .token.id { color: #c792ea; font-weight: bold; } .token.important { color: #c792ea; font-weight: bold; } .token.inserted { color: #80cbc4; } .token.keyword { color: #c792ea; font-style: italic; } .token.number { color: #fd9170; } .token.operator { color: #89ddff; } .token.prolog { color: #546e7a; } .token.property { color: #80cbc4; } .token.pseudo-class { color: #c3e88d; } .token.pseudo-element { color: #c3e88d; } .token.punctuation { color: #89ddff; } .token.regex { color: #f2ff00; } .token.selector { color: #f07178; } .token.string { color: #c3e88d; } .token.symbol { color: #c792ea; } .token.tag { color: #f07178; } .token.unit { color: #f07178; } .token.url { color: #fd9170; } .token.variable { color: #f07178; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-pojoaque.css ================================================ /* * Pojoaque Style by Jason Tate * http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html * Based on Solarized Style from http://ethanschoonover.com/solarized * http://softwaremaniacs.org/media/soft/highlight/test.html */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 15px; line-height: 1.5; color: #dccf8f; text-shadow: 0; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre) > code[class*="language-"] { border-radius: 5px; border: 1px solid #000; color: #DCCF8F; background: #181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top; } pre[class*="language-"] { padding: 12px; overflow: auto; } :not(pre) > code[class*="language-"] { padding: 2px 6px; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #586e75; font-style: italic; } .token.number, .token.string, .token.char, .token.builtin, .token.inserted { color: #468966; } .token.attr-name { color: #b89859; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #dccf8f; } .token.selector, .token.regex { color: #859900; } .token.atrule, .token.keyword { color: #cb4b16; } .token.attr-value { color: #468966; } .token.function, .token.variable, .token.placeholder { color: #b58900; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol { color: #b89859; } .token.tag { color: #ffb03b; } .token.important, .token.statement, .token.deleted { color: #dc322f; } .token.punctuation { color: #dccf8f; } .token.entity { cursor: help; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } /* .pojoaque-colors { color: #586e75; color: #b64926; color: #468966; color: #ffb03b; color: #b58900; color: #b89859; color: #dccf8f; color: #d3a60c; color: #cb4b16; color: #dc322f; color: #073642; color: #181914; } */ ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-shades-of-purple.css ================================================ /** * Shades of Purple Theme for Prism.js * * @author Ahmad Awais * @support Follow/tweet at https://twitter.com/MrAhmadAwais/ */ code[class*='language-'], pre[class*='language-'] { color: #9efeff; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; font-family: 'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-weight: 400; font-size: 17px; line-height: 25px; letter-spacing: 0.5px; text-shadow: 0 1px #222245; } pre[class*='language-']::-moz-selection, pre[class*='language-'] ::-moz-selection, code[class*='language-']::-moz-selection, code[class*='language-'] ::-moz-selection, pre[class*='language-']::selection, pre[class*='language-'] ::selection, code[class*='language-']::selection, code[class*='language-'] ::selection { color: inherit; background: #a599e9; } /* Code blocks. */ pre[class*='language-'] { padding: 2em; margin: 0.5em 0; overflow: auto; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #1e1e3f; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; } .token { font-weight: 400; } .token.comment, .token.prolog, .token.cdata { color: #b362ff; } .token.delimiter, .token.keyword, .token.selector, .token.important, .token.atrule { color: #ff9d00; } .token.operator, .token.attr-name { color: rgb(255, 180, 84); } .token.punctuation { color: #ffffff; } .token.boolean { color: rgb(255, 98, 140); } .token.tag, .token.tag .punctuation, .token.doctype, .token.builtin { color: rgb(255, 157, 0); } .token.entity, .token.symbol { color: #6897bb; } .token.number { color: #ff628c; } .token.property, .token.constant, .token.variable { color: #ff628c; } .token.string, .token.char { color: #a5ff90; } .token.attr-value, .token.attr-value .punctuation { color: #a5c261; } .token.attr-value .punctuation:first-child { color: #a9b7c6; } .token.url { color: #287bde; text-decoration: underline; } .token.function { color: rgb(250, 208, 0); } .token.regex { background: #364135; } .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.inserted { background: #00ff00; } .token.deleted { background: #ff000d; } code.language-css .token.property, code.language-css .token.property + .token.punctuation { color: #a9b7c6; } code.language-css .token.id { color: #ffc66d; } code.language-css .token.selector > .token.class, code.language-css .token.selector > .token.attribute, code.language-css .token.selector > .token.pseudo-class, code.language-css .token.selector > .token.pseudo-element { color: #ffc66d; } .token.class-name { color: #fb94ff; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { background: none; } pre .line-highlight, pre .line-highlight.line-highlight, pre > code.line-highlight { margin-top: 36px; background: linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent); } pre .line-highlight:before, pre > code.line-highlight:before, pre .line-highlight[data-end]:after, pre > code.line-highlight[data-end]:after { content: ''; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-synthwave84.css ================================================ /* * Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code * Demo: https://marc.dev/demo/prism-synthwave84 * * Ported for PrismJS by Marc Backes [@themarcba] */ code[class*="language-"], pre[class*="language-"] { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; background: none; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background-color: transparent !important; background-image: linear-gradient(to bottom, #2a2139 75%, #34294f); } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.block-comment, .token.prolog, .token.doctype, .token.cdata { color: #8e8e8e; } .token.punctuation { color: #ccc; } .token.tag, .token.attr-name, .token.namespace, .token.number, .token.unit, .token.hexcode, .token.deleted { color: #e2777a; } .token.property, .token.selector { color: #72f1b8; text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475; } .token.function-name { color: #6196cc; } .token.boolean, .token.selector .token.id, .token.function { color: #fdfdfd; text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975; } .token.class-name { color: #fff5f6; text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75; } .token.constant, .token.symbol { color: #f92aad; text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; } .token.important, .token.atrule, .token.keyword, .token.selector .token.class, .token.builtin { color: #f4eee4; text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575; } .token.string, .token.char, .token.attr-value, .token.regex, .token.variable { color: #f87c32; } .token.operator, .token.entity, .token.url { color: #67cdcc; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } .token.inserted { color: green; } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-vs.css ================================================ /** * VS theme by Andrew Lock (https://andrewlock.net) * Inspired by Visual Studio syntax coloring */ code[class*="language-"], pre[class*="language-"] { color: #393A34; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: .9em; line-height: 1.2em; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #C1DEF1; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { background: #C1DEF1; } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; border: 1px solid #dddddd; background-color: white; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .2em; padding-top: 1px; padding-bottom: 1px; background: #f8f8f8; border: 1px solid #dddddd; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #008000; font-style: italic; } .token.namespace { opacity: .7; } .token.string { color: #A31515; } .token.punctuation, .token.operator { color: #393A34; /* no highlight */ } .token.url, .token.symbol, .token.number, .token.boolean, .token.variable, .token.constant, .token.inserted { color: #36acaa; } .token.atrule, .token.keyword, .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, .language-json .token.number, code[class*="language-css"]{ color: #0000ff; } .token.function { color: #393A34; } .token.deleted, .language-autohotkey .token.tag { color: #9a050f; } .token.selector, .language-autohotkey .token.keyword { color: #00009f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.class-name, .language-json .token.property { color: #2B91AF; } .token.tag, .token.selector { color: #800000; } .token.attr-name, .token.property, .token.regex, .token.entity { color: #ff0000; } .token.directive.tag .tag { background: #ffff00; color: #393A34; } /* overrides color-values for the Line Numbers plugin * http://prismjs.com/plugins/line-numbers/ */ .line-numbers .line-numbers-rows { border-right-color: #a5a5a5; } .line-numbers-rows > span:before { color: #2B91AF; } /* overrides color-values for the Line Highlight plugin * http://prismjs.com/plugins/line-highlight/ */ .line-highlight { background: rgba(193, 222, 241, 0.2); background: -webkit-linear-gradient(left, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); background: linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0)); } ================================================ FILE: vi/gitbook/gitbook-plugin-prism/prism-xonokai.css ================================================ /** * xonokai theme for JavaScript, CSS and HTML * based on: https://github.com/MoOx/sass-prism-theme-base by Maxime Thirouin ~ MoOx --> http://moox.fr/ , which is Loosely based on Monokai textmate theme by http://www.monokai.nl/ * license: MIT; http://moox.mit-license.org/ */ code[class*="language-"], pre[class*="language-"] { -moz-tab-size: 2; -o-tab-size: 2; tab-size: 2; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre; white-space: pre-wrap; word-wrap: normal; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 14px; color: #76d9e6; text-shadow: none; } pre > code[class*="language-"] { font-size: 1em; } pre[class*="language-"], :not(pre)>code[class*="language-"] { background: #2a2a2a; } pre[class*="language-"] { padding: 15px; border-radius: 4px; border: 1px solid #e1e1e8; overflow: auto; } pre[class*="language-"] { position: relative; } pre[class*="language-"] code { white-space: pre; display: block; } :not(pre)>code[class*="language-"] { padding: 0.15em 0.2em 0.05em; border-radius: .3em; border: 0.13em solid #7a6652; box-shadow: 1px 1px 0.3em -0.1em #000 inset; } .token.namespace { opacity: .7; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6f705e; } .token.operator, .token.boolean, .token.number { color: #a77afe; } .token.attr-name, .token.string { color: #e6d06c; } .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #e6d06c; } .token.selector, .token.inserted { color: #a6e22d; } .token.atrule, .token.attr-value, .token.keyword, .token.important, .token.deleted { color: #ef3b7d; } .token.regex, .token.statement { color: #76d9e6; } .token.placeholder, .token.variable { color: #fff; } .token.important, .token.statement, .token.bold { font-weight: bold; } .token.punctuation { color: #bebec5; } .token.entity { cursor: help; } .token.italic { font-style: italic; } code.language-markup { color: #f9f9f9; } code.language-markup .token.tag { color: #ef3b7d; } code.language-markup .token.attr-name { color: #a6e22d; } code.language-markup .token.attr-value { color: #e6d06c; } code.language-markup .token.style, code.language-markup .token.script { color: #76d9e6; } code.language-markup .token.script .token.keyword { color: #76d9e6; } /* Line highlight plugin */ pre[class*="language-"][data-line] { position: relative; padding: 1em 0 1em 3em; } pre[data-line] .line-highlight { position: absolute; left: 0; right: 0; padding: 0; margin-top: 1em; background: rgba(255, 255, 255, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } pre[data-line] .line-highlight:before, pre[data-line] .line-highlight[data-end]:after { content: attr(data-start); position: absolute; top: .4em; left: .6em; min-width: 1em; padding: 0.2em 0.5em; background-color: rgba(255, 255, 255, 0.4); color: black; font: bold 65%/1 sans-serif; height: 1em; line-height: 1em; text-align: center; border-radius: 999px; text-shadow: none; box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); } pre[data-line] .line-highlight[data-end]:after { content: attr(data-end); top: auto; bottom: .4em; } ================================================ FILE: vi/gitbook/gitbook.js ================================================ !function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=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)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,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(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(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(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!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,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.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:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.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 A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(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&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(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&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.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):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.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=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.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)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.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,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,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":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.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 de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de("

Project V

Project V là một tập hợp các công cụ giúp bạn xây dựng mạng riêng tư qua internet. Cốt lõi của Project V, có tên là V2Ray, chịu trách nhiệm về các giao thức mạng và truyền thông. Nó có thể làm việc một mình, cũng như kết hợp với các công cụ khác.

Trang web này chủ yếu là một hướng dẫn cho V2Ray, với một số thông tin bổ sung liên quan đến toàn bộ dự án.

Tính năng, đặc điểm

  • Nhiều proxy gửi đến / đi: một cá thể V2Ray hỗ trợ song song nhiều giao thức trong và ngoài. Mỗi giao thức hoạt động độc lập.
  • Định tuyến tùy chỉnh: lưu lượng truy cập đến có thể được gửi đến các giới hạn khác nhau dựa trên cấu hình định tuyến. Thật dễ dàng để định tuyến lưu lượng truy cập theo vùng hoặc miền mục tiêu.
  • Nhiều giao thức: V2Ray hỗ trợ nhiều giao thức, bao gồm Socks, HTTP, Shadowsocks, VMess, vv Mỗi giao thức có thể có giao vận riêng của nó, chẳng hạn như TCP, mKCP, WebSocket, v.v.
  • Obfuscation: V2Ray đã xây dựng trong obfuscation để ẩn lưu lượng truy cập trong TLS, và có thể chạy song song với các máy chủ web.
  • Reverse proxy: Hỗ trợ chung proxy ngược. Có thể được sử dụng để xây dựng đường hầm cho localhost.
  • Nhiều nền tảng: V2Ray chạy nguyên bản trên Windows, Mac OS, Linux, v.v. Ngoài ra còn có hỗ trợ của bên thứ ba trên thiết bị di động.

Sponsors

v2net

This site is generated by GitBook, and host on GitHub. If you'd like to modify its content, please send pull request to this repo.

================================================ FILE: vi/styles/website.css ================================================ .book-summary { font-family: "Helvetica Neue", "Open Sans", sans-serif; font-size: 14px; } .book-header .btn { padding: 0 5px; } .markdown-section { font-family: "Helvetica Neue", "Open Sans", sans-serif; font-weight: 400; font-size: 14px; } .markdown-section pre>code { font-family: "Source Code Pro", monospace; font-weight: 400; font-size: 14px; } .markdown-section code:not([class]) { white-space: nowrap; padding: 0; } .markdown-section blockquote { margin: 0; margin-bottom: .85em; padding: 0 15px; border-left: 4px solid #64b5f6; border-top: 1px solid #64b5f6; color: #000000; margin-top: 10px; } ================================================ FILE: vi/ui_client/README.md ================================================ --- refcn: ui_client/index refen: ui_client/index --- # Project V Clients Bên cạnh V2ray lõi, Project V bao gồm nhiều ứng dụng khách GUI khác nhau trên nhiều nền tảng. Vui lòng xem danh sách sau đây để ủng hộ bạn. * [các cửa sổ](windows.md) * [Mac OS X](osx.md) * [iOS](ios.md) * [Android](android.md) * [Dịch vụ trực tuyến](ui_client/service.md) ================================================ FILE: vi/ui_client/android.md ================================================ --- refcn: ui_client/android refen: ui_client/android --- # Ứng dụng khách Android ## BifrostV BifrostV là một ứng dụng Android dựa trên lõi V2Ray. Nó hỗ trợ VMess, Shadowsocks, giao thức vớ. * Tải xuống: [Cửa hàng Play](https://play.google.com/store/apps/details?id=com.github.dawndiy.bifrostv) * Tải xuống: [APK thuần túy](https://apkpure.com/bifrostv/com.github.dawndiy.bifrostv) ## V2RayNG V2RayNG là một ứng dụng Android dựa trên V2Ray. Nó cung cấp cùng một tính năng được đặt làm lõi V2Ray. * Tải xuống: [Cửa hàng Play](https://play.google.com/store/apps/details?id=com.v2ray.ang) * Nguồn: [GitHub](https://github.com/2dust/v2rayNG) ## V2Ray Go * Tải xuống: [Cửa hàng Play](https://play.google.com/store/apps/details?id=org.kkdev.v2raygo) * Nguồn: [Github](https://github.com/xiaokangwang/V2RayGO) ## Actinium * Tải xuống: Cửa hàng Play (Không khả dụng) * Nguồn: [Github](https://github.com/V2Ray-Android/Actinium) ## Các công cụ khác {#other} ### JuiceSSH SSH client. * Tải xuống: [Cửa hàng Play](https://play.google.com/store/apps/details?id=com.sonelli.juicessh) * Trang web: [JuiceSSH.com](https://juicessh.com/) ### Termius Ứng dụng SSH * Tải xuống: [Cửa hàng Play](https://play.google.com/store/apps/details?id=com.server.auditor.ssh.client) ### Telegram Thảo luận được mã hóa. * Trang web: [telegram.org](https://telegram.org/) * Tải xuống: [Cửa hàng Play](https://play.google.com/store/apps/details?id=org.telegram.messenger) ================================================ FILE: vi/ui_client/ios.md ================================================ --- refcn: ui_client/ios refen: ui_client/ios --- # Ứng dụng khách iOS ## Kitsunebi Kitsunebi là một ứng dụng iOS dựa trên V2Ray. Nó cung cấp đầy đủ chức năng như V2Ray. Nó cũng hỗ trợ nhập và xuất cấu hình JSON tương thích V2Ray. * Download: [iTunes](https://itunes.apple.com/us/app/kitsunebi-proxy-utility/id1446584073?mt=8) ## Kitsunebi Lite Phiên bản nhẹ của Kitsunebi. * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/kitsunebi-lite/id1387913765/) ## Shadowrocket Shadowrocket là một ứng dụng VPN chung. Hỗ trợ nhiều giao thức như Shadowsocks, VMess, SSR, v.v. * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/shadowrocket/id932747118/) ## Pepi (là ShadowRay) {#pepi} Pepi là ứng dụng tương thích V2Ray. Có thể tạo các kết nối VPN dựa trên giao thức VMess và giao tiếp với bất kỳ máy chủ V2Ray nào. * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/pepi/id1283082051/) ## Quantumult * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/quantumult/id1252015438/) ## Các công cụ khác {#other} ### HyperApp Một tiện ích để xây dựng các máy chủ với docker. * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/hyperapp/id1179750280/) * Trang web: [HyperApp.fun](https://www.hyperapp.fun/) ### Termius SSH client. * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/termius/id549039908/) ### Telegram Thảo luận được mã hóa. * Trang web: [telegram.org](https://telegram.org/) * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/telegram-messenger/id686449807/) ### ProtonMail Email được mã hóa. * Trang web: [protonmail.com](https://protonmail.com/) * Tải xuống: [iTunes](https://www.v2ray.com/itunes/us/protonmail-encrypted-email/id979659905/) ================================================ FILE: vi/ui_client/osx.md ================================================ --- refcn: ui_client/osx refen: ui_client/osx --- # Mac OS X ## V2RayX * Tải xuống: [Github](https://github.com/Cenmrev/V2RayX) ## V2RayU * Download: [Github](https://github.com/yanue/V2rayU) ## Other tools {#other} ### Visual Studio Code Trình chỉnh sửa mã nguồn từ Microsoft. * Website: [code.visualstudio.com](https://code.visualstudio.com/) ### Telegram Thảo luận được mã hóa. * Website: [telegram.org](https://telegram.org/) * Download: [Mac App Store](https://www.v2ray.com/itunesm/us/telegram-desktop/id946399090/) ### Ứng dụng khách Microsoft Remote Desktop Connection * Download: [Mac App Store](https://www.v2ray.com/itunesm/us/microsoft-remote-desktop/id715768417/) ================================================ FILE: vi/ui_client/service.md ================================================ --- refcn: ui_client/service refen: ui_client/service --- # Dịch vụ trực tuyến The following online services may help you better use Project V. These services are provided by third party. They are not directly releated to Project V. ## V2Ray có liên quan * [Trình tạo cấu hình](https://htfy96.github.io/v2ray-config-gen/) * [Máy phát điện UUID](https://www.uuidgenerator.net/) ## VPN * [BabyDriver](http://babydriver.me/): Hỗ trợ V2Ray. Mã phiếu giảm giá: bcb518 * [喵 帕斯](https://xn--i2ru8q2qg.com/): Hỗ trợ V2Ray (beta) * [Lanan](https://xn--sjt174g.com/): V2Ray dựa trên dịch vụ VPN. Mã phiếu giảm giá: v2ray * [多数 派](https://dspi.io/aff.php?aff=7): Dịch vụ VPN dựa trên V2Ray mới. * [V2rayPro](https://myv2.us/): VPN service based on V2Ray. Coupon code: v2ray.com * [V2Net](http://v2net.org/): Customized V2Ray service. Promo code: v2ray.com ## Hosting * [Hãy mã hóa](https://letsencrypt.org/): Chứng chỉ TLS miễn phí * [Vultr](https://www.vultr.com/?ref=7269307): VPS * [2019 limited promotion, $50 free credit](https://www.vultr.com/?ref=7783021-4F) * [BlueHost](https://www.bluehost.com/track/v2ray/): VPS, web hosting * [ClouDNS](https://www.cloudns.net/aff/id/244749/): Domain registration, DNS, SSL certificate ## Cryptocurrency * [LocalBitcoins](https://localbitcoins.com/?ch=khtm): Trade Bitcoins offline * [CoinCola](https://www.coincola.com/mobile/signup?ref=QAcvfy2g): OTC market to trade BTC, ETH, BCH, USDT. * [Binance](https://www.binance.com/?ref=35382451): Trading market for crypto currencies. * [Coinex](https://www.coinex.com/account/signup?refer_code=r3fmp): Trading market for crypto currencies. * [CoinPayment](https://www.coinpayments.net/index.php?ref=abc5f542afed6b37b4b3d7fb83242d18): Online crypto currency wallet * [PrimeDice](https://primedice.com/?c=default): Dice game with bitcoin. * [OneHash](https://www.onehash.com/?ap=56d52158f7e04b169ec54d): Bet sport games with Bitcoin, including World Cup 2018. * [Bitsler](https://www.bitsler.com/?ref=VictoriaR): Casino games with Bitcoin. ================================================ FILE: vi/ui_client/windows.md ================================================ --- refcn: ui_client/windows refen: ui_client/windows --- # các cửa sổ ## V2RayW * Tải xuống: [Github](https://github.com/Cenmrev/V2RayW) ## V2RayN * Tải xuống: [Github](https://github.com/2dust/v2rayN) ## V2RayS * Tải xuống: [Github](https://github.com/Shinlor/V2RayS) ## Các công cụ khác {#other} ### PuTTY SSH client. * Trang web: [putty.org](http://www.putty.org/) ### Visual Studio Code Trình chỉnh sửa mã nguồn từ Microsoft. * Trang web: [code.visualstudio.com](https://code.visualstudio.com/) ### Telegram Thảo luận được mã hóa. * Trang web: [telegram.org](https://telegram.org/) ================================================ FILE: vi/welcome/command.html ================================================ Dòng lệnh · Project V Official

Dòng lệnh

V2Ray

V2Ray có các tham số dòng lệnh sau:

v2ray [-version] [-test] [-config=config.json] [-format=json]

-phiên bản

Chỉ in phiên bản V2Ray và sau đó thoát.

-kiểm tra

Kiểm tra cấu hình, xuất ra bất kỳ lỗi nào và sau đó thoát ra.

-config

URI của cấu hình. Định dạng Avilable là:

  • Đường dẫn đến tệp cấu hình cục bộ. Có thể là đường dẫn tương đối hoặc đường dẫn tuyệt đối.
  • "stdin:": Cho biết V2Ray để đọc cấu hình từ đầu vào tiêu chuẩn. Người gọi phải đóng stdin sau khi viết cấu hình.
  • Giá trị bắt đầu bằng http: // hoặc https: // (chữ thường): V2Ray cố tải cấu hình từ địa chỉ từ xa.

-định dạng

Định dạng cấu hình. Lựa chọn là:

  • json: Định dạng JSON.
  • pb hoặc protobuf: Định dạng Protobuf.

Khi -config không được chỉ định, V2Ray đầu tiên cố gắng tải cấu hình từ config.json trong thư mục làm việc, sau đó từ thư mục được chỉ định bởi biến môi trường v2ray.location.asset.

V2Ctl

V2Ctl is a collection of commandline tools. It runs in the following way:

v2ctl <command> <options>

command

Subcommand. Available values are below:

  • api: Invoke remote control commands in V2Ray instances.
  • config: Convert configuration from JSON format to protobuf.
  • cert: Generate TLS certificates.
  • fetch: Fetch remove resources.
  • tlsping: (V2Ray 4.17+) Test TLS handshake.
  • verify: Verify the signature of V2Ray releases.
  • uuid: Generate UUID.

V2Ctl Api

v2ctl api [--server=127.0.0.1:8080] <Service.Method> <Request>

Invoke remote control commands in V2Ray instances. Example:

v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger ''

V2Ctl Config

v2ctl config

No option for this command. It reads JSON configuration from stdin, and print out corresponding Protobuf to stdout, if succeeds.

V2Ctl Cert

v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h] [--name="V2Ray Inc"] [--org="V2Ray Inc] [--json] [--file=v2ray]

Generates a TLS certificate based on options.

--ca

If specified, the certificate will be a CA certificate.

--domain

Alternative Names in the certificate. This option can be used multiple times for multiple domains. For example: --domain=v2ray.com --domain=v2ray.cool.

--expire

Expire date of the certificate. Value is a Golang duration.

--name

Command Name in the certificate.

--org

Orgnization in the certificate.

--json

If specified, the certificate will be printed to stdout in the JSON format that is used in V2Ray.

--file

Prints the certificate into files. When --file=a, two files named a_cert.pem and a_key.pem will be generated.

V2Ctl Fetch

v2ctl fetch <url>

Fetch remove resources and print to stdout. Only HTTP and HTTPS URL are supported.

V2Ctl TlsPing

v2ctl tlsping <domain> --ip=[ip]

Test TLS handlshake with specific domain.

domain

Target domain for the TLS handshake.

--ip

The IP address of the domain. If not specifed, V2Ctl resolves it through system DNS.

V2Ctl Verify

v2ctl verify [--sig=/path/to/sigfile] <filepath>

To verify the signature of a V2Ray binary.

--sig

Path to signature file. Default value is the ".sig" file to the path to be verified.

filepath

The file to be verified.

V2Ctl UUID

v2ctl uuid

No options. This command prints a random UUID.

================================================ FILE: vi/welcome/donate.html ================================================ Quyên góp · Project V Official

Quyên góp

V2Ray is a nonprofit project. The source code and its release binary can be used freely (mainly) under MIT licence. If you like this project, you may buy us a cup of coffee.

Your donation has no direct connection to Project V's development and service. Our development will not be influenced by your donation. However, we will send a thank-you email for every donor. If you wish not to receive such email, please leave a note in your donation.

For any donation worth more than $50, you may choose one of the following:

  • Your name or your company log shown on our front page for one month.
  • Modify our codebase as you wish. Restrictions: No user facing functionlity changes; no documentation changes. Your change will stay for a month.

Cách thông thường

Paypal

You may donate through internal Paypal transfer or credit card

Please kindly note that Paypal charges high service fee. Any donation less than 1 USD is meaningless.

Patreon

Patreon is a platform for regular donations. You may use Patreon if you want to donate frequently.

Giftcard

For now we only receive giftcard for Amazon US. You may purchase it at Amazon.com and then send to love@v2ray.com.

Tiền điện tử

Cryptocurrency is a more reliable way for international transactions. Crypto-wallet is usually anonymous and your donation is not traceable.

Due to the anonymity natural of cryptocurrenty, please send us an email before your donation, if you want to receive the thank-you email.

Bitcoin

Address: 3GctrB7R5sMhJ73N4AKo56Bdf9RE3RJsuM

View stats or QR-Code at BlockChain

Bitcoin Cash

Address: 15oATKUq5mEfuzasPnsJ58TjJU5SvDJK97

View stats or QR-Code at BlockChain

Ethereum

Address: 0x112ee71189704fe04cabed4aa045f4461c8c8696

View stats or QR-Code at BlockChain. You may also send the following ERC20 tokens to this address: OMG, REP, GNT, DGD

EOS

Address: EOS8Civdok4CBN3jCpsaGQijzesjKof1eyaRFuBU5mLMtWVkLsy8a

Litecoin

Address: LVdeH2HkCgGRs8ZEpan7fkAEEPbiJ4McoR

Monero

Address: 48kA4NyLRCWQvB7U2A77G66Z25uWbyzmoZSYjxJfrMR1J4dRFW6fWFLDn3wirAqP8ySnR4rnvoXWxfkNFhrK5ZxY1WyBqKg

Ripple

Address: r439fPk8DzCf4nSxkpfodEuE2cG4KVZQHq

Tag not required

Other

Please send us an email at love@v2ray.com if you want to donate other kind of coins.

================================================ FILE: vi/welcome/faq.html ================================================ Câu hỏi thường gặp · Project V Official

Câu hỏi thường gặp (FAQ)

Sử dụng V2Ray

Cách nâng cấp V2Ray

  • Tải xuống gói mới nhất hoặc
  • Chạy lại tập lệnh cài đặt (chỉ dành cho Linux)

Lỗi V2Ray

  • Nếu bạn đang sử dụng Linux với systemd, bạn có thể xem nhật ký hoảng loạn bằng lệnh journalctl -u v2ray.
  • Nói chung bạn có thể chạy lệnh v2ray -config =<config-file> -test để xem thông tin lỗi.

Backward Compatibility

  • For configuration file (e.g., JSON), backward compatibility applies to at least one major releases. For example, V2Ray 4.x supports config files from V2Ray 3.x.
  • For Protobuf based communication protocols, such as Api, backward compatibility applies to at least one major releases.
  • For binary based commnunication protocols, such as Shadowsocks and VMess, it is always backward compatible when server version is not older than clients. When client version is newer, backward compatibility applies to at least 12 minor releases.

Lỗi V2Ray

Socks: Unknown Socks version: 67

Nguyên nhân có thể

  • You are using socks inbound in V2Ray, but your browser is configured to use HTTP proxy.

Dung dịch

  • Add a HTTP inbound in V2Ray, and then update your browser proxy settings to use this proxy.

Giấy phép của dự án này

Project V sử dụng giấy phép sau.

V2Ray

Mã nguồn và các bản phát hành chính thức được cấp phép theo giấy phép MIT, bao gồm mã nguồn và các bản phát hành trong kho lưu trữ sau.

V2Ray.Com

Trang web chính thức, v2ray.com, được cấp phép theo Giấy phép Creative Commons Ghi công 4.0 Quốc tế.

  • Including all visible text and pictures on the website.
  • Including Project V logo.
  • Including all source code that is used for generating the website, i.e., v2ray/manual.

Screenshot and other files

Tất cả các tệp của bên thứ ba được liệt kê bên dưới đều thuộc về người tạo của họ. Bất kỳ ai tạo tệp đều sở hữu tệp.

  • Including all screenshots of Project V.
  • Including all configuration files that are used to run Project V.
  • Including all logs generated by Project V during runtime.

Other content

Tất cả nội dung không được đề cập ở trên sẽ được cấp phép theo từng trường hợp.

================================================ FILE: vi/welcome/help.html ================================================ Ủng hộ · Project V Official

Ủng hộ

Project V cung cấp nhiều phương thức cho truyền thông.

Nhóm dự án V hỗ trợ tiếng Trung và tiếng Anh. Vui lòng chọn một trong hai câu hỏi bạn quen thuộc.

Vấn đề Github

Chúng tôi sử dụng một số kho lưu trữ cho các loại thảo luận khác nhau.

Telegram

Dự án V cung cấp các nhóm sau cho các loại thảo luận khác nhau.

  • Sử dụng
    • Chỉ dành cho các chủ đề liên quan đến Project V.
  • Khác
    • Đối với các chủ đề khác.

Các chủ đề trong các nhóm này chủ yếu là tiếng Trung. Vui lòng thiết lập các nhóm bằng ngôn ngữ của riêng bạn và cho chúng tôi biết.

Tất cả các nhóm thảo luận đều cấm các chủ đề sau: nội dung người lớn, chính trị, ngôn từ kích động thù địch. Người gửi các chủ đề này sẽ bị cấm hoàn toàn.

Ngoài ra, hãy làm theo Thông báo dự án V để biết tin tức.

Twitter

ProjectV2Ray để liên lạc thường xuyên.

E-mail

Vui lòng gửi thư đến một trong những địa chỉ dưới đây, nếu bạn muốn nói chuyện riêng với nhóm V2Ray.

love@v2ray.com: Địa chỉ email chính để liên lạc. Kiểm tra hàng ngày.

v2ray@protonmail.com: Hộp thư ProtonMail sử dụng mã hóa kết thúc đến cuối. Rất khó sử dụng và chỉ thỉnh thoảng được kiểm tra.

Đáng buồn là do khối lượng công việc cao, nó không phải là hứa rằng mỗi email được trả lời. Xin lỗi vì sự bất tiện. Đối với các câu hỏi chung, vui lòng sử dụng các nhóm thảo luận ở trên để phản hồi nhanh.

Bạn có thể nhận khóa công khai PGP bằng cách tìm kiếm love@v2ray.comhoặc sử dụng khóa công khai bên dưới.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org

mQINBFaPeDABEADAbh3mk58UbKKWndztFKchtTRzU2xFWWRHTdYaNv7Eoo06wrxu
3eglp0vn+16DIfru4H62TQMS/XSvxib90c4c1tQ4FndVSzv896/IplLKzdrtgn85
c9eEX4V5b/tKKUmyrG593A/oDdsrpwaIgbNJdzbfqh7WLYESAevRkFJmBZMgfObs
0pVO/dX6TqS8iV/ARDPbPAzuLosTWXkrRi2+JQmEOKePLsdypRMV9bcgymDA8N6w
EyGzHyZ2I4wAALtjHXipWFYSZ/4ZK9q9H8G0XV/pk9Y4OFLPGR7T3VCtMwVMhGZk
CgtcwGOUoE68a/bb9P4FowONnM7tqjM5ef30qNbwe8dMY5DvThffEqQ70LnNc9sj
OpJF6njxV9ktjjLa3imAB5AStfwX1mBTkQTwnlqAU4pVFcMD6/z+kRFTZGP9nbcY
cxu5Fg1VVBHHbpgWS39uiwzIBSWVfZj2iHOPcJd9SCZW5xvClcVb1KsU9UD+D88m
uWBp3TUmxf0f53Uo7Flka1a7MyAEhfcorYsaRioqtPxTZ1z7oYbPLRqLbwmln/YV
va8XIINQ0hI5phz9kly76ksUqYSz1DRe924/1BwLMs1VzeayB81tOctYd3I7I0aF
5bF+RLWk0mvYgDBhw/be03PMn17OAkmR6IKNsFcowByNiNaVCLqoE8YVqQARAQAB
tCFWaWN0b3JpYSBSYXltb25kIDxsb3ZlQHYycmF5LmNvbT6JAj0EEwEKACcFAlaP
eDACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQV4XalIxIroqu
ORAAoZNV6LVaDIxjJgH7BFh0oDNEa7Qac+INxkqd62cAmN3vAEF0PlwUhcz80twY
WvSPMwiLg85wdg/TzM8Ps8umWT6d9rhpkWnlZWyRFYJBpxn6vOpg0OHsgZpJ2+IM
iREmjK4sYFvuJjGi9e/BT0Mh2+ObcJejwd/+w5vhKb5seva+hw9Fyq569Y2+KMWG
1M29n3c7NZ6+abYuynxjGdHKOzaTUEGfjrGLZqROD7gb+xtXhBjqKr6jnYlZBAo5
iEAgnnzbiuDoa6Au+PosB2XZQ+rkecu/3AvmTYZ3wcEJt3FC4Gf9jY2A16ypmArm
ak2cmLAlz9CIXllFHjqvAHF68UCx2ptxzG3MoWhDFqws09zKSpwLcLdiAWbw//MM
otzeekx3+b+fjMUa4Eyjg5CvBN0wv2IbEjti744b3HWXW9yOIDrsTrMd8iixfjAe
3rt9egqTJkLlE8e57Rqnd3E8GpM6LWx8uYXo1aSFxayjJvf+Rvb4VzDA0DHElD2Q
dRVXJ/mhd14RHDc2QtERcF69GZZ79GFLcTMcXXBlQMDsY0vwBJ56Gi/IGImz9JpT
swSlU05VSdosMcr01niYoA9BEQjm9Smgd/1b+8qZEAIfvad+SabIRiDacOpN3xSh
SZzLzIkPukbEp+5hzXt7x22w9M+D6W0Oo22hS8zfV1ZavUa5Ag0EVo94MAEQANoc
tlwqgv2T372ucpnalh6js8Y/0KkpaevFK6pguZMP6frLX1J05mt+YRUp2UADeqGt
kuGEiXFZ5cr+smngF0l0HbRkflnILV7wd1WJJmQnvtAbfJfO+tovawUhQH19dLkB
8KMULcgs0Hrf7QLwus6zs9q0ASu/KkDuQj9gruwWfxk4W5MOQZohk0JcJAZAaBy/
ojKxz/91YjP3JEEzZuLqLiOz4RK38UBi96u5NEkqrmwCe6SAtpCHsa0dpj6LYZ1y
1ITmYSUnRwgol/UTRNySkZ2PozX6YFXrdZYtuWir0VClw50tFFkIOCaoT3Q5FpCO
SSS8smLjT9AAr8U3OZNTfNCQtFSNo8FUBYhXmMgskRC7oeV+t6LJ3rdJxgdaFcA+
GWL4srMedqxmbmW+8CYGIImmurjTy+C9zAtH88NFMYDnG312IIo9Cse3LnYl7eO/
KBd3YNvCL096Yqd4B/31fFy74/HaGEfNH7jwLvaY4moRdTff4kBERj7u39UE/jG/
b4NXmnezUZ55qkYQahoPkUIMzF0tn5bOIh1DOg55Wu/ZYe7DQJVE9L6te6KTxALy
ycD4WtQaP58SZpxHhGzEjEicPsPE1PpyRoW+Dl8lL+ppMbCl9zAV++BjkNeL5xZN
dsCtx/jbh+44X9VtK3G+2sdfdC6TqRbW/lELc8P7ABEBAAGJAiUEGAEKAA8FAlaP
eDACGwwFCQeGH4AACgkQV4XalIxIrorw8RAAg4L9/s8eg90qhslfPjWzvMyi7RvV
9erHwMB1utxjFDHKknTds2CvnS5JzjpjiT4BT8ICD9cetSP3d7WRNT/XmveeJXjB
TCxmswrT4H451qsGsCg9eiKIV2is/GolHLnKAvEHICRGsFeCRSB2rNkgWSQ/YJIt
6vLP1SvwTNY/Y8tyChSbCDaUpvmn4sYf6Qop1Svmn299+22ZVUBp20szsNw233SJ
IZL0WxSdrMqTdVsZ70m6VEOjOSa15yLryZrwN9U7qbpe2MmuygI90TVGQK4nLZG+
2XH2YVtBNTl9ZiFdpwq8d7+eMGcStKYQcdy6IZDd3cOeb2sTMUG31HJS3efTmSrT
tZpOz8TDeNjami78zR5qcW1VmGYbxlZHEhQnpG3U4qWRUZsy5TOYIXKHqCNc3rYH
iixcKE3UcyHBF7XjdKgpKtsgZfKoDXFz3XATJEeW80GEG05GVMoD9Yvf96Q7lvC6
U83vL8mHNjuG60KvBk7A9grYaVFioqRvbTdPf41G+tJpYKrHSJXPGglxHnzvBfiD
WWJIBRTyaCCglZLZ/a1sCsT1DciDWQoqqH7DuK2YvMXG3IDaOfoKAE/uW31azT0B
X7R92mxQ+gCZgePwG4gOE/xAqHZh84VzdWZJ4cehPgHa/z/enqbQbiQAwTXld4Wt
PeRpd1GUXXeoGCw=
=To5T
-----END PGP PUBLIC KEY BLOCK-----
================================================ FILE: vi/welcome/install.html ================================================ cài đặt, dựng lên · Project V Official

Tải xuống & Cài đặt

Nền tảng

V2Ray có sẵn trên các nền tảng sau:

  • Windows 7 trở lên (x86 / amd64)
  • Mac OS X 10.10 Yosemite trở lên (amd64)
  • Linux phiên bản 2.6.23 trở lên (x86 / amd64 / arm / arm64 / mips64 / mips)
    • Bao gồm nhưng không giới hạn ở Debian 7/8, Ubuntu 12.04 / 14.04 trở lên, CentOS 6/7, Arch Linux
  • FreeBSD (x86 / amd64)
  • OpenBSD (x86 / amd64)
  • Dragonfly BSD (amd64)

Tải về

Bạn có thể tìm thấy các gói dựng sẵn tại đây:

  1. Phát hành Github: github.com/v2ray/v2ray-core
  2. Redistribution: github.com/v2ray/dist
  3. Homebrew: github.com/v2ray/homebrew-v2ray
  4. Arch Linux: gói / cộng đồng / x86_64 / v2ray /
  5. Snapcraft: snapcraft.io/v2ray-core

Tất cả các gói đều ở định dạng ZIP. Tải xuống và giải nén các gói tương ứng vào hệ thống của bạn.

Kiểm chứng

Có 2 cách để xác minh gói.

  1. Mỗi tệp .zip có tệp .dgst tương ứng với các tệp SHA.
  2. Tập tin chữ ký GPG cho các tập tin thực thi (v2ray / v2ray.exe) có thể được tìm thấy trong v2ray.sig (hoặc v2ray.exe.sig) trong cùng một gói. Khóa công khai là trong kho lưu trữ.

Cài đặt trên Windows hoặc Mac OS

Chạy v2ray / v2ray.exe sau khi giải nén các gói.

Cài đặt trên Linux

Chúng tôi cung cấp một kịch bản để cài đặt trên Linux. Kịch bản này phát hiện v2ray đã cài đặt trước đó và sau đó nâng cấp hoặc cài đặt một phiên bản mới cho phù hợp. Nếu có phiên bản trước, tệp cấu hình trong / etc / v2ray sẽ không bị ghi đè trong khi nâng cấp.

Lệnh sau giả định quyền root.

Chạy lệnh sau để cài đặt V2Ray. Nếu yum hoặc apt có sẵn, tập lệnh sẽ cài đặt giải nén và daemon / systemd. Họ được yêu cầu chạy V2Ray như một dịch vụ. Bạn cần cài đặt chúng theo cách thủ công nếu hệ thống Linux của bạn không hỗ trợ yum hoặc apt.

curl -Ls https://install.direct/go.sh | sudo bash

Tập lệnh cài đặt các tệp sau.

  • / usr / bin / v2ray / v2ray: V2Ray thực thi
  • / usr / bin / v2ray / v2ctl: Tiện ích
  • /etc/v2ray/config.json: Tập tin cấu hình
  • /usr/bin/v2ray/geoip.dat: Tệp dữ liệu IP
  • /usr/bin/v2ray/geosite.dat: tệp dữ liệu miền

Tập lệnh này cũng cấu hình V2Ray để chạy dưới dạng dịch vụ, nếu systemd có sẵn.

Cấu hình ở các vị trí sau.

  • /etc/systemd/system/v2ray.service: Systemd
  • /etc/init.d/v2ray: SysV

Sau khi cài đặt, chúng tôi sẽ cần:

  1. Cập nhật tập tin /etc/v2ray/config.json cho kịch bản của riêng bạn.
  2. Chạy lệnh dịch vụ v2ray bắt đầu để bắt đầu V2Ray.
  3. Tùy chọn chạy dịch vụ v2ray start | stop | status | reload | restart | force-reload để điều khiển dịch vụ V2Ray.

go.sh

go.sh hỗ trợ các tham số sau.

  • -p hoặc --proxy: Sử dụng proxy để tải xuống gói V2Ray. Giống như định dạng curl, chẳng hạn như "socks5: //127.0.0.1: 1080" hoặc "http://127.0.0.1:3128".
  • -f hoặc - force: Bắt buộc cài đặt. Kịch bản sẽ giả định V2Ray chưa được cài đặt.
  • phiên bản: Phiên bản sẽ được cài đặt, chẳng hạn như "v1.13". Giá trị mặc định là bản phát hành ổn định mới nhất.
  • --local: Sử dụng gói địa phương để cài đặt.

Ví dụ:

  • Sử dụng SOCKS proxy 127.0.0.1:1080 để cài đặt gói mới nhất: ./go.sh -p socks5://127.0.0.1:1080
  • Cài đặt v1.13 từ tệp cục bộ:./go.sh --version v1.13 --local /path/to/v2ray.zip

Docker

V2Ray cung cấp 2 hình ảnh docker:

2 hình ảnh có cấu trúc giống như cài đặt Linux.

================================================ FILE: vi/welcome/start.html ================================================ Bắt đầu nhanh · Project V Official

Bắt đầu nhanh

Bạn cần phải cấu hình V2Ray sau khi cài đặt nó. Đây là một cấu hình nhanh cho chạy thử. Vui lòng xem tổng quan về cấu hình để có thêm thiết lập nâng cao.

Khách hàng

Trên PC của bạn (hoặc di động), chạy V2Ray với cấu hình sau.

{
  "inbounds": [{
    "port": 1080,  // Port of socks5 proxy. Trỏ trình duyệt của bạn để sử dụng cổng này.
    "listen": "127.0.0.1",
    "protocol": "socks",
    "settings": {
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [{
        "address": "server", // Address of your V2Ray server. Có thể là địa chỉ IP hoặc tên miền.
        "port": 10086,  // Port of your V2Ray server.
        "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
      }]
    }
  },{
    "protocol": "freedom",
    "tag": "direct",
    "settings": {}
  }],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [{
      "type": "field",
      "ip": ["geoip:private"],
      "outboundTag": "direct"
    }]
  }
}

Vui lòng sửa đổi địa chỉ IP của máy chủ V2Ray của bạn như đã đề cập ở trên. Sau đó, quá trình V2Ray trên máy tính của bạn sẽ ủy quyền tất cả lưu lượng truy cập đến máy chủ V2Ray ngoại trừ lưu lượng truy cập mạng nội bộ.

Máy chủ

Bạn cần một máy tính khác để chạy V2Ray làm máy chủ. Thông thường máy tính này nằm bên ngoài tường lửa. Đây là một cấu hình mẫu.

{
  "inbounds": [{
    "port": 10086, // Port of the server. Phải giống như trên.
    "protocol": "vmess",
    "settings": {
      "clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  }]
}

Vui lòng đảm bảo rằng trường id giống nhau giữa máy khách và máy chủ.

Đang chạy

  • Trên Windows và macOS, tệp cấu hình nằm trong cùng thư mục với nhị phân V2Ray. Bạn có thể chạy v2ray hoặc v2ray.exe mà không cần tham số bổ sung.
  • Trên Linux, tệp cấu hình thường nằm ở /etc/v2ray/config.json. Chạy v2ray --config = / etc / v2ray / config.json trong nền trước hoặc sử dụng các công cụ khác như systemd để chạy V2Ray làm quá trình nền.

Xem Tổng quan để biết thêm chi tiết về cấu hình.

================================================ FILE: vi/welcome/versions.html ================================================ Lịch sử phiên bản · Project V Official

Lịch sử phiên bản

This page lists regular releases with feature updates. If a Github release doesn't appear here, it usually only contains bug fixes.

2019.03.01 v4.18

  • Port list in routing rules now supports mixed format.
  • Updated geosite information in routing, and description for static hosts in DNS.
  • Option to not use system root CAs for TLS handshake.
  • New routing rule for traffic attributes.

2019.02.22 v4.17

  • New sub-command tlsping in V2Ctl.

2019.02.15 v4.16

For end users:

  • DNS outbound proxy now supports to modify DNS server info.

For developers:

  • 'ext' repository is now deprecated. #1541

2019.02.08 v4.15

  • DNS outbound proxy.

2019.02.01 v4.14

  • Static DNS mapping now supports domain to domain mapping.

2019.01.18 v4.13

  • Quic lib updated. It is not compatible with previous versions.
  • DNS now have tag settings.

2019.01.11 v4.11

For developers:

2018.12.07 v4.8

For end users:

  • Bug fixes

For developers:

2018.11.30 v4.7

  • Freedom now supports for dialing IPv4 or IPv6 address only.
  • New QUIC transport.

2018.11.23 v4.6

  • Freedom now can automatically choose between IPv4 and IPv6 destination address, based on SendThrough settings.

2018.11.16 v4.4

  • Load balancer rules in routing.
  • Memory usage gets optimized.

2018.11.05 v4.1

  • JSON configuration format changes. Old format is still suported.
  • Performance on GeoIP matching is improved.

2018.11.02 v4.0

  • Reverse proxy.
  • Release packages for ppc64 and ppc64le.

2018.10.12 v3.47

  • Migrate to a new continuous delivery pipeline

2018.09.28 v3.44

  • Dokodemo-door now supports TProxy in Linux.

2018.09.21 v3.43

  • DNS now supports on-demand queries by domain.

2018.09.14 v3.40

  • New socket options in transport configuration. It can be used to setup VPNs.
  • New TCP Fast Open option in transport configuration.

2018.09.03 v3.38

  • mKCP has a new WireGuard header.
  • Fix softfloat binaries in mips/mips64.

2018.08.31 v3.37

  • Performance of reading network connection in optilized. See Environment Variables
  • VMess uses AES-128-GCM by default on ARM64.
  • Built by Go 1.11.

2018.08.24 v3.36

  • Great performance improvement on subdomain matching (domain:) in routing.
  • Full domain matching is now supported in routing.

2018.08.07 v3.34

  • Better memory management on most devices.

2018.07.27 v3.32

  • BitTorrent traffic can now be sniff'ed.
  • New protocol option in routing rules for protocol-based routing.
  • New geosite:speedtest option in routing rules to match all public servers of speedtest.net.

2018.07.20 v3.31

2018.07.13 v3.30

  • Fix an issue that may cause broken connections in mKCP.
  • Thanks to our friends who speak Russian. Now our documents are in Russian.

2018.07.06 v3.29

  • New inbound and outbound for MTProto proxy.

2018.06.29 v3.27

  • DNS now supports EDNS client subnet.
  • DNS static host now supports sub-domain matching.

2018.06.15 v3.26

  • Add Dragonfly BSD release.

2018.06.01 v3.24

  • Internal buffer size (per connection) can now be configured in JSON configuration.
  • mKCP now supports DTLS 1.2 header.
  • TLS transport now only support cipher suites in TLS 1.3 spec.

2018.05.25 v3.23

  • In JSON configuration, port can now be specified from env variables.
  • JSON config now supports to load domains and IPs from specified files.

2018.04.20 v3.19

  • Traffic stats for inbound proxies.

2018.04.13 v3.17

  • V2Ray can load config file from HTTP(s).
  • TLS in V2Ray can issue new certificates by provided CA certificates for domains in incoming requests.
  • HTTP/2 transport.

2018.04.06 v3.16

  • Statistics.
  • Shadowsocks inbound now can be configured to only listen on UDP. Strongly recommend to not listen on both TCP and UDP on the same port.

2018.03.02 v3.11

  • A new settings is introduced in VMess inbound, to forbid client using insecure encryption methods.
  • Offers ARMv7 release.
  • Offers MIPS release that doesn't require FPU.

2018.02.23 v3.10

  • Log entries now contain session ID to distinguish proxy sessions.
  • Bug fixes.

2018.02.15 v3.9

  • Happy New Year!
  • Bug fixes.

2018.02.09 v3.7

2017.12.29 v3.5

  • Geoip now supports private network address under name "private".

2017.12.22 v3.4

  • Websocket nows uses value of X-Forwarded-For header as source address.
  • Support s390x CPU architecture.

2017.12.08 v3.1

  • Support policy.
  • Config file location can be specified via environment variable.

2017.12.01 v3.0

  • Support Shadowsocks AEAD

2017.11.18 v2.50

  • v2ray now tried to use v2ctl for configuration parsing. Please make sure these 2 files are in the same directory.
  • New IPOnDemand strategy in routing.

2017.11.10 v2.47

  • geosite data is now in geosite.dat file.
  • Bug fixes.

2017.11.03 v2.46

  • Router now supports geosite:cn, equivalent to existing chinasites, but more flexible.
  • Router now supports geoip.
    • File geoip.dat is added to release packages. This file contains all geoip information and has to stay in the same directory of v2ray program. Due to delayed update of installation script, you may have to copy the file manually.
  • Program v2ctl is added to release packages. You may run v2ctl verify /path/to/v2ray to verify the signature of v2ray program.

2017.10.27 v2.44

  • HTTP now supports Basic Authentication.
  • Some bugs are fixed.

2017.10.06 v2.40

  • Fix an issue that causes memory leak.

2017.09.29 v2.39

  • Inbound proxies now close connections more quickly when remote server closes them.
  • Default connection timeout changes to 5 minutes.

2017.05.12 v2.27

  • New domain mode in router.

2017.05.05 v2.26

  • Stability fixes.

2017.04.28 v2.25

  • Simple sniffing on HTTP and TLS traffic for the actual domain on request.

2017.04.21 v2.24

  • Stabilize Mux.
  • Improves memory efficiency.

2017.04.15 v2.23

  • Performance improvement in Mux.
  • Max number of connections can be configured in Mux now.
  • Performance improvement in HTTP inbound.
  • connectionReuse setting is removed in favor of Mux.

2017.04.08 v2.22

  • Mux.Cool protocol.

2017.02.25 v2.20

  • GPG signature is added to download package.
  • New binary wv2ray.exe is added to Windows package, which runs as a background application.

2017.02.18 v2.19

  • A new mechanism for anti reply attack is now enforced on server side.
    • No impact to existing clients.
  • Upgrade of VMess AES-128-GCM / Chacha20-Poly1305 / None encryption methods.
    • Please upgrade client and server at once.
    • AES-128-CFB is not affected.
  • Built with Golang 1.8. Add 32-bit MIPS support.

2017.02.11 v2.18

  • Cleanup WebSocket code.
  • Remove allowPassive option. Now passive connections are always allowed.
  • Bug fixes

2017.02.04 v2.17

  • Bug fixes.

2017.01.28 v2.16

  • New 'redirect' option in freedom. It can be used to adapt tools like Shadowsocks Obfs.
  • Performance improvement in VMess non-encryption mode. Not compatible with previous versions.
  • Happy New Year!

2017.01.16 v2.15

  • All proxies can use mKCP and WebSocket now.

2017.01.09 v2.14

  • Socks 5 outbound.
  • Bug fixes.

2017.01.02 v2.13

  • Bug fixes.

2016.12.26 v2.12

  • Bug fixes.

2016.12.19 v2.11

  • JSON config file now supports comment.

2016.12.12 v2.10

  • VMess now supports AES-GCM and ChaCha20-Poly1305 encryption methods.

2016.12.05 v2.9

  • Fix compatibility with Alpine Linux.

2016.11.28 v2.8

  • Shadowsocks server now accepts OTA settings.
  • Bug fixes.

2016.11.21 v2.7

  • Main inbound and outbound connection handler can be tagged now.
  • Bug fixes.

2016.11.14 v2.6

  • Data sent by one outbound can be proxied to another outbound.
  • Routing can be based on inbound tag.

2016.11.07 v2.5

  • New Shadowsocks outbound;
  • New TCP header: HTTP;

2016.10.24 v2.4

  • TCP / mKCP / WebSocket can be configured per inbound / outbound;
  • Routing can be done on source IP;

2016.10.17 v2.3

  • Introduce new Protobuf-based configuration;
  • OpenBSD binaries;
  • Small fixes;

2016.09.19 v2.2

2016.09.19 v2.1

  • mKCP performance improvement;

2016.08.20 v2.0

  • One year;

2016.08.15 v1.24

  • New mKCP header: utp;
  • New option in inbound connection config "allowPassive" to allow passive connection;

2016.08.08 v1.23

  • Optimize mKCP packet format. This version of mKCP is NOT compatible with previous ones;
  • mKCP can now be configured to disguise as video data.

2016.08.01 v1.22

  • Fix a memory leak in mKCP;
  • Add FreeBSD release;

2016.07.25 v1.21

  • High performance Chacha20 (Thanks to aead@);
  • Bug fixes;

2016.07.18 v1.20

  • New KCP options: readBufferSize and writeBufferSize;
  • Bug fixes;

2016.07.11 v1.19

  • Enable TLS option for all proxies;
  • Fix a performance issue in KCP;
  • Fix an issue in KCP that could cause EOF response;

2016.07.04 v1.18

  • Fix a "too many open files" issue in KCP;
  • KCP now uses fewer CPU;
  • Other bug fixes;

2016.06.19 v1.17

2016.06.12 v1.16

  • TCP connection reuse is now enabled by default;
  • Dokodemo-door is able to recognize TCP connection redirected by iptables;
  • Blackhole is able to send back HTTP forbidden data;

2016.06.05 v1.15

  • Optionally reuse TCP connection for better performance;
  • Allow listening on a specific IP address;
  • Allow sending data through a specific IP address;
  • Fix an issue in HTTP proxy that may exhaust memory;

2016.05.29 v1.14

  • Fix a panic issue in http proxy;
  • More functionalies in install script;
  • Static route in DNS;
  • Official server address change;

2016.05.16 v1.13

  • Internal DNS server, to provide better routing results combined with chinasites and chinaip;
  • Fix an issue in UDP relay;

2016.05.01 v1.12.1

  • Fix a bug in VMess.

2016.05.01 v1.12

  • Second try to fix the memory usage issue;
  • Improve Shadowsocks performance;
  • New option "none" in loglevel;

2016.04.18 v1.11

  • Try to fix the memory usage issue.

2016.03.07 v1.10

  • Fix an performance issue when dynamic ports refreshes.

2016.02.29 v1.9.1

  • Fix Shadowsocks one-time authentication (OTA) issue.

2016.02.29 v1.9

  • Support for Shadowsocks ChaCha20 encryption;
  • Add more direct connection sites to the default configuration file;
  • Dynamic ports now automatically create an account.

2016.02.22 v1.8

  • Update installation script install-release.sh (thanks, @netcookies):
    • You can now automatically stop the V2Ray process and update automatically after the completion of V2Ray;
    • The install-release.sh accepts the --proxy argument and V2Ray specified proxy download;
  • Use Go 1.6 compiler to improve the performance of AES encryption;
  • Minor fixes;
  • Update the official server IP (please re-download the installation package to get the latest configuration).

2016.02.08 v1.7

  • UDP relay performance improved;
  • Shadowsocks security improved;
  • Minor fixes;
  • Happy new year!
================================================ FILE: vi/welcome/workflow.html ================================================ Quy trình làm việc · Project V Official

Quy trình làm việc

Máy chủ đơn

Giống như các proxy khác, bạn cần một máy chủ proxy chạy V2Ray. Sau đó, bạn có thể kết nối với internet thông qua máy chủ đó từ máy tính, thiết bị di động hoặc các thiết bị khác.

graph LR; A(PC) -.- B(Firewall); B -.-> C(Blocked Website); A --> D(V2Ray/VPS); D --> C; A --> E(Normal Website);

V2Ray supports connections from multiple devices at the same time, with optionally different protocols. In the mean time, the local routing mechanism can smartly proxy necessary connections only.

Server Bridge

In the case you don't want configuration V2Ray on each of your devices, you may setup a server within the firewall, and then all traffic go through that server. The server does routing itself.

graph LR; A(PC) -.-> B(Firewall); B -.-> C(Blocked Website); A --> D(VPS 1); D --> E(VPS 2); E --> C; D --> F(Normal Website);

Nội bộ

The internal of V2Ray looks like below. It supports multiple inbound proxies, and multiple outbounds. Each of them are independent from others.

graph LR; A1(inbound) --> D(Dispatcher / Router / DNS); A2(inbound) --> D; A3(inbound) --> D; A4(inbound) --> D; D --> B1(outbound); D --> B2(outbound); D --> B3(outbound); D --> B4(outbound);

Notes:

  • Bạn phải định cấu hình ít nhất một lượt vào và ra ngoài để làm cho V2Ray hoạt động chính xác.
  • Proxy gửi đến giao tiếp với phần mềm ứng dụng khách như trình duyệt.
  • Proxy đi giao tiếp với máy chủ từ xa, chẳng hạn như Apache cho một trang web.
  • Điều phối viên chịu trách nhiệm chọn một đường đi cho một kết nối nhất định, dựa trên các quy tắc có thể cấu hình được.

Detailed configuration can be found here.