diff --git a/.gitignore b/.gitignore
index 2ed89497..27d7723d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,8 @@
+bin/
 *.sublime*
-cow-proxy
+meow-proxy
+MEOW
+MEOW.exe
+direct.txt
+rc.txt
+rc-full.txt
diff --git a/.travis.yml b/.travis.yml
index bd371ec9..303a3bd7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,6 @@
 language: go
 go:
-  - 1.3
+  - 1.7
 env:
   - TRAVIS="yes"
 install:
diff --git a/CHANGELOG b/CHANGELOG
deleted file mode 100644
index 5a8a8b04..00000000
--- a/CHANGELOG
+++ /dev/null
@@ -1,144 +0,0 @@
-0.9.2 (2014-09-21)
-    * Support new encryption method "rc4-md5"
-
-0.9.2 (2014-07-23)
-    * Reduce the possibility of encountering too many open file error
-    * New connection latency based load balancing
-    * Fix auto load plist for OS X
-    * Identify blocked site by HTTP error code
-
-0.9.1 (2013-12-20)
-    * Fix can't save site stat bug
-    * Improve install and startup script
-
-0.9 (2013-12-02)
-    * New feature: two COW servers can be connected using encrypted
-      connection, thus we have an encrypted HTTP proxy chain that can
-      be used to bypass the firewall
-    * Allow client to use HTTP basic authentication
-    * Simplify configuration syntax
-    * Better reuse for HTTP parent connections
-    * Reduce direct/blocked delta
-    * Generate new PAC every minute
-
-0.8 (2013-08-10)
-    * Share server connections between different clients
-    * Add tunnelAllowedPort option to limit ports CONNECT method can connect to
-    * Avoid timeout too soon for frequently visited direct sites
-    * Fix reporting malformed requests in two cases when request has body:
-      - Authenticate requests
-      - Error occurred before request is sent
-    * Support multi-lined headers
-    * Change client connection timeout to 15s
-    * Change as direct delta to 15
-    * Provide ARMv5 binary
-
-0.7.6 (2013-07-28)
-    * Fix bug for close connection response with no body
-    * Fix response not keep alive by default
-    * Always try parent proxy upon DNS/connection error
-    * Do not take special handling on log with debug option
-    * Add proxy status statistics in debug code
-
-0.7.5 (2013-07-25)
-    * Fix crash on IPv6 client authentication
-    * Provide ARMv6 binary
-
-0.7.4 (2013-07-15)
-    * Fix adding extra connection header for client request with both
-      "Proxy-Connection" and "Connection" headers
-    * Ignore UTF-8 BOM in config file
-
-0.7.3 (2013-07-10)
-    * Handle 100-continue: do not forward expect header from client, ignore 100
-      continue response replied by some web servers
-    * For windows: add cow-hide.exe to run cow.exe as background process,
-      (provided by to xupefei)
-    * Filter sites covered by user specified domains on load
-    * Fix incorrectly changing header value to lower case: user name and
-      password can now contain upper case letters
-
-0.7.2 (2013-07-01)
-    * Close idle server connections earlier: avoid opening too many sockets
-    * Support authenticating multiple users (can limit port for each user)
-
-0.7.1 (2013-06-08)
-    * Fix parent proxy fallback bug
-
-0.7 (2013-06-07)
-    * Always use direct connection only for private IP addresses
-    * Support multiple HTTP/SOCKS5 parent proxies
-    * Support running multiple ssh server
-    * Fix client request read timeout handling
-    * Refactor parent proxy related code
-
-0.6.3 (2013-05-27)
-    * Support more shadowsocks encryption method
-    * Fix several windows network error detection issues (dirty hack)
-
-0.6.2 (2013-05-17)
-    * Support multiple shadowsocks servers
-    * Simple load balancing: backup or hash strategy
-    * PAC fix: do not add domains with blocked host/sub domain
-    * Remove some no longer working command line options
-
-0.6.1 (2013-03-14)
-
-    * Avoid using too much memory to hold http requests
-    * Support http parent proxy basic authentication
-    * For windows: add cow-taskbar.exe to hide cmd window to status area
-    * Fix timeout error detection
-    * Some bug fixes
-
-0.6 (2013-03-03)
-
-    * Allow user to specify proxy address in PAC
-    * Performance optimization
-    * More tolerant with HTTP servers and clients
-    * Some bug fixes
-
-0.5.1 (2013-02-10)
-
-    * Handle blocked site that will return EOF
-    * Small bug fixes
-
-0.5 (2013-02-07)
-
-    * Support parent HTTP proxy (such as goagent)
-    * Work more automatically: because of this, updateBlocked, updateDirect,
-      autoRetry options and chou file are removed
-    * Record direct/blocked visit count to make blocked/direct site handling
-    more reliable
-    * Builtin common blocked/direct site list
-    * Periodically estimate timeout value to avoid considering direct site as
-    blocked with bad network connection
-    * Support specifying host in blocked/direct file
-    * User configurable timeout
-    * Better windows support: connection reset, timeout and DNS error detection
-      tested and works on XP
-    * Support listening multiple addresses
-    * Support IP based and user password authentication
-    * Various bug fixes
-
-0.3.5 (2012-12-23)
-
-    * Performance improvement by better buffer usage
-    * Allow specifying config file on command line
-    * Better windows support: Config and domain list file on windows are put in the same
-      directory as COW's binary. And they all have txt extension for easy editing
-    * Bug fix: convert HTTP/1.0 response to HTTP/1.1
-
-0.3.4 (2012-12-09)
-
-    * Support shadowsocks
-    * Reduce latency (maybe just a little, not measured)
-    * Allow specifying ssh server port in config file
-    * Bug fix: crash when handling flush error
-    * Bug fix: correctly handle web servers which use closed connection to
-      indicate end of response
-
-0.3.3 (2012-12-05)
-
-    * Keep HTTP CONNECT connection open. Avoid problems for Application which
-      uses long connection.
-    * Bug fix: crash when printing domain list inconsistency message.
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..5e584b1b
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,33 @@
+## 更新说明
+- 2016-09-29 Version 1.5
+
+       * 更新中国IP列表
+
+- 2016-02-18 Version 1.3.4
+
+       * 使用 Go 1.6 编译,请重新下载
+       
+- 2015-12-03 Version 1.3.4
+
+       * 修正客户端连接未正确关闭 bug
+       * 修正对文件描述符过多错误的判断(too many open files)
+
+- 2015-11-22 Version 1.3.3
+
+       * 增加 `reject` 拒绝连接列表
+       * 支持作为 HTTPS 代理服务器监听
+       * 支持 HTTPS 代理服务器作为父代理
+	
+	
+- 2015-10-09 Version 1.3.2
+
+       * 完全托管在 github,不再使用 meowproxy.me 域名,[新的下载地址](https://github.com/renzhn/MEOW/tree/gh-pages/dist/)
+
+- 2015-08-23 Version 1.3.1
+
+       * 去除了端口限制
+       * 使用最新的 Go 1.5 编译
+
+- 2015-07-16 Version 1.3
+
+       更新了默认的直连列表、加入了强制使用代理列表,强烈推荐旧版本用户更新 [direct](https://raw.githubusercontent.com/renzhn/MEOW/master/doc/sample-config/direct) 文件和下载 [proxy](https://raw.githubusercontent.com/renzhn/MEOW/master/doc/sample-config/proxy) 文件(或者重新安装)
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..d6ce8a5b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,22 @@
+FROM debian:wheezy
+
+RUN apt-get update -y && apt-get install --no-install-recommends -y -q \
+                         curl \
+                         zip \
+                         build-essential \
+                         ca-certificates \
+                         git mercurial bzr \
+               && rm -rf /var/lib/apt/lists/*
+
+ENV GOVERSION 1.6.2
+RUN mkdir /goroot && mkdir /gopath
+RUN curl https://storage.googleapis.com/golang/go${GOVERSION}.linux-amd64.tar.gz \
+           | tar xvzf - -C /goroot --strip-components=1
+
+ENV GOPATH /gopath
+ENV GOROOT /goroot
+ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH
+
+RUN go get github.com/mitchellh/gox
+
+CMD go get -d ./... && gox
diff --git a/README-en.md b/README-en.md
deleted file mode 100644
index bb1f61c8..00000000
--- a/README-en.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# COW (Climb Over the Wall) proxy
-
-COW is a HTTP proxy to simplify bypassing the great firewall. It tries to automatically identify blocked websites and only use parent proxy for those sites.
-
-Current version: 0.9.1 [CHANGELOG](CHANGELOG)
-[![Build Status](https://travis-ci.org/cyfdecyf/cow.png?branch=develop)](https://travis-ci.org/cyfdecyf/cow)
-
-## Features
-
-- As a HTTP proxy, can be used by mobile devices
-- Supports HTTP, SOCKS5, [shadowsocks](https://github.com/clowwindy/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) and COW itself as parent proxy
-  - Supports simple load balancing between multiple parent proxies
-- Automatically identify blocked websites, only use parent proxy for those sites
-- Generate and serve PAC file for browser to bypass COW for best performance
-  - Contain domains that can be directly accessed (recorded accoring to your visit history)
-
-# Quickstart
-
-Install:
-
-- **OS X, Linux (x86, ARM):** Run the following command (also for update)
-
-        curl -L git.io/cow | bash
-
-- **Windows:** [download](http://dl.chenyufei.info/cow/)
-- If you are familiar with Go, run `go get github.com/cyfdecyf/cow` to install from source.
-
-Modify configuration file `~/.cow/rc` (OS X or Linux) or `rc.txt` (Windows). A simple example with the most important options:
-
-    # Line starting with # is comment and will be ignored
-    # Local proxy listen address
-    listen = http://127.0.0.1:7777
-
-    # SOCKS5 parent proxy
-    proxy = socks5://127.0.0.1:1080
-    # HTTP parent proxy
-    proxy = http://127.0.0.1:8080
-    proxy = http://user:password@127.0.0.1:8080
-    # shadowsocks parent proxy
-    proxy = ss://aes-128-cfb:password@1.2.3.4:8388
-    # cow parent proxy
-    proxy = cow://aes-128-cfb:password@1.2.3.4:8388
-
-See [detailed configuration example](doc/sample-config/rc-en) for other features.
-
-The PAC file can be accessed at `http://<listen>/pac`, for the above example: `http://127.0.0.1:7777/pac`.
-
-Command line options can override options in the configuration file For more details, see the output of `cow -h`
-
-## Blocked and directly accessible sites list
-
-In ideal situation, you don't need to specify which sites are blocked and which are not, but COW hasen't reached that goal. So you may need to manually specify this if COW made the wrong judgement.
-
-- `~/.cow/blocked` for blocked sites
-- `~/.cow/direct` for blocked sites
-- One line for each domain
-  - `google.com` means `*.google.com`
-  - You can use domains like `google.com.hk`
-
-# Technical details
-
-## Visited site recording
-
-COW records all visited hosts and visit count in `~/.cow/stat`, which is a json file.
-
-- **For unknown site, first try direct access, use parent proxy upon failure. After 2 minutes, try direct access again**
-  - Builtin [common blocked site](site_blocked.go) in order to reduce time to discover blockage and the use parent proxy
-- Hosts will be put into PAC after a few times of successful direct visit
-- Hosts will use parent proxy if direct access failed for a few times
-  - To avoid mistakes, will try direct access with some probability
-- Host will be deleted if not visited for a few days
-- Hosts under builtin/manually specified blocked and direct domains will not appear in `stat`
-
-## How does COW detect blocked sites
-
-Upon the following error, one domain is considered to be blocked
-
-  - Server connection reset
-  - Connection to server timeout
-  - Read from server timeout
-
-COW will retry HTTP request upon these errors, But if there's some data sent back to the client, connection with the client will be dropped to signal error..
-
-Server connection reset is usually reliable in detecting blocked sites. But timeout is not. COW tries to estimate timeout value every 30 seconds, in order to avoid considering normal sites as blocked when network condition is bad. Revert to direct access after two minutes upon first blockage is also to avoid mistakes.
-
-If automatica timeout retry causes problem for you, try to change `readTimeout` and `dialTimeout` in configuration.
-
-# Limitations
-
-- No caching, COW just passes traffic between clients and web servers
-  - For web browsing, browsers have their own cache
-- Blocked site detection is not always reliable
-
-# Acknowledgements
-
-Refer to [README.md](README.md).
diff --git a/README.md b/README.md
index 2b93473a..ee90a434 100644
--- a/README.md
+++ b/README.md
@@ -1,137 +1,87 @@
-# COW (Climb Over the Wall) proxy
+# MEOW Proxy
 
-COW 是一个简化穿墙的 HTTP 代理服务器。它能自动检测被墙网站,仅对这些网站使用二级代理。
+当前版本:1.5 [CHANGELOG](CHANGELOG.md)
+[![Build Status](https://travis-ci.org/renzhn/MEOW.png?branch=master)](https://travis-ci.org/renzhn/MEOW)
 
-[English README](README-en.md).
+<pre>
+       /\
+   )  ( ')     MEOW是[COW](https://github.com/cyfdecyf/cow)的一个派生版本
+  (  /  )      MEOW与COW最大的不同之处在于,COW采用黑名单模式,而MEOW采用白名单模式
+   \(__)|      国内网站直接连接,其他的网站使用代理连接
+</pre>
 
-当前版本:0.9.3 [CHANGELOG](CHANGELOG)
-[![Build Status](https://travis-ci.org/cyfdecyf/cow.png?branch=master)](https://travis-ci.org/cyfdecyf/cow)
+## MEOW 可以用来
+- 作为全局HTTP代理(支持PAC),可以智能分流(直连国内网站、使用代理连接其他网站)
+- 将SOCKS5等代理转换为HTTP代理,HTTP代理能最大程度兼容各种软件(可以设置为程序代理)和设备(设置为系统全局代理)
+- 架设在内网(或者公网),为其他设备提供智能分流代理
+- 编译成一个无需任何依赖的可执行文件运行,支持各种平台(Win/Linux/OS X),甚至是路由器或者树莓派(Linux ARM)
 
-**欢迎在 develop branch 进行开发并发送 pull request :)**
+## 获取
 
-## 功能
+- **OS X, Linux:** 执行以下命令(也可用于更新)
 
-COW 的设计目标是自动化,理想情况下用户无需关心哪些网站无法访问,可直连网站也不会因为使用二级代理而降低访问速度。
+        curl -L git.io/meowproxy | bash
 
-- 作为 HTTP 代理,可提供给移动设备使用;若部署在国内服务器上,可作为 APN 代理
-- 支持 HTTP, SOCKS5, [shadowsocks](https://github.com/clowwindy/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) 和 cow 自身作为二级代理
-  - 可使用多个二级代理,支持简单的负载均衡
-- 自动检测网站是否被墙,仅对被墙网站使用二级代理
-- 自动生成包含直连网站的 PAC,访问这些网站时可绕过 COW
-  - 内置[常见可直连网站](site_direct.go),如国内社交、视频、银行、电商等网站(可手工添加)
+  环境变量 `MEOW_INSTALLDIR` 可以指定安装的路径,若该环境变量不是目录则询问用户
+- **Windows:** [下载地址](https://github.com/renzhn/MEOW/tree/gh-pages/dist/windows/)
+- **从源码安装:** 安装 [Go](http://golang.org/doc/install),然后 `go get github.com/renzhn/MEOW`
 
-# 快速开始
+## 配置
 
-安装:
+编辑 `~/.meow/rc` (OS X, Linux) 或 `rc.txt` (Windows),例子:
 
-- **OS X, Linux (x86, ARM):** 执行以下命令(也可用于更新)
+    # 监听地址,设为0.0.0.0可以监听所有端口,共享给局域网使用
+    listen = http://127.0.0.1:4411
+    # 至少指定一个上级代理
+    # SOCKS5 上级代理
+    # proxy = socks5://127.0.0.1:1080
+    # HTTP 上级代理
+    # proxy = http://127.0.0.1:8087
+    # shadowsocks 上级代理
+    # proxy = ss://aes-128-cfb:password@example.server.com:25
+    # HTTPS 上级代理
+    # proxy = https://user:password@example.server.com:port
 
-        curl -L git.io/cow | bash
+## 工作方式
 
-  - 环境变量 `COW_INSTALLDIR` 可以指定安装的路径,若该环境变量不是目录则询问用户
-- **Windows:** [点此下载](http://dl.chenyufei.info/cow/)
-- 熟悉 Go 的用户可用 `go get github.com/cyfdecyf/cow` 从源码安装
+当MEOW启动时会从配置文件加载直连列表和强制使用代理列表,详见下面两节。
 
-编辑 `~/.cow/rc` (Linux) 或 `rc.txt` (Windows),简单的配置例子如下:
+当通过MEOW访问一个网站时,MEOW会:
 
-    #开头的行是注释,会被忽略
-    # 本地 HTTP 代理地址
-    # 配置 HTTP 和 HTTPS 代理时请填入该地址
-    # 或者在自动代理配置中填入 http://127.0.0.1:7777/pac
-    listen = http://127.0.0.1:7777
+- 检查域名是否在直连列表中,如果在则直连
+- 检查域名是否在强制使用代理列表中,如果在则通过代理连接
+- **检查域名的 IP 是否为国内 IP**
+    - 通过本地 DNS 解析域名,得到域名的 IP
+    - 如果是国内 IP 则直连,否则通过代理连接
+    - 将域名加入临时的直连或者强制使用代理列表(缓存),下次访问相同网站可以不用 DNS 解析直接判断域名是否直连
 
-    # SOCKS5 二级代理
-    proxy = socks5://127.0.0.1:1080
-    # HTTP 二级代理
-    proxy = http://127.0.0.1:8080
-    proxy = http://user:password@127.0.0.1:8080
-    # shadowsocks 二级代理
-    proxy = ss://aes-128-cfb:password@1.2.3.4:8388
-    # cow 二级代理
-    proxy = cow://aes-128-cfb:password@1.2.3.4:8388
+## 直连列表
 
-使用 cow 协议的二级代理需要在国外服务器上安装 COW,并使用如下配置:
+直接连接的域名列表保存在 `~/.meow/direct` (OS X, Linux) 或 `direct.txt` (Windows)
 
-    listen = cow://aes-128-cfb:password@0.0.0.0:8388
 
-完成配置后启动 COW 并配置好代理即可使用。
+匹配域名**按 . 分隔的后两部分**或者**整个域名**,例子:
 
-# 详细使用说明
+-  `baidu.com` => `*.baidu.com`
+-  `com.cn` => `*.com.cn`
+-  `edu.cn` => `*.edu.cn`
+-  `music.163.com` => `music.163.com`
 
-配置文件在 Unix 系统上为 `~/.cow/rc`,Windows 上为 COW 所在目录的 `rc.txt` 文件。 **[样例配置](doc/sample-config/rc) 包含了所有选项以及详细的说明**,建议下载然后修改。
+一般是**确定**要直接连接的网站
 
-启动 COW:
+## 与COW相比主要区别
 
-- Unix 系统在命令行上执行 `cow &` (若 COW 不在 `PATH` 所在目录,请执行 `./cow &`)
-  - [Linux 启动脚本](doc/init.d/cow),如何使用请参考注释(Debian 测试通过,其他 Linux 发行版应该也可使用)
-- Windows
-  - 双击 `cow-taskbar.exe`,隐藏到托盘执行
-  - 双击 `cow-hide.exe`,隐藏为后台程序执行
-  - 以上两者都会启动 `cow.exe`
+- 所有国外网站走代理,加快访问速度
+- 去掉了“先尝试直连,如果无法连接则走代理”的逻辑,避免尝试过程中浪费时间
+- 无状态,不依赖用来做统计的stats文件(偶尔还会出现stats文件破损的情况)
+- 增加reject列表可以用来屏蔽广告(感谢@wjchen)
+- 增加了作为https代理以及支持上游https代理功能(感谢@wjchen)
 
-PAC url 为 `http://<listen address>/pac`,也可将浏览器的 HTTP/HTTPS 代理设置为 `listen address` 使所有网站都通过 COW 访问。
+## 强制使用代理列表
 
-**使用 PAC 可获得更好的性能,但若 PAC 中某网站从直连变成被封,浏览器会依然尝试直连。遇到这种情况可以暂时不使用 PAC 而总是走 HTTP 代理,让 COW 学习到新的被封网站。**
+强制使用代理连接的域名列表保存在 `~/.meow/proxy` (OS X, Linux) 或 `proxy.txt` (Windows),语法格式与直连列表相同
+(注意:匹配的是域名**按 . 分隔的后两部分**或者**整个域名**)
 
-命令行选项可以覆盖部分配置文件中的选项、打开 debug/request/reply 日志,执行 `cow -h` 来获取更多信息。
-
-## 手动指定被墙和直连网站
-
-**一般情况下无需手工指定被墙和直连网站,该功能只是是为了处理特殊情况和性能优化。**
-
-`~/.cow/blocked` 和 `~/.cow/direct` 可指定被墙和直连网站(`direct` 中的 host 会添加到 PAC):
-
-- 每行一个域名或者主机名(COW 会先检查主机名是否在列表中,再检查域名)
-  - 二级域名如 `google.com` 相当于 `*.google.com`
-  - `com.hk`, `edu.cn` 等二级域名下的三级域名,作为二级域名处理。如 `google.com.hk` 相当于 `*.google.com.hk`
-  - 其他三级及以上域名/主机名做精确匹配,例如 `plus.google.com`
-
-# 技术细节
-
-## 访问网站记录
-
-COW 在 `~/.cow/stat` json 文件中记录经常访问网站被墙和直连访问的次数。
-
-- **对未知网站,先尝试直接连接,失败后使用二级代理重试请求,2 分钟后再尝试直接**
-  - 内置[常见被墙网站](site_blocked.go),减少检测被墙所需时间(可手工添加)
-- 直连访问成功一定次数后相应的 host 会添加到 PAC
-- host 被墙一定次数后会直接用二级代理访问
-  - 为避免误判,会以一定概率再次尝试直连访问
-- host 若一段时间没有访问会自动被删除(避免 `stat` 文件无限增长)
-- 内置网站列表和用户指定的网站不会出现在统计文件中
-
-## COW 如何检测被墙网站
-
-COW 将以下错误认为是墙在作怪:
-
-- 服务器连接被重置 (connection reset)
-- 创建连接超时
-- 服务器读操作超时
-
-无论是普通的 HTTP GET 等请求还是 CONNECT 请求,失败后 COW 都会自动重试请求。(如果已经有内容发送回 client 则不会重试而是直接断开连接。)
-
-用连接被重置来判断被墙通常来说比较可靠,超时则不可靠。COW 每隔半分钟会尝试估算合适的超时间隔,避免在网络连接差的情况下把直连网站由于超时也当成被墙。
-COW 默认配置下检测到被墙后,过两分钟再次尝试直连也是为了避免误判。
-
-如果超时自动重试给你造成了问题,请参考[样例配置](doc/sample-config/rc)高级选项中的 `readTimeout`, `dialTimeout` 选项。
-
-## 限制
-
-- 不提供 cache
-- 不支持 HTTP pipeline(Chrome, Firefox 默认都没开启 pipeline,支持这个功能容易增加问题而好处并不明显)
-
-# 致谢
-
-贡献代码:
-
-- @tevino: http parent proxy basic authentication
-- @xupefei: 提供 cow-hide.exe 以在 windows 上在后台执行 cow.exe
-- @sunteya: 改进启动和安装脚本
-- @fzerorubigd: identify blocked site by HTTP error code
-
-Bug reporter:
-
-- GitHub users: glacjay, trawor, Blaskyy, lucifer9, zellux, xream, hieixu, fantasticfears, perrywky, JayXon, graminc, WingGao, polong, dallascao, luosheng
-- Twitter users: 特别感谢 @shao222 多次帮助测试新版并报告了不少 bug, @xixitalk
-
-@glacjay 对 0.3 版本的 COW 提出了让它更加自动化的建议,使我重新考虑 COW 的设计目标并且改进成 0.5 版本之后的工作方式。
+## 推广
+- 简单好用的安卓桌面 https://fir.im/cold
+- 淘宝天猫购物券分享 https://www.youquan.info
diff --git a/auth.go b/auth.go
index 270e00a8..9fe5316b 100644
--- a/auth.go
+++ b/auth.go
@@ -15,14 +15,14 @@ import (
 )
 
 const (
-	authRealm       = "cow proxy"
+	authRealm       = "meow proxy"
 	authRawBodyTmpl = `<!DOCTYPE html>
 <html>
-	<head> <title>COW Proxy</title> </head>
+	<head> <title>meow Proxy</title> </head>
 	<body>
 		<h1>407 Proxy authentication required</h1>
 		<hr />
-		Generated by <i>COW</i>
+		Generated by <i>meow</i>
 	</body>
 </html>
 `
diff --git a/auth_test.go b/auth_test.go
index 4655fdaa..d6cdca69 100644
--- a/auth_test.go
+++ b/auth_test.go
@@ -47,11 +47,11 @@ func TestCalcDigest(t *testing.T) {
 		"cnonce": "6c46874228c087eb",
 		"uri":    "/",
 	}
-	const targetDigest = "bad1cb3526e4b257a62cda10f7c25aad"
+	const targetDigest = "c51dbb53e998cb7d68794574e60f8ea0"
 
 	digest := calcRequestDigest(auth, a1, "GET")
 	if digest != targetDigest {
-		t.Errorf("authentication digest calculation wrong, got: %x, should be: %s\n", digest, targetDigest)
+		t.Errorf("authentication digest calculation wrong, got: %s, should be: %s\n", digest, targetDigest)
 	}
 }
 
diff --git a/chinaip_data.go b/chinaip_data.go
new file mode 100644
index 00000000..614acbd3
--- /dev/null
+++ b/chinaip_data.go
@@ -0,0 +1,15247 @@
+package main
+var CNIPDataStart = []uint32 {
+	16777472,
+	16777728,
+	16779264,
+	16785408,
+	16842752,
+	16843264,
+	16843776,
+	16844800,
+	16845056,
+	16845312,
+	16845824,
+	16846848,
+	16850944,
+	16908288,
+	16908800,
+	16909312,
+	16909568,
+	16909824,
+	16910336,
+	16910592,
+	16910848,
+	16911360,
+	16912384,
+	16916480,
+	16924672,
+	16973824,
+	17039616,
+	17039872,
+	17040384,
+	17040640,
+	17040896,
+	17041408,
+	17043456,
+	17047552,
+	17055744,
+	17301504,
+	17432576,
+	17434624,
+	17435392,
+	17435648,
+	17436672,
+	17440768,
+	17448960,
+	17563648,
+	18350080,
+	19726336,
+	19922944,
+	20054016,
+	20119552,
+	20447232,
+	21233664,
+	22020096,
+	22544384,
+	22806528,
+	22937600,
+	24379392,
+	28573696,
+	28835840,
+	29097984,
+	29360128,
+	30015488,
+	30146560,
+	234881024,
+	234884096,
+	234946560,
+	234952704,
+	234971136,
+	234974208,
+	235929600,
+	241598464,
+	241605632,
+	241611776,
+	241631232,
+	241696768,
+	242221056,
+	243400704,
+	243662848,
+	244318208,
+	247464960,
+	247478272,
+	247479296,
+	247483392,
+	247726080,
+	248250368,
+	248512512,
+	453017600,
+	453018624,
+	453025792,
+	453026816,
+	453032960,
+	453037056,
+	453038080,
+	453039104,
+	453509120,
+	454033408,
+	455272448,
+	455344128,
+	455606272,
+	456271872,
+	456294400,
+	456542208,
+	456562688,
+	456572928,
+	459460608,
+	459464704,
+	459505664,
+	459735040,
+	459964416,
+	459983872,
+	460136448,
+	460160000,
+	460324864,
+	460345344,
+	460353536,
+	460354560,
+	460423168,
+	460521472,
+	460598272,
+	460933120,
+	460945408,
+	461105152,
+	461373440,
+	461626368,
+	462422016,
+	462684160,
+	462946304,
+	465043456,
+	465567744,
+	467664896,
+	603979776,
+	603981824,
+	603983872,
+	603987968,
+	603996160,
+	604012544,
+	604045312,
+	604241920,
+	605028352,
+	606076928,
+	606339072,
+	606404608,
+	606413824,
+	606414592,
+	606414848,
+	606416896,
+	606601216,
+	607125504,
+	607322112,
+	607649792,
+	610271232,
+	612368384,
+	616562688,
+	620232704,
+	620625920,
+	620721152,
+	620724224,
+	620733440,
+	620735488,
+	620736512,
+	620740608,
+	654311424,
+	654311936,
+	654312448,
+	654313472,
+	654315520,
+	654319616,
+	654327808,
+	654344192,
+	658505728,
+	660602880,
+	661127168,
+	661389312,
+	662700032,
+	675807232,
+	679313408,
+	679362560,
+	704643072,
+	704645120,
+	704647168,
+	704649216,
+	704651264,
+	704675840,
+	704708608,
+	704716800,
+	704720896,
+	704722944,
+	704741376,
+	704905216,
+	707788800,
+	707919872,
+	707985408,
+	708050944,
+	708313088,
+	708706304,
+	708739072,
+	708747264,
+	708752384,
+	708753408,
+	708771840,
+	709885952,
+	710098944,
+	710103040,
+	710105088,
+	710107136,
+	710115328,
+	710148096,
+	710410240,
+	710950912,
+	710959104,
+	710962176,
+	710963200,
+	710967296,
+	711000064,
+	711131136,
+	711147520,
+	711155712,
+	711159808,
+	711161856,
+	711196672,
+	712507392,
+	712638464,
+	712704000,
+	712713216,
+	712714240,
+	712716288,
+	712720384,
+	712736768,
+	713031680,
+	714866688,
+	714875904,
+	714876928,
+	714878976,
+	714883072,
+	714899456,
+	714932224,
+	714997760,
+	715128832,
+	716177408,
+	716701696,
+	716832768,
+	716898304,
+	716914688,
+	716922880,
+	716926976,
+	716929024,
+	716931072,
+	717225984,
+	717357056,
+	717359104,
+	717360128,
+	717361152,
+	717365248,
+	717373440,
+	717389824,
+	717422592,
+	717488128,
+	717815808,
+	717881344,
+	718012416,
+	718274560,
+	719323136,
+	720371712,
+	720404480,
+	720502784,
+	720633856,
+	720896000,
+	736103424,
+	736106496,
+	736111616,
+	736113664,
+	736114688,
+	736116736,
+	736117760,
+	736118784,
+	736120832,
+	736125952,
+	736137216,
+	736141312,
+	736145408,
+	736147456,
+	736151552,
+	736152576,
+	736153600,
+	736154624,
+	736155648,
+	736157696,
+	736161792,
+	736185344,
+	736187392,
+	736196608,
+	736197632,
+	736201728,
+	736209920,
+	736211968,
+	736219136,
+	736221184,
+	736222208,
+	736223232,
+	736224256,
+	736225280,
+	736226304,
+	736227328,
+	736228352,
+	736230400,
+	736239616,
+	736240640,
+	736241664,
+	736242688,
+	736243712,
+	736244736,
+	736245760,
+	736246784,
+	736247808,
+	736248832,
+	736249856,
+	736250880,
+	736251904,
+	736252928,
+	736253952,
+	736254976,
+	736256000,
+	736257024,
+	736258048,
+	736259072,
+	736260096,
+	736261120,
+	736262144,
+	736264192,
+	736265216,
+	736266240,
+	736267264,
+	736268288,
+	736269312,
+	736270336,
+	736271360,
+	736272384,
+	736273408,
+	736274432,
+	736275456,
+	736276480,
+	736277504,
+	736278528,
+	736279552,
+	736280576,
+	736281600,
+	736282624,
+	736283648,
+	736284672,
+	736285696,
+	736291840,
+	736292864,
+	736293888,
+	736294912,
+	736295936,
+	736296960,
+	736297984,
+	736299008,
+	736305152,
+	736306176,
+	736307200,
+	736308224,
+	736309248,
+	736310272,
+	736311296,
+	736312320,
+	736313344,
+	736314368,
+	736315392,
+	736316416,
+	736317440,
+	736318464,
+	736319488,
+	736320512,
+	736321536,
+	736322560,
+	736323584,
+	736331776,
+	736332800,
+	736333824,
+	736335872,
+	736336896,
+	736337920,
+	736338944,
+	736339968,
+	736340992,
+	736342016,
+	736343040,
+	736345088,
+	736346112,
+	736347136,
+	736348160,
+	736349184,
+	736350208,
+	736351232,
+	736352256,
+	736353280,
+	736356352,
+	736360448,
+	736361472,
+	736362496,
+	736363520,
+	736364544,
+	736365568,
+	736366592,
+	736367616,
+	736368640,
+	736369664,
+	736370688,
+	736371712,
+	736372736,
+	736373760,
+	736374784,
+	736375808,
+	736376832,
+	736377856,
+	736378880,
+	736379904,
+	736381952,
+	736388096,
+	736392192,
+	736393216,
+	736396288,
+	736397312,
+	736400384,
+	736401408,
+	736410624,
+	736414720,
+	736423936,
+	736432128,
+	736438272,
+	736440320,
+	736442368,
+	736452608,
+	736455680,
+	736458752,
+	736462848,
+	736463872,
+	736464896,
+	736471040,
+	736472064,
+	736473088,
+	736474112,
+	736475136,
+	736476160,
+	736477184,
+	736478208,
+	736483328,
+	736484352,
+	736487424,
+	736488448,
+	736498688,
+	736501760,
+	736510976,
+	736512000,
+	736515072,
+	736525312,
+	736528384,
+	736536576,
+	736549888,
+	736550912,
+	736551936,
+	736552960,
+	736553984,
+	736555008,
+	736556032,
+	736557056,
+	736558080,
+	736562176,
+	736567296,
+	736568320,
+	736569344,
+	736570368,
+	736579584,
+	736580608,
+	736581632,
+	736582656,
+	736583680,
+	736584704,
+	736585728,
+	736586752,
+	736593920,
+	736594944,
+	736595968,
+	736596992,
+	736598016,
+	736599040,
+	736600064,
+	736601088,
+	736602112,
+	736603136,
+	736604160,
+	736605184,
+	736886784,
+	736887808,
+	736888832,
+	736889856,
+	736890880,
+	736891904,
+	736892928,
+	736893952,
+	736894976,
+	736896000,
+	736897024,
+	736898048,
+	736899072,
+	736900096,
+	736901120,
+	736902144,
+	736903168,
+	736904192,
+	736905216,
+	736906240,
+	736907264,
+	736908288,
+	736909312,
+	736910336,
+	736911360,
+	736912384,
+	736913408,
+	736914432,
+	736915456,
+	736916480,
+	736917504,
+	736918528,
+	736919552,
+	736920576,
+	736921600,
+	736922624,
+	736923648,
+	736924672,
+	736925696,
+	736926720,
+	736927744,
+	736928768,
+	736929792,
+	736930816,
+	736931840,
+	736932864,
+	736933888,
+	736934912,
+	736935936,
+	736936960,
+	736937984,
+	736939008,
+	736940032,
+	736941056,
+	736942080,
+	736943104,
+	736944128,
+	736945152,
+	736946176,
+	736947200,
+	736948224,
+	736949248,
+	736950272,
+	736951296,
+	736952320,
+	736953344,
+	736954368,
+	736955392,
+	736956416,
+	736957440,
+	736958464,
+	736959488,
+	736960512,
+	736961536,
+	736962560,
+	736963584,
+	736964608,
+	736965632,
+	736966656,
+	736967680,
+	736968704,
+	736969728,
+	736970752,
+	736971776,
+	736972800,
+	736973824,
+	736974848,
+	736975872,
+	736976896,
+	736977920,
+	736978944,
+	736979968,
+	736980992,
+	736982016,
+	736983040,
+	736984064,
+	736985088,
+	736986112,
+	736987136,
+	736988160,
+	736989184,
+	736990208,
+	736991232,
+	736992256,
+	736993280,
+	736994304,
+	736995328,
+	736996352,
+	736997376,
+	736998400,
+	736999424,
+	737000448,
+	737001472,
+	737002496,
+	737003520,
+	737004544,
+	737005568,
+	737006592,
+	737007616,
+	737008640,
+	737009664,
+	737010688,
+	737011712,
+	737012736,
+	737013760,
+	737014784,
+	737015808,
+	737016832,
+	737017856,
+	737018880,
+	737019904,
+	737020928,
+	737021952,
+	737022976,
+	737024000,
+	737025024,
+	737026048,
+	737027072,
+	737028096,
+	737029120,
+	737030144,
+	737031168,
+	737032192,
+	737033216,
+	737034240,
+	737035264,
+	737036288,
+	737037312,
+	737038336,
+	737039360,
+	737040384,
+	737041408,
+	737042432,
+	737043456,
+	737044480,
+	737045504,
+	737046528,
+	737047552,
+	737048576,
+	737049600,
+	737050624,
+	737051648,
+	737052672,
+	737053696,
+	737054720,
+	737055744,
+	737056768,
+	737057792,
+	737058816,
+	737059840,
+	737060864,
+	737061888,
+	737062912,
+	737063936,
+	737064960,
+	737065984,
+	737067008,
+	737068032,
+	737069056,
+	737070080,
+	737071104,
+	737072128,
+	737073152,
+	737074176,
+	737075200,
+	737076224,
+	737077248,
+	737078272,
+	737079296,
+	737080320,
+	737081344,
+	737082368,
+	737083392,
+	737084416,
+	737085440,
+	737087488,
+	737088512,
+	737089536,
+	737090560,
+	737091584,
+	737092608,
+	737093632,
+	737094656,
+	737095680,
+	737113088,
+	737114112,
+	737127424,
+	737128448,
+	737148928,
+	737161216,
+	737163264,
+	737164288,
+	737166336,
+	737167360,
+	737168384,
+	737170432,
+	737180672,
+	737181696,
+	737182720,
+	737183744,
+	737188864,
+	737189888,
+	737190912,
+	737191936,
+	737192960,
+	737193984,
+	737195008,
+	737196032,
+	737197056,
+	737198080,
+	737199104,
+	737200128,
+	737201152,
+	737202176,
+	737203200,
+	737204224,
+	737205248,
+	737209344,
+	737210368,
+	737211392,
+	737212416,
+	737213440,
+	737214464,
+	737215488,
+	737216512,
+	737217536,
+	737218560,
+	737219584,
+	737226752,
+	737233920,
+	737234944,
+	737235968,
+	737236992,
+	737238016,
+	737243136,
+	737257472,
+	737258496,
+	737259520,
+	737260544,
+	737261568,
+	737264640,
+	737267712,
+	737268736,
+	737269760,
+	737270784,
+	737271808,
+	737272832,
+	737273856,
+	737274880,
+	737275904,
+	737277952,
+	737278976,
+	737282048,
+	737283072,
+	737284096,
+	737285120,
+	737286144,
+	737287168,
+	737291264,
+	737292288,
+	737293312,
+	737294336,
+	737295360,
+	737296384,
+	737298432,
+	737299456,
+	737300480,
+	737301504,
+	737302528,
+	737303552,
+	737304576,
+	737316864,
+	737317888,
+	737318912,
+	737319936,
+	737320960,
+	737321984,
+	737323008,
+	737326080,
+	737328128,
+	737329152,
+	737330176,
+	737332224,
+	737335296,
+	737336320,
+	737344512,
+	737346560,
+	737347584,
+	737348608,
+	737349632,
+	737351680,
+	737368064,
+	737378304,
+	737380352,
+	737382400,
+	737383424,
+	737385472,
+	737388544,
+	737391616,
+	737393664,
+	737403904,
+	737404928,
+	737408000,
+	737542144,
+	737543168,
+	737544192,
+	737545216,
+	737546240,
+	737547264,
+	737548288,
+	737549312,
+	737550336,
+	737551360,
+	737552384,
+	737553408,
+	737554432,
+	737555456,
+	737556480,
+	737557504,
+	737558528,
+	737559552,
+	737560576,
+	737561600,
+	737562624,
+	737563648,
+	737564672,
+	737565696,
+	737566720,
+	737596416,
+	737600512,
+	737608704,
+	737609728,
+	737618944,
+	737619968,
+	737625088,
+	737627136,
+	737629184,
+	737630208,
+	737631232,
+	737632256,
+	737633280,
+	737635328,
+	737636352,
+	737645568,
+	737646592,
+	737652736,
+	737653760,
+	737654784,
+	737655808,
+	737657856,
+	737658880,
+	737659904,
+	737660928,
+	737661952,
+	737662976,
+	737664000,
+	737665024,
+	737666048,
+	737667072,
+	737668096,
+	737669120,
+	737670144,
+	737671168,
+	737672192,
+	737673216,
+	737674240,
+	737678336,
+	737680384,
+	737685504,
+	737692672,
+	737693696,
+	737694720,
+	737695744,
+	737696768,
+	737697792,
+	737698816,
+	737699840,
+	737700864,
+	737701888,
+	737702912,
+	737703936,
+	737704960,
+	737705984,
+	737707008,
+	737708032,
+	737709056,
+	737710080,
+	737711104,
+	737718272,
+	737719296,
+	737720320,
+	737721344,
+	737722368,
+	737723392,
+	737724416,
+	737725440,
+	737726464,
+	737731584,
+	737732608,
+	737735680,
+	737738752,
+	737739776,
+	737740800,
+	737744896,
+	737769472,
+	737772544,
+	737773568,
+	737775616,
+	737776640,
+	737777664,
+	737778688,
+	737779712,
+	737780736,
+	737781760,
+	737787904,
+	737799168,
+	737805312,
+	737807360,
+	737808384,
+	737809408,
+	737811456,
+	737812480,
+	737813504,
+	737822720,
+	737828864,
+	737829888,
+	737830912,
+	737831936,
+	737832960,
+	737833984,
+	737837056,
+	737841152,
+	737842176,
+	737845248,
+	737847296,
+	737848320,
+	737849344,
+	737855488,
+	737858560,
+	737859584,
+	737860608,
+	737864704,
+	737866752,
+	737870848,
+	737871872,
+	737872896,
+	737879040,
+	737899520,
+	737918976,
+	737929216,
+	737930240,
+	737932288,
+	737945600,
+	737947648,
+	737949696,
+	737992704,
+	738066432,
+	738067456,
+	738068480,
+	738072576,
+	738075648,
+	738077696,
+	738079744,
+	738082816,
+	738084864,
+	738087936,
+	738088960,
+	738089984,
+	738092032,
+	738093056,
+	738095104,
+	738096128,
+	738099200,
+	738101248,
+	738102272,
+	738103296,
+	738104320,
+	738105344,
+	738106368,
+	738109440,
+	738110464,
+	738112512,
+	738113536,
+	738114560,
+	738115584,
+	738116608,
+	738117632,
+	738119680,
+	738122752,
+	738123776,
+	738124800,
+	738125824,
+	738126848,
+	738127872,
+	738129920,
+	738130944,
+	738131968,
+	738132992,
+	738134016,
+	738136064,
+	738144256,
+	738148352,
+	738149376,
+	738150400,
+	738151424,
+	738153472,
+	738156544,
+	738159616,
+	738168832,
+	738174976,
+	738177024,
+	738179072,
+	738181120,
+	738183168,
+	738184192,
+	738185216,
+	738186240,
+	738189312,
+	738190336,
+	738191360,
+	738194432,
+	759238656,
+	759239680,
+	759240704,
+	759241728,
+	762348544,
+	762362880,
+	762368000,
+	762369024,
+	762370048,
+	762371072,
+	762373120,
+	762374144,
+	762375168,
+	762383360,
+	762384384,
+	762385408,
+	762386432,
+	762387456,
+	762390528,
+	762393600,
+	762394624,
+	762398720,
+	762407936,
+	762417152,
+	762418176,
+	762423296,
+	762425344,
+	762427392,
+	762431488,
+	762432512,
+	762433536,
+	762434560,
+	762435584,
+	762436608,
+	762438656,
+	762441728,
+	762444800,
+	762445824,
+	762448896,
+	762454016,
+	762456064,
+	762459136,
+	762470400,
+	762472448,
+	762480640,
+	762496000,
+	762497024,
+	762504192,
+	762506240,
+	762510336,
+	762522624,
+	762536960,
+	762542080,
+	762545152,
+	762548224,
+	762551296,
+	762553344,
+	762562560,
+	762565632,
+	762566656,
+	762569728,
+	762571776,
+	762573824,
+	762574848,
+	762579968,
+	762580992,
+	762582016,
+	762583040,
+	762585088,
+	762586112,
+	762590208,
+	762592256,
+	762593280,
+	762601472,
+	762602496,
+	762612736,
+	762615808,
+	762630144,
+	762644480,
+	762647552,
+	762652672,
+	762659840,
+	762674176,
+	762706944,
+	762786816,
+	762788864,
+	762789888,
+	762790912,
+	762791936,
+	762800128,
+	762803200,
+	762832896,
+	762864640,
+	762874880,
+	762878976,
+	762881024,
+	762895360,
+	762900480,
+	762909696,
+	762917888,
+	762920960,
+	762921984,
+	762923008,
+	762928128,
+	762929152,
+	762931200,
+	762948608,
+	762949632,
+	762958848,
+	762966016,
+	762967040,
+	762968064,
+	762969088,
+	762970112,
+	762971136,
+	762972160,
+	762973184,
+	762974208,
+	762975232,
+	762976256,
+	762977280,
+	762978304,
+	762979328,
+	762980352,
+	762985472,
+	762986496,
+	762987520,
+	762988544,
+	762989568,
+	762990592,
+	762991616,
+	762992640,
+	762993664,
+	762994688,
+	762995712,
+	762996736,
+	762997760,
+	762998784,
+	762999808,
+	763011072,
+	763012096,
+	763013120,
+	763014144,
+	763015168,
+	763016192,
+	763017216,
+	763018240,
+	763019264,
+	763020288,
+	763021312,
+	763022336,
+	763023360,
+	763024384,
+	763025408,
+	763042816,
+	763043840,
+	763044864,
+	763046912,
+	763047936,
+	763048960,
+	763049984,
+	763051008,
+	763052032,
+	763053056,
+	763054080,
+	763055104,
+	763056128,
+	763057152,
+	763058176,
+	763066368,
+	763068416,
+	763069440,
+	763070464,
+	763073536,
+	763074560,
+	763075584,
+	763077632,
+	763078656,
+	763079680,
+	763080704,
+	763081728,
+	763082752,
+	763087872,
+	763089920,
+	763092992,
+	763094016,
+	763095040,
+	763096064,
+	763097088,
+	763098112,
+	763099136,
+	763100160,
+	763101184,
+	763106304,
+	763108352,
+	763109376,
+	763110400,
+	763112448,
+	763118592,
+	763120640,
+	763121664,
+	763126784,
+	763132928,
+	763145216,
+	763146240,
+	763154432,
+	763164672,
+	763165696,
+	763169792,
+	763170816,
+	763172864,
+	763173888,
+	763174912,
+	763177984,
+	763180032,
+	763181056,
+	763186176,
+	763187200,
+	763188224,
+	763189248,
+	763190272,
+	763191296,
+	763192320,
+	763193344,
+	763201536,
+	763244544,
+	763245568,
+	763257856,
+	763259904,
+	763260928,
+	763261952,
+	763262976,
+	763286528,
+	763288576,
+	763299840,
+	763300864,
+	763307008,
+	763322368,
+	763327488,
+	763329536,
+	763330560,
+	763334656,
+	763335680,
+	763337728,
+	763353088,
+	771229696,
+	771248128,
+	771249152,
+	771250176,
+	771252224,
+	771253248,
+	771254272,
+	771255296,
+	771260416,
+	771261440,
+	771279872,
+	771280896,
+	771281920,
+	771282944,
+	771283968,
+	771284992,
+	771286016,
+	771287040,
+	771288064,
+	771289088,
+	771290112,
+	771291136,
+	771292160,
+	771293184,
+	771294208,
+	771296256,
+	771297280,
+	771298304,
+	771299328,
+	771300352,
+	771301376,
+	771302400,
+	771316736,
+	771321856,
+	771339264,
+	771341312,
+	771342336,
+	771343360,
+	771344384,
+	771345408,
+	771346432,
+	771347456,
+	771361792,
+	771362816,
+	771365888,
+	771366912,
+	771367936,
+	771368960,
+	771378176,
+	771379200,
+	771380224,
+	771381248,
+	771382272,
+	771383296,
+	771385344,
+	771386368,
+	771387392,
+	771388416,
+	771389440,
+	771390464,
+	771391488,
+	771392512,
+	771393536,
+	771394560,
+	771395584,
+	771396608,
+	771397632,
+	771400704,
+	771404800,
+	771405824,
+	771406848,
+	771407872,
+	771424256,
+	771426304,
+	771428352,
+	771429376,
+	771437568,
+	771445760,
+	771446784,
+	771447808,
+	771448832,
+	771449856,
+	771454976,
+	771456000,
+	771459072,
+	771460096,
+	771461120,
+	771462144,
+	771463168,
+	771464192,
+	771465216,
+	771466240,
+	771467264,
+	771468288,
+	771469312,
+	771470336,
+	771471360,
+	771472384,
+	771473408,
+	771474432,
+	771475456,
+	771476480,
+	771477504,
+	771478528,
+	771479552,
+	771480576,
+	771481600,
+	771489792,
+	771490816,
+	771491840,
+	771492864,
+	771493888,
+	771494912,
+	771495936,
+	771496960,
+	771497984,
+	771499008,
+	771500032,
+	771501056,
+	771502080,
+	771505152,
+	771511296,
+	771512320,
+	771513344,
+	771514368,
+	771515392,
+	771516416,
+	771517440,
+	771518464,
+	771519488,
+	771520512,
+	771521536,
+	771522560,
+	771523584,
+	771524608,
+	771525632,
+	771526656,
+	771527680,
+	771528704,
+	771529728,
+	771530752,
+	771531776,
+	771532800,
+	771533824,
+	771534848,
+	771538944,
+	771539968,
+	771540992,
+	771542016,
+	771543040,
+	771544064,
+	771545088,
+	771546112,
+	771547136,
+	771548160,
+	771549184,
+	771555328,
+	771556352,
+	771557376,
+	771558400,
+	771559424,
+	771560448,
+	771561472,
+	771562496,
+	771563520,
+	771564544,
+	771565568,
+	771566592,
+	771567616,
+	771568640,
+	771569664,
+	771570688,
+	771571712,
+	771572736,
+	771573760,
+	771574784,
+	771575808,
+	771576832,
+	771578880,
+	771579904,
+	771580928,
+	771581952,
+	771582976,
+	771584000,
+	771585024,
+	771586048,
+	771588608,
+	771589120,
+	771590144,
+	771591168,
+	771592192,
+	771593216,
+	771594240,
+	771595264,
+	771596288,
+	771597312,
+	771598336,
+	771599360,
+	771600384,
+	771601408,
+	771602432,
+	771603456,
+	771604480,
+	771605504,
+	771606528,
+	771607552,
+	771608576,
+	771609600,
+	771610624,
+	771611648,
+	771612672,
+	771613696,
+	771614720,
+	771615744,
+	771616768,
+	771617792,
+	771618816,
+	771619840,
+	771620864,
+	771621888,
+	771622912,
+	771623936,
+	771624960,
+	771625984,
+	771627008,
+	771628032,
+	771631104,
+	771633152,
+	771634176,
+	771635200,
+	771636224,
+	771637248,
+	771638272,
+	771639296,
+	771640320,
+	771641344,
+	771642368,
+	771643392,
+	771644416,
+	771645440,
+	771646464,
+	771647488,
+	771648512,
+	771649536,
+	771650560,
+	771651584,
+	771652608,
+	771653632,
+	771654656,
+	771655680,
+	771656704,
+	771657728,
+	771658752,
+	771659776,
+	771660800,
+	771661824,
+	771662848,
+	771663872,
+	771664896,
+	771665920,
+	771666944,
+	771667968,
+	771668992,
+	771670016,
+	771671040,
+	771672064,
+	771673088,
+	771674112,
+	771675136,
+	771676160,
+	771677184,
+	771678208,
+	771679232,
+	771681280,
+	771682304,
+	771684352,
+	771686400,
+	771687424,
+	771688448,
+	771689472,
+	771690496,
+	771691520,
+	771692544,
+	771693568,
+	771694592,
+	771695616,
+	771696640,
+	771697664,
+	771698688,
+	771699712,
+	771700736,
+	771701760,
+	771702784,
+	771703808,
+	771704832,
+	771705856,
+	771706880,
+	771707904,
+	771708928,
+	771709952,
+	771710976,
+	771712000,
+	771713024,
+	771714048,
+	771715072,
+	771716096,
+	771717120,
+	771718144,
+	771720192,
+	771721216,
+	771722240,
+	771723264,
+	771724288,
+	771725312,
+	771726336,
+	771727360,
+	771728384,
+	771729408,
+	771730432,
+	771731456,
+	771732480,
+	771733504,
+	771734528,
+	771735552,
+	771736576,
+	771737600,
+	771738624,
+	771739648,
+	771740672,
+	771741696,
+	771742720,
+	771743744,
+	771744768,
+	771745792,
+	771746816,
+	771747840,
+	771748864,
+	771749888,
+	794558464,
+	794820608,
+	822345728,
+	825425920,
+	825491456,
+	826277888,
+	829423616,
+	829947904,
+	830472192,
+	830472704,
+	830473216,
+	831258624,
+	832045056,
+	835715072,
+	835846144,
+	836501504,
+	837287936,
+	837746688,
+	837795840,
+	838262784,
+	877658112,
+	920518656,
+	973996032,
+	974127104,
+	974192640,
+	974225408,
+	974258176,
+	974323712,
+	974389248,
+	974454784,
+	974520320,
+	974651392,
+	975044608,
+	975175680,
+	975699968,
+	975831040,
+	975896576,
+	975962112,
+	976224256,
+	976748544,
+	976879616,
+	976945152,
+	976977920,
+	977010688,
+	977397760,
+	977403904,
+	977567744,
+	978452480,
+	978518016,
+	978550784,
+	978796544,
+	979599360,
+	979632128,
+	980680704,
+	981467136,
+	982515712,
+	983171072,
+	985661440,
+	985792512,
+	985923584,
+	986054656,
+	986185728,
+	986710016,
+	988807168,
+	988938240,
+	989069312,
+	989200384,
+	989331456,
+	991952896,
+	992477184,
+	992608256,
+	992673792,
+	992739328,
+	993001472,
+	993067008,
+	993099776,
+	993132544,
+	993198080,
+	993230848,
+	993263616,
+	993525760,
+	993787904,
+	993918976,
+	994050048,
+	994312192,
+	994574336,
+	994705408,
+	994836480,
+	994902016,
+	994967552,
+	995098624,
+	995229696,
+	996868096,
+	996900864,
+	996933632,
+	997064704,
+	999751680,
+	999821312,
+	999822336,
+	999823360,
+	999824384,
+	999825408,
+	999826432,
+	999833600,
+	999834624,
+	999835648,
+	999836672,
+	999845888,
+	999846912,
+	999883776,
+	999890944,
+	999898112,
+	999899136,
+	999900160,
+	999901184,
+	999906304,
+	999912448,
+	999917568,
+	999921664,
+	999922688,
+	999924736,
+	999925760,
+	999926784,
+	999927808,
+	999928832,
+	999929856,
+	999930880,
+	999931904,
+	1000013824,
+	1001127936,
+	1001259008,
+	1002373120,
+	1002434560,
+	1002438656,
+	1006632960,
+	1007157248,
+	1007288320,
+	1007353856,
+	1007419392,
+	1007484928,
+	1007501312,
+	1007517696,
+	1007550464,
+	1007681536,
+	1008205824,
+	1008467968,
+	1008599040,
+	1008664576,
+	1010237440,
+	1010761728,
+	1017118720,
+	1017249792,
+	1017380864,
+	1017511936,
+	1017643008,
+	1018167296,
+	1019346944,
+	1019740160,
+	1020002304,
+	1020067840,
+	1020133376,
+	1020264448,
+	1020788736,
+	1020919808,
+	1021050880,
+	1021837312,
+	1022033920,
+	1022722048,
+	1022820352,
+	1023148032,
+	1023246336,
+	1023344640,
+	1023692800,
+	1023693824,
+	1023694848,
+	1023717376,
+	1023975424,
+	1024381952,
+	1024382976,
+	1024384000,
+	1024389120,
+	1024390144,
+	1025245184,
+	1025249280,
+	1025253376,
+	1025261568,
+	1025343488,
+	1025359872,
+	1025368064,
+	1025372160,
+	1026392064,
+	1026416640,
+	1026523136,
+	1026555904,
+	1026818048,
+	1026949120,
+	1027014656,
+	1029160960,
+	1031798784,
+	1031929856,
+	1032060928,
+	1032126464,
+	1032159232,
+	1032192000,
+	1032208384,
+	1032216576,
+	1032224768,
+	1032241152,
+	1032257536,
+	1032323072,
+	1032339456,
+	1032355840,
+	1032388608,
+	1032421376,
+	1032454144,
+	1032470528,
+	1032486912,
+	1032503296,
+	1032519680,
+	1032552448,
+	1032568832,
+	1032585216,
+	1032847360,
+	1033109504,
+	1033240576,
+	1033371648,
+	1033437184,
+	1033502720,
+	1033633792,
+	1033699328,
+	1033764864,
+	1033797632,
+	1033830400,
+	1033846784,
+	1033863168,
+	1033895936,
+	1033961472,
+	1033977856,
+	1033994240,
+	1034027008,
+	1034092544,
+	1034158080,
+	1034223616,
+	1034289152,
+	1034354688,
+	1034420224,
+	1034485760,
+	1034551296,
+	1034682368,
+	1034944512,
+	1035010048,
+	1035075584,
+	1035141120,
+	1035206656,
+	1035239424,
+	1035272192,
+	1035337728,
+	1035403264,
+	1035468800,
+	1035730944,
+	1035796480,
+	1035829248,
+	1035862016,
+	1038614528,
+	1038876672,
+	1039138816,
+	1694498816,
+	1694564352,
+	1694673920,
+	1694760960,
+	1695547392,
+	1696595968,
+	1696858112,
+	1696923648,
+	1696989184,
+	1697120256,
+	1697644544,
+	1697777664,
+	1697778688,
+	1697789952,
+	1697906688,
+	1697997824,
+	1698037760,
+	1698160640,
+	1698693120,
+	1699217408,
+	1699479552,
+	1699610624,
+	1699618816,
+	1699741696,
+	1700790272,
+	1700792320,
+	1700794368,
+	1700823040,
+	1701011456,
+	1701134336,
+	1701143552,
+	1701144064,
+	1701144576,
+	1701146624,
+	1701199872,
+	1701209088,
+	1701209600,
+	1701210112,
+	1701212160,
+	1701314560,
+	1701724160,
+	1701732352,
+	1701737472,
+	1701738496,
+	1702363136,
+	1702625280,
+	1702756352,
+	1702887424,
+	1702889472,
+	1702891520,
+	1702895616,
+	1702952960,
+	1703018496,
+	1703149568,
+	1703936000,
+	1707081728,
+	1707343872,
+	1707606016,
+	1707835392,
+	1707843584,
+	1707846656,
+	1707847680,
+	1707868160,
+	1709178880,
+	1709703168,
+	1709850624,
+	1709853696,
+	1709854720,
+	1709858816,
+	1709965312,
+	1710227456,
+	1710489600,
+	1710751744,
+	1710948352,
+	1710950400,
+	1710952448,
+	1710956544,
+	1710964736,
+	1710981120,
+	1711013888,
+	1711144960,
+	1728120832,
+	1728123904,
+	1728124928,
+	1728137216,
+	1728141312,
+	1728161792,
+	1728211968,
+	1728224256,
+	1728226304,
+	1728235520,
+	1728236544,
+	1728237568,
+	1728238592,
+	1728271360,
+	1728272384,
+	1728273408,
+	1728274432,
+	1728275456,
+	1728276480,
+	1728277504,
+	1728278528,
+	1728279552,
+	1728280576,
+	1728281600,
+	1728282624,
+	1728283648,
+	1728284672,
+	1728285696,
+	1728287744,
+	1728288768,
+	1728289792,
+	1728329728,
+	1728358400,
+	1728362496,
+	1728372736,
+	1728390144,
+	1728394240,
+	1728395264,
+	1728419840,
+	1728423936,
+	1728430080,
+	1728445440,
+	1728465920,
+	1728474112,
+	1728477184,
+	1728502784,
+	1728504832,
+	1728513024,
+	1728519168,
+	1728542720,
+	1728547840,
+	1728566272,
+	1728567296,
+	1728568320,
+	1728577536,
+	1728578560,
+	1728579584,
+	1728585728,
+	1728590848,
+	1728594944,
+	1728605184,
+	1728617472,
+	1728628736,
+	1728629760,
+	1728633856,
+	1728645120,
+	1728649216,
+	1728670720,
+	1728681984,
+	1728692224,
+	1728706560,
+	1728707584,
+	1728708608,
+	1728712704,
+	1728730112,
+	1728744448,
+	1728778240,
+	1728817152,
+	1728820224,
+	1728847872,
+	1728857088,
+	1728863232,
+	1728874496,
+	1728886784,
+	1728899072,
+	1728908288,
+	1728923648,
+	1728936960,
+	1728942080,
+	1728955392,
+	1728961536,
+	1728967680,
+	1728978944,
+	1728992256,
+	1728996352,
+	1728999424,
+	1729004544,
+	1729005568,
+	1729010688,
+	1729032192,
+	1729037312,
+	1729038336,
+	1729040384,
+	1729060864,
+	1729087488,
+	1729115136,
+	1729122304,
+	1729123328,
+	1729124352,
+	1729129472,
+	1729133568,
+	1729177600,
+	1729183744,
+	1729198080,
+	1729202176,
+	1729208320,
+	1729219584,
+	1729225728,
+	1729282048,
+	1729286144,
+	1729287168,
+	1729290240,
+	1729298432,
+	1729301504,
+	1729308672,
+	1729309696,
+	1729314816,
+	1729315840,
+	1729316864,
+	1729357824,
+	1729367040,
+	1729372160,
+	1729375232,
+	1729381376,
+	1729392640,
+	1729396736,
+	1729404928,
+	1729427456,
+	1729458176,
+	1729459200,
+	1729464320,
+	1729465344,
+	1729474560,
+	1729482752,
+	1729490944,
+	1729495040,
+	1729496064,
+	1729497088,
+	1729498112,
+	1729499136,
+	1729500160,
+	1729501184,
+	1729502208,
+	1729503232,
+	1729504256,
+	1729505280,
+	1729506304,
+	1729507328,
+	1729508352,
+	1729509376,
+	1729510400,
+	1729511424,
+	1729512448,
+	1729513472,
+	1729514496,
+	1729515520,
+	1729516544,
+	1729517568,
+	1729518592,
+	1729520640,
+	1729521664,
+	1729522688,
+	1729523712,
+	1729524736,
+	1729525760,
+	1729526784,
+	1729543168,
+	1729553408,
+	1729559552,
+	1729562624,
+	1729574912,
+	1729601536,
+	1729602560,
+	1729605632,
+	1729618944,
+	1729632256,
+	1729655808,
+	1729658880,
+	1729662976,
+	1729671168,
+	1729673216,
+	1729682432,
+	1729684480,
+	1729689600,
+	1729690624,
+	1729693696,
+	1729696768,
+	1729697792,
+	1729698816,
+	1729699840,
+	1729700864,
+	1729701888,
+	1729703936,
+	1729708032,
+	1729709056,
+	1729729536,
+	1729731584,
+	1729746944,
+	1729757184,
+	1729773568,
+	1729776640,
+	1729786880,
+	1729790976,
+	1729797120,
+	1729798144,
+	1729815552,
+	1729818624,
+	1729823744,
+	1729825792,
+	1729828864,
+	1729837056,
+	1729847296,
+	1729869824,
+	1729875968,
+	1729876992,
+	1729884160,
+	1729889280,
+	1729890304,
+	1729935360,
+	1729940480,
+	1729942528,
+	1729953792,
+	1729957888,
+	1729986560,
+	1729987584,
+	1729988608,
+	1730024448,
+	1730043904,
+	1730057216,
+	1730070528,
+	1730077696,
+	1730079744,
+	1730084864,
+	1730097152,
+	1730098176,
+	1730099200,
+	1730100224,
+	1730101248,
+	1730102272,
+	1730122752,
+	1730125824,
+	1730127872,
+	1730136064,
+	1730145280,
+	1730150400,
+	1730151424,
+	1730152448,
+	1730153472,
+	1730154496,
+	1730155520,
+	1730156544,
+	1730157568,
+	1730158592,
+	1730159616,
+	1730160640,
+	1730161664,
+	1730162688,
+	1730163712,
+	1730164736,
+	1730165760,
+	1730166784,
+	1730167808,
+	1730168832,
+	1730169856,
+	1730170880,
+	1730171904,
+	1730172928,
+	1730173952,
+	1730174976,
+	1730176000,
+	1730177024,
+	1730178048,
+	1730179072,
+	1730180096,
+	1730181120,
+	1730182144,
+	1730183168,
+	1730184192,
+	1730185216,
+	1730186240,
+	1730187264,
+	1730188288,
+	1730189312,
+	1730190336,
+	1730191360,
+	1730192384,
+	1730193408,
+	1730194432,
+	1730195456,
+	1730196480,
+	1730197504,
+	1730198528,
+	1730199552,
+	1730200576,
+	1730201600,
+	1730202624,
+	1730203648,
+	1730204672,
+	1730205696,
+	1730206720,
+	1730207744,
+	1730208768,
+	1730209792,
+	1730210816,
+	1730211840,
+	1730212864,
+	1730213888,
+	1730214912,
+	1730215936,
+	1730216960,
+	1730217984,
+	1730219008,
+	1730220032,
+	1730221056,
+	1730222080,
+	1730223104,
+	1730224128,
+	1730225152,
+	1730226176,
+	1730227200,
+	1730228224,
+	1730229248,
+	1730230272,
+	1730231296,
+	1730232320,
+	1730233344,
+	1730234368,
+	1730235392,
+	1730236416,
+	1730237440,
+	1730238464,
+	1730239488,
+	1730240512,
+	1730241536,
+	1730242560,
+	1730243584,
+	1730244608,
+	1730245632,
+	1730246656,
+	1730247680,
+	1730248704,
+	1730249728,
+	1730250752,
+	1730251776,
+	1730252800,
+	1730253824,
+	1730254848,
+	1730255872,
+	1730256896,
+	1730257920,
+	1730258944,
+	1730259968,
+	1730260992,
+	1730262016,
+	1730263040,
+	1730264064,
+	1730265088,
+	1730266112,
+	1730267136,
+	1730268160,
+	1730269184,
+	1730270208,
+	1730271232,
+	1730272256,
+	1730273280,
+	1730274304,
+	1730275328,
+	1730276352,
+	1730277376,
+	1730278400,
+	1730279424,
+	1730280448,
+	1730281472,
+	1730282496,
+	1730283520,
+	1730284544,
+	1730285568,
+	1730286592,
+	1730287616,
+	1730288640,
+	1730289664,
+	1730290688,
+	1730291712,
+	1730292736,
+	1730293760,
+	1730294784,
+	1730295808,
+	1730296832,
+	1730297856,
+	1730298880,
+	1730299904,
+	1730300928,
+	1730301952,
+	1730302976,
+	1730304000,
+	1730305024,
+	1730306048,
+	1730307072,
+	1730308096,
+	1730309120,
+	1730310144,
+	1730311168,
+	1730312192,
+	1730313216,
+	1730314240,
+	1730315264,
+	1730316288,
+	1730317312,
+	1730318336,
+	1730319360,
+	1730320384,
+	1730321408,
+	1730322432,
+	1730323456,
+	1730324480,
+	1730325504,
+	1730326528,
+	1730327552,
+	1730328576,
+	1730329600,
+	1730330624,
+	1730331648,
+	1730332672,
+	1730333696,
+	1730334720,
+	1730335744,
+	1730336768,
+	1730337792,
+	1730338816,
+	1730339840,
+	1730340864,
+	1730341888,
+	1730342912,
+	1730343936,
+	1730344960,
+	1730345984,
+	1730347008,
+	1730348032,
+	1730349056,
+	1730350080,
+	1730351104,
+	1730352128,
+	1730353152,
+	1730354176,
+	1730355200,
+	1730356224,
+	1730357248,
+	1730358272,
+	1730359296,
+	1730373632,
+	1730376704,
+	1730398208,
+	1730403328,
+	1730417664,
+	1730419712,
+	1730421760,
+	1730426880,
+	1730427904,
+	1730428928,
+	1730430976,
+	1730437120,
+	1730446336,
+	1730447360,
+	1730453504,
+	1730454528,
+	1730455552,
+	1730456576,
+	1730457600,
+	1730458624,
+	1730459648,
+	1730460672,
+	1730461696,
+	1730462720,
+	1730463744,
+	1730464768,
+	1730465792,
+	1730466816,
+	1730467840,
+	1730468864,
+	1730469888,
+	1730470912,
+	1730471936,
+	1730472960,
+	1730473984,
+	1730475008,
+	1730478080,
+	1730481152,
+	1730482176,
+	1730484224,
+	1730489344,
+	1730491392,
+	1730492416,
+	1730496512,
+	1730503680,
+	1730504704,
+	1730509824,
+	1730512896,
+	1730513920,
+	1730514944,
+	1730515968,
+	1730516992,
+	1730518016,
+	1730519040,
+	1730520064,
+	1730522112,
+	1730523136,
+	1730526208,
+	1730531328,
+	1730532352,
+	1730533376,
+	1730534400,
+	1730541568,
+	1730542592,
+	1730543616,
+	1730551808,
+	1730553856,
+	1730554880,
+	1730557952,
+	1730563072,
+	1730565120,
+	1730567168,
+	1730568192,
+	1730573312,
+	1730577408,
+	1730579456,
+	1730599936,
+	1730600960,
+	1730601984,
+	1730603008,
+	1730608128,
+	1730613248,
+	1730625536,
+	1730631680,
+	1730634752,
+	1730635776,
+	1730636800,
+	1730650112,
+	1730651136,
+	1730652160,
+	1730653184,
+	1730654208,
+	1730655232,
+	1730656256,
+	1730657280,
+	1730660352,
+	1730661376,
+	1730662400,
+	1730663424,
+	1730664448,
+	1730665472,
+	1730666496,
+	1730667520,
+	1730668544,
+	1730677760,
+	1730678784,
+	1730679808,
+	1730680832,
+	1730681856,
+	1730682880,
+	1730683904,
+	1730684928,
+	1730685952,
+	1730697216,
+	1730700288,
+	1730703360,
+	1730723840,
+	1730728960,
+	1730731008,
+	1730733056,
+	1730734080,
+	1730735104,
+	1730736128,
+	1730737152,
+	1730738176,
+	1730739200,
+	1730740224,
+	1730744320,
+	1730753536,
+	1730776064,
+	1730778112,
+	1730779136,
+	1730781184,
+	1730782208,
+	1730796544,
+	1730797568,
+	1730798592,
+	1730799616,
+	1730807808,
+	1730811904,
+	1730812928,
+	1730813952,
+	1730822144,
+	1730823168,
+	1730825216,
+	1730832384,
+	1730851840,
+	1730865152,
+	1730875392,
+	1730892800,
+	1730895872,
+	1730896896,
+	1730897920,
+	1730903040,
+	1730905088,
+	1730918400,
+	1730920448,
+	1730921472,
+	1730924544,
+	1730927616,
+	1730928640,
+	1730930688,
+	1730932736,
+	1730951168,
+	1730957312,
+	1730959360,
+	1730967552,
+	1730968576,
+	1730970624,
+	1730973696,
+	1730979840,
+	1730981888,
+	1730982912,
+	1730983936,
+	1730984960,
+	1730985984,
+	1730987008,
+	1730988032,
+	1730989056,
+	1730994176,
+	1730997248,
+	1730998272,
+	1730999296,
+	1731000320,
+	1731001344,
+	1731002368,
+	1731003392,
+	1731004416,
+	1731005440,
+	1731006464,
+	1731007488,
+	1731008512,
+	1731009536,
+	1731010560,
+	1731011584,
+	1731012608,
+	1731013632,
+	1731014656,
+	1731015680,
+	1731016704,
+	1731017728,
+	1731020800,
+	1731021824,
+	1731022848,
+	1731023872,
+	1731024896,
+	1731025920,
+	1731026944,
+	1731027968,
+	1731028992,
+	1731030016,
+	1731031040,
+	1731032064,
+	1731033088,
+	1731034112,
+	1731035136,
+	1731036160,
+	1731037184,
+	1731038208,
+	1731039232,
+	1731040256,
+	1731041280,
+	1731042304,
+	1731043328,
+	1731044352,
+	1731045376,
+	1731046400,
+	1731047424,
+	1731048448,
+	1731049472,
+	1731050496,
+	1731051520,
+	1731052544,
+	1731053568,
+	1731054592,
+	1731055616,
+	1731056640,
+	1731057664,
+	1731058688,
+	1731059712,
+	1731065856,
+	1731067904,
+	1731070976,
+	1731072000,
+	1731073024,
+	1731074048,
+	1731075072,
+	1731076096,
+	1731077120,
+	1731078144,
+	1731079168,
+	1731080192,
+	1731081216,
+	1731082240,
+	1731083264,
+	1731084288,
+	1731085312,
+	1731086336,
+	1731087360,
+	1731088384,
+	1731089408,
+	1731090432,
+	1731091456,
+	1731092480,
+	1731093504,
+	1731094528,
+	1731095552,
+	1731096576,
+	1731097600,
+	1731098624,
+	1731099648,
+	1731100672,
+	1731101696,
+	1731102720,
+	1731106816,
+	1731107840,
+	1731108864,
+	1731109888,
+	1731110912,
+	1731111936,
+	1731112960,
+	1731113984,
+	1731130368,
+	1731131392,
+	1731134464,
+	1731138560,
+	1731142656,
+	1731143680,
+	1731145728,
+	1731153920,
+	1731158016,
+	1731161088,
+	1731163136,
+	1731164160,
+	1731168256,
+	1731169280,
+	1731187712,
+	1731189760,
+	1731196928,
+	1731204096,
+	1731212288,
+	1731222528,
+	1731235840,
+	1731236864,
+	1731237888,
+	1731238912,
+	1731250688,
+	1731254272,
+	1731255296,
+	1731256320,
+	1731257344,
+	1731258368,
+	1731259392,
+	1731260416,
+	1731261440,
+	1731267584,
+	1731269632,
+	1731282944,
+	1731283968,
+	1731288064,
+	1731289088,
+	1731292160,
+	1731297280,
+	1731309568,
+	1731310592,
+	1731314688,
+	1731328000,
+	1731339264,
+	1731341312,
+	1731342336,
+	1731343360,
+	1731344384,
+	1731345408,
+	1731346432,
+	1731347456,
+	1731348480,
+	1731357696,
+	1731358720,
+	1731359744,
+	1731360768,
+	1731361792,
+	1731363840,
+	1731364864,
+	1731365888,
+	1731374080,
+	1731375104,
+	1731376128,
+	1731377152,
+	1731378176,
+	1731379200,
+	1731380224,
+	1731381248,
+	1731386368,
+	1731387392,
+	1731388416,
+	1731389440,
+	1731390464,
+	1731391488,
+	1731392512,
+	1731393536,
+	1731471360,
+	1731479552,
+	1731480576,
+	1731481600,
+	1731482624,
+	1731485696,
+	1731486720,
+	1731487744,
+	1731502080,
+	1731503104,
+	1731505152,
+	1731506176,
+	1731508224,
+	1731511296,
+	1731527680,
+	1731543040,
+	1731544064,
+	1731550208,
+	1731552256,
+	1731558400,
+	1731559424,
+	1731560448,
+	1731561472,
+	1731562496,
+	1731563520,
+	1731567616,
+	1731572736,
+	1731578880,
+	1731579904,
+	1731580928,
+	1731581952,
+	1731587072,
+	1731590144,
+	1731594240,
+	1731604480,
+	1731607552,
+	1731633152,
+	1731634176,
+	1731646464,
+	1731650560,
+	1731653632,
+	1731663872,
+	1731678208,
+	1731688448,
+	1731696640,
+	1731701760,
+	1731709952,
+	1731710976,
+	1731716096,
+	1731718144,
+	1731719168,
+	1731725312,
+	1731727360,
+	1731728384,
+	1731731456,
+	1731736576,
+	1731737600,
+	1731738624,
+	1731741696,
+	1731742720,
+	1731748864,
+	1731749888,
+	1731759104,
+	1731762176,
+	1731770368,
+	1731774464,
+	1731778560,
+	1731791872,
+	1731802112,
+	1731803136,
+	1731808256,
+	1731816448,
+	1731823616,
+	1731838976,
+	1731860480,
+	1731900928,
+	1731939328,
+	1731945472,
+	1731948544,
+	1731949568,
+	1731950592,
+	1731951616,
+	1731952640,
+	1731957760,
+	1731961856,
+	1731993600,
+	1731996672,
+	1732027392,
+	1732043776,
+	1732045824,
+	1732066304,
+	1732077568,
+	1732086784,
+	1732089856,
+	1732090880,
+	1732091904,
+	1732094976,
+	1732096000,
+	1732098048,
+	1732099072,
+	1732122624,
+	1732129792,
+	1732134912,
+	1732135936,
+	1732136960,
+	1732137984,
+	1732139008,
+	1732141056,
+	1732142080,
+	1732143104,
+	1732144128,
+	1732145152,
+	1732146176,
+	1732147200,
+	1732148224,
+	1732149248,
+	1732150272,
+	1732156416,
+	1732157440,
+	1732158464,
+	1732159488,
+	1732160512,
+	1732161536,
+	1732162560,
+	1732163584,
+	1732164608,
+	1732165632,
+	1732168704,
+	1732169728,
+	1732170752,
+	1732171776,
+	1732172800,
+	1732173824,
+	1732190208,
+	1732191232,
+	1732192256,
+	1732193280,
+	1732194304,
+	1732195328,
+	1732196352,
+	1732197376,
+	1732198400,
+	1732199424,
+	1732200448,
+	1732201472,
+	1732202496,
+	1732203520,
+	1732204544,
+	1732217856,
+	1732218880,
+	1732220928,
+	1732222976,
+	1732224000,
+	1732225024,
+	1732226048,
+	1732227072,
+	1732228096,
+	1732229120,
+	1732231168,
+	1732232192,
+	1732233216,
+	1732234240,
+	1732235264,
+	1732243456,
+	1732244480,
+	1732245504,
+	1732246528,
+	1732247552,
+	1732248576,
+	1732253696,
+	1732254720,
+	1732255744,
+	1732256768,
+	1732257792,
+	1732258816,
+	1732259840,
+	1732260864,
+	1732261888,
+	1732262912,
+	1732263936,
+	1732264960,
+	1732265984,
+	1732267008,
+	1732268032,
+	1732269056,
+	1732270080,
+	1732271104,
+	1732272128,
+	1732273152,
+	1732274176,
+	1732275200,
+	1732276224,
+	1732277248,
+	1732278272,
+	1732279296,
+	1732283392,
+	1732284416,
+	1732286464,
+	1732287488,
+	1732288512,
+	1732289536,
+	1732290560,
+	1732291584,
+	1732292608,
+	1732293632,
+	1732294656,
+	1732295680,
+	1732296704,
+	1732297728,
+	1732298752,
+	1732299776,
+	1732300800,
+	1732301824,
+	1732302848,
+	1732303872,
+	1732304896,
+	1732305920,
+	1732306944,
+	1732307968,
+	1732308992,
+	1732310016,
+	1732311040,
+	1732312064,
+	1732313088,
+	1732314112,
+	1732315136,
+	1732316160,
+	1732317184,
+	1732322304,
+	1732323328,
+	1732325376,
+	1732326400,
+	1732327424,
+	1732328448,
+	1732329472,
+	1732330496,
+	1732331520,
+	1732332544,
+	1732333568,
+	1732334592,
+	1732335616,
+	1732336640,
+	1732338688,
+	1732339712,
+	1732340736,
+	1732341760,
+	1732342784,
+	1732343808,
+	1732344832,
+	1732345856,
+	1732346880,
+	1732347904,
+	1732349952,
+	1732350976,
+	1732352000,
+	1732353024,
+	1732354048,
+	1732355072,
+	1732356096,
+	1732357120,
+	1732386816,
+	1732388864,
+	1732402176,
+	1732406272,
+	1732429824,
+	1732433920,
+	1732440064,
+	1732441088,
+	1732442112,
+	1732443136,
+	1732444160,
+	1732445184,
+	1732446208,
+	1732454400,
+	1732455424,
+	1732456448,
+	1732457472,
+	1732458496,
+	1732459520,
+	1732460544,
+	1732461568,
+	1732462592,
+	1732463616,
+	1732464640,
+	1732465664,
+	1732466688,
+	1732467712,
+	1732468736,
+	1732469760,
+	1732470784,
+	1732471808,
+	1732472832,
+	1732473856,
+	1732474880,
+	1732475904,
+	1732476928,
+	1732477952,
+	1732478976,
+	1732480000,
+	1732481024,
+	1732482048,
+	1732488192,
+	1732493312,
+	1732498432,
+	1732508672,
+	1732526080,
+	1732532224,
+	1732535296,
+	1732542464,
+	1732558848,
+	1732579328,
+	1732604928,
+	1732609024,
+	1732614144,
+	1732629504,
+	1732642816,
+	1732678656,
+	1732687872,
+	1732697088,
+	1732698112,
+	1732701184,
+	1732705280,
+	1732706304,
+	1732714496,
+	1732718592,
+	1732723712,
+	1732724736,
+	1732726784,
+	1732727808,
+	1732728832,
+	1732737024,
+	1732738048,
+	1732739072,
+	1732743168,
+	1732756480,
+	1732757504,
+	1732765696,
+	1732774912,
+	1732775936,
+	1732776960,
+	1732777984,
+	1732779008,
+	1732780032,
+	1732781056,
+	1732782080,
+	1732783104,
+	1732784128,
+	1732785152,
+	1732800512,
+	1732801536,
+	1732802560,
+	1732803584,
+	1732804608,
+	1732805632,
+	1732808704,
+	1732809728,
+	1732813824,
+	1732815872,
+	1732817920,
+	1732829184,
+	1732830208,
+	1732831232,
+	1732832256,
+	1732833280,
+	1732834304,
+	1732835328,
+	1732836352,
+	1732837376,
+	1732838400,
+	1732839424,
+	1732840448,
+	1732841472,
+	1732842496,
+	1732843520,
+	1732844544,
+	1732849664,
+	1732859904,
+	1732861952,
+	1732867072,
+	1732868096,
+	1732870144,
+	1732871168,
+	1732872192,
+	1732873216,
+	1732874240,
+	1732880384,
+	1732882432,
+	1732889600,
+	1732890624,
+	1732898816,
+	1732899840,
+	1732900864,
+	1732909056,
+	1732910080,
+	1732911104,
+	1732912128,
+	1732913152,
+	1732914176,
+	1732915200,
+	1732917248,
+	1732918272,
+	1732923392,
+	1732934656,
+	1732940800,
+	1732941824,
+	1732942848,
+	1732955136,
+	1732962304,
+	1732972544,
+	1732989952,
+	1732990976,
+	1732992000,
+	1732995072,
+	1732996096,
+	1732997120,
+	1732999168,
+	1733001216,
+	1733005312,
+	1733007360,
+	1733028864,
+	1733049344,
+	1733050368,
+	1733051392,
+	1733052416,
+	1733055488,
+	1740636160,
+	1740637184,
+	1740638208,
+	1740639232,
+	1740640256,
+	1740641280,
+	1740642304,
+	1740643328,
+	1740648448,
+	1740649472,
+	1740650496,
+	1740657664,
+	1740658688,
+	1740659712,
+	1740660736,
+	1740661760,
+	1740662784,
+	1740663808,
+	1740664832,
+	1740668928,
+	1740669952,
+	1740670976,
+	1740672000,
+	1740673024,
+	1740678144,
+	1740684288,
+	1740689408,
+	1740690432,
+	1740691456,
+	1740700672,
+	1740711936,
+	1740712960,
+	1740732416,
+	1740733440,
+	1740737536,
+	1740738560,
+	1740739584,
+	1740742656,
+	1740749824,
+	1740750848,
+	1740755968,
+	1740756992,
+	1740758016,
+	1740759040,
+	1740760064,
+	1740761088,
+	1740762112,
+	1740763136,
+	1740771328,
+	1740826112,
+	1740859392,
+	1740861440,
+	1740867584,
+	1740870656,
+	1740871680,
+	1740873728,
+	1740881920,
+	1740913664,
+	1740914688,
+	1740916736,
+	1740920832,
+	1740921856,
+	1740922880,
+	1740941312,
+	1740945408,
+	1740950528,
+	1741009920,
+	1741022208,
+	1741028352,
+	1741034496,
+	1741044736,
+	1741045760,
+	1741047808,
+	1741061120,
+	1741069312,
+	1741075456,
+	1741079552,
+	1741080576,
+	1741084672,
+	1741085696,
+	1741086720,
+	1741087744,
+	1741088768,
+	1741089792,
+	1741090816,
+	1741091840,
+	1741136896,
+	1741145088,
+	1741153280,
+	1741158400,
+	1741159424,
+	1741167616,
+	1741168640,
+	1741173760,
+	1741176832,
+	1741177856,
+	1741195264,
+	1741196288,
+	1741197312,
+	1741198336,
+	1741199360,
+	1741200384,
+	1741201408,
+	1741202432,
+	1741203456,
+	1741204480,
+	1741205504,
+	1741206528,
+	1741207552,
+	1741208576,
+	1741209600,
+	1741216768,
+	1741217792,
+	1741218816,
+	1741219840,
+	1741220864,
+	1741221888,
+	1741222912,
+	1741223936,
+	1741224960,
+	1741225984,
+	1741227008,
+	1741228032,
+	1741229056,
+	1741230080,
+	1741231104,
+	1741233152,
+	1741234176,
+	1741235200,
+	1741236224,
+	1741237248,
+	1741238272,
+	1741239296,
+	1741240320,
+	1741241344,
+	1741242368,
+	1741245440,
+	1741246464,
+	1741247488,
+	1741248512,
+	1741249536,
+	1741250560,
+	1741251584,
+	1741252608,
+	1741253632,
+	1741254656,
+	1741255680,
+	1741256704,
+	1741264896,
+	1741265920,
+	1741266944,
+	1741267968,
+	1741268992,
+	1741270016,
+	1741271040,
+	1741272064,
+	1741273088,
+	1741274112,
+	1741275136,
+	1741276160,
+	1741277184,
+	1741278208,
+	1741279232,
+	1741280256,
+	1741281280,
+	1741282304,
+	1741283328,
+	1741284352,
+	1741285376,
+	1741286400,
+	1741287424,
+	1741288448,
+	1741289472,
+	1741290496,
+	1741291520,
+	1741292544,
+	1741293568,
+	1741294592,
+	1741295616,
+	1741296640,
+	1741297664,
+	1741298688,
+	1741299712,
+	1741300736,
+	1741301760,
+	1741302784,
+	1741305856,
+	1741306880,
+	1741307904,
+	1741308928,
+	1741309952,
+	1741310976,
+	1741312000,
+	1741313024,
+	1741314048,
+	1741315072,
+	1741316096,
+	1741317120,
+	1741318144,
+	1741319168,
+	1741320192,
+	1741321216,
+	1741322240,
+	1741323264,
+	1741324288,
+	1741325312,
+	1741326336,
+	1741327360,
+	1741328384,
+	1741330432,
+	1741331456,
+	1741332480,
+	1741333504,
+	1741334528,
+	1741335552,
+	1741336576,
+	1741337600,
+	1741338624,
+	1741339648,
+	1741340672,
+	1741341696,
+	1741342720,
+	1741345792,
+	1741349888,
+	1741351936,
+	1741352960,
+	1741353984,
+	1741355008,
+	1741356032,
+	1741357056,
+	1741358080,
+	1741359104,
+	1741360128,
+	1741361152,
+	1741362176,
+	1741363200,
+	1741364224,
+	1741365248,
+	1741370368,
+	1741371392,
+	1741381632,
+	1741382656,
+	1741383680,
+	1741384704,
+	1741385728,
+	1741386752,
+	1741387776,
+	1741388800,
+	1741389824,
+	1741392896,
+	1741399040,
+	1741400064,
+	1741406208,
+	1741408256,
+	1741411328,
+	1741412352,
+	1741428736,
+	1741441024,
+	1741445120,
+	1741451264,
+	1741457408,
+	1741458432,
+	1741459456,
+	1741460480,
+	1741461504,
+	1741472768,
+	1741481984,
+	1741483008,
+	1741489152,
+	1741490176,
+	1741498368,
+	1741499392,
+	1741501440,
+	1741515776,
+	1741517824,
+	1741518848,
+	1741522944,
+	1741529600,
+	1741536256,
+	1741537280,
+	1741538304,
+	1741539328,
+	1741548544,
+	1741551616,
+	1741552640,
+	1741553664,
+	1741564928,
+	1741581312,
+	1741591552,
+	1741631488,
+	1741645824,
+	1741661184,
+	1741666304,
+	1741667328,
+	1741668352,
+	1741669376,
+	1741670400,
+	1741671424,
+	1741672448,
+	1741673472,
+	1741675520,
+	1741677568,
+	1741678592,
+	1741687808,
+	1741688832,
+	1741691904,
+	1741694976,
+	1741696000,
+	1741697024,
+	1741722624,
+	1741778944,
+	1741785088,
+	1741801472,
+	1741803520,
+	1741805568,
+	1741809664,
+	1741815808,
+	1741840384,
+	1741855744,
+	1741856768,
+	1741857792,
+	1741858816,
+	1741859840,
+	1741860864,
+	1741861888,
+	1741862912,
+	1741863936,
+	1741871104,
+	1741892608,
+	1741905920,
+	1741906944,
+	1741921280,
+	1741923328,
+	1741924352,
+	1741930496,
+	1741937664,
+	1741938688,
+	1741939712,
+	1741944832,
+	1741946880,
+	1741947904,
+	1741948928,
+	1741949952,
+	1741955072,
+	1741958144,
+	1741959168,
+	1741968384,
+	1741972480,
+	1741973504,
+	1741974528,
+	1741984768,
+	1741988864,
+	1741997056,
+	1741998080,
+	1742005248,
+	1742011392,
+	1742022656,
+	1742023680,
+	1742024704,
+	1742025728,
+	1742026752,
+	1742027776,
+	1742028800,
+	1742029824,
+	1742030848,
+	1742031872,
+	1742032896,
+	1742033920,
+	1742034944,
+	1742035968,
+	1742036992,
+	1742046208,
+	1742047232,
+	1742048256,
+	1742049280,
+	1742050304,
+	1742051328,
+	1742052352,
+	1742053376,
+	1742054400,
+	1742055424,
+	1742056448,
+	1742057472,
+	1742058496,
+	1742059520,
+	1742060544,
+	1742075904,
+	1742076928,
+	1742086144,
+	1742090240,
+	1742099456,
+	1742120960,
+	1742132224,
+	1742135296,
+	1742139392,
+	1742140416,
+	1742150656,
+	1742151680,
+	1742152704,
+	1742154752,
+	1742155776,
+	1742169088,
+	1742170112,
+	1742171136,
+	1742173184,
+	1742174208,
+	1742179328,
+	1742190592,
+	1742201856,
+	1742210048,
+	1742211072,
+	1742212096,
+	1742213120,
+	1742214144,
+	1742215168,
+	1742216192,
+	1742217216,
+	1742218240,
+	1742219264,
+	1742220288,
+	1742225408,
+	1742236672,
+	1742243840,
+	1742247936,
+	1742266368,
+	1742267392,
+	1742270464,
+	1742271488,
+	1742272512,
+	1742273536,
+	1742274560,
+	1742275584,
+	1742276608,
+	1742277632,
+	1742278656,
+	1742279680,
+	1742280704,
+	1742281728,
+	1742282752,
+	1742283776,
+	1742284800,
+	1742285824,
+	1742286848,
+	1742287872,
+	1742288896,
+	1742289920,
+	1742317568,
+	1742320640,
+	1742321664,
+	1742322688,
+	1742323712,
+	1742324736,
+	1742325760,
+	1742326784,
+	1742340096,
+	1742342144,
+	1742343168,
+	1742344192,
+	1742345216,
+	1742347264,
+	1742348288,
+	1742349312,
+	1742350336,
+	1742351360,
+	1742352384,
+	1742353408,
+	1742354432,
+	1742355456,
+	1742356480,
+	1742357504,
+	1742358528,
+	1742359552,
+	1742360576,
+	1742361600,
+	1742362624,
+	1742363648,
+	1742387200,
+	1742389248,
+	1742390272,
+	1742391296,
+	1742392320,
+	1742393344,
+	1742394368,
+	1742395392,
+	1742411776,
+	1742412800,
+	1742413824,
+	1742414848,
+	1742422016,
+	1742427136,
+	1742428160,
+	1742429184,
+	1742430208,
+	1742431232,
+	1742450688,
+	1742452736,
+	1742483456,
+	1742484480,
+	1742485504,
+	1742486528,
+	1742487552,
+	1742494720,
+	1742495744,
+	1742496768,
+	1742497792,
+	1742498816,
+	1742500864,
+	1742501888,
+	1742502912,
+	1742503936,
+	1742504960,
+	1742505984,
+	1742507008,
+	1742508032,
+	1742509056,
+	1742510080,
+	1742512128,
+	1742513152,
+	1742514176,
+	1742515200,
+	1742516224,
+	1742517248,
+	1742518272,
+	1742519296,
+	1742520320,
+	1742521344,
+	1742522368,
+	1742532608,
+	1742533632,
+	1742534656,
+	1742535680,
+	1742536704,
+	1742537728,
+	1742538752,
+	1742539776,
+	1742540800,
+	1742541824,
+	1742542848,
+	1742543872,
+	1742544896,
+	1742545920,
+	1742546944,
+	1742547968,
+	1742548992,
+	1742559232,
+	1742560256,
+	1742561280,
+	1742562304,
+	1742563328,
+	1742564352,
+	1742565376,
+	1742566400,
+	1742567424,
+	1742568448,
+	1742569472,
+	1742570496,
+	1742571520,
+	1742572544,
+	1742573568,
+	1742574592,
+	1742575616,
+	1742576640,
+	1742577664,
+	1742578688,
+	1742579712,
+	1742580736,
+	1742581760,
+	1742582784,
+	1742583808,
+	1742584832,
+	1742585856,
+	1742586880,
+	1742587904,
+	1742588928,
+	1742602240,
+	1742603264,
+	1742604288,
+	1742605312,
+	1742606336,
+	1742608384,
+	1742609408,
+	1742610432,
+	1742611456,
+	1742612480,
+	1742613504,
+	1742614528,
+	1742615552,
+	1742616576,
+	1742617600,
+	1742618624,
+	1742619648,
+	1742620672,
+	1742621696,
+	1742622720,
+	1742623744,
+	1742624768,
+	1742625792,
+	1742626816,
+	1742627840,
+	1742628864,
+	1742629888,
+	1742630912,
+	1742631936,
+	1742632960,
+	1742633984,
+	1742635008,
+	1742636032,
+	1742637056,
+	1742638080,
+	1742639104,
+	1742640128,
+	1742641152,
+	1742642176,
+	1742643200,
+	1742644224,
+	1742645248,
+	1742646272,
+	1742647296,
+	1742648320,
+	1742649344,
+	1742650368,
+	1742651392,
+	1742652416,
+	1742653440,
+	1742654464,
+	1742655488,
+	1742656512,
+	1742657536,
+	1742658560,
+	1742659584,
+	1742660608,
+	1742661632,
+	1742663680,
+	1742664704,
+	1742671872,
+	1742672896,
+	1742673920,
+	1742674944,
+	1742675968,
+	1742676992,
+	1742678016,
+	1742679040,
+	1742680064,
+	1742681088,
+	1742682112,
+	1742683136,
+	1742684160,
+	1742685184,
+	1742686208,
+	1742687232,
+	1742688256,
+	1742689280,
+	1742690304,
+	1742691328,
+	1742692352,
+	1742693376,
+	1742694400,
+	1742695424,
+	1742696448,
+	1742697472,
+	1742698496,
+	1742699520,
+	1742700544,
+	1742701568,
+	1742703616,
+	1742704640,
+	1742705664,
+	1742706688,
+	1742707712,
+	1742708736,
+	1742709760,
+	1742710784,
+	1742711808,
+	1742712832,
+	1742713856,
+	1742715904,
+	1742716928,
+	1742717952,
+	1742718976,
+	1742720000,
+	1742721024,
+	1742722048,
+	1742723072,
+	1742724096,
+	1742725120,
+	1742726144,
+	1742727168,
+	1742728192,
+	1742729216,
+	1742730240,
+	1742731264,
+	1742732288,
+	1742733312,
+	1742737408,
+	1742743552,
+	1742744576,
+	1742748672,
+	1742753792,
+	1742789632,
+	1742790656,
+	1742791680,
+	1742792704,
+	1742820352,
+	1742868480,
+	1742874624,
+	1742878720,
+	1742879744,
+	1742884864,
+	1742894080,
+	1742898176,
+	1742904320,
+	1742910464,
+	1742914560,
+	1742942208,
+	1742948352,
+	1742949376,
+	1742950400,
+	1742955520,
+	1742960640,
+	1742963712,
+	1742964736,
+	1742980096,
+	1742982144,
+	1742984192,
+	1742988288,
+	1742998528,
+	1743002624,
+	1743012864,
+	1743017984,
+	1743028224,
+	1743030272,
+	1743036416,
+	1743040512,
+	1743047680,
+	1743048704,
+	1743053824,
+	1743054848,
+	1743066112,
+	1743076352,
+	1743095808,
+	1743098880,
+	1743105024,
+	1743115264,
+	1743116288,
+	1743117312,
+	1743119360,
+	1743121408,
+	1743122432,
+	1743126528,
+	1743133696,
+	1743136768,
+	1743137792,
+	1743151104,
+	1743176704,
+	1743177728,
+	1743178752,
+	1743180800,
+	1743186944,
+	1743196160,
+	1743197184,
+	1743208448,
+	1743209472,
+	1743228928,
+	1743238144,
+	1743239168,
+	1743254528,
+	1743258624,
+	1743294464,
+	1743305728,
+	1743311872,
+	1743324160,
+	1743334400,
+	1743336448,
+	1743349760,
+	1743355904,
+	1743357952,
+	1743381504,
+	1743388672,
+	1743393792,
+	1743403008,
+	1743420416,
+	1743421440,
+	1743432704,
+	1743434752,
+	1743451136,
+	1743458304,
+	1743466496,
+	1743468544,
+	1743469568,
+	1743474688,
+	1743475712,
+	1743486976,
+	1743488000,
+	1743489024,
+	1743490048,
+	1743491072,
+	1743492096,
+	1743501312,
+	1743503360,
+	1743505408,
+	1743510528,
+	1743511552,
+	1743512576,
+	1743513600,
+	1743514624,
+	1743515648,
+	1743516672,
+	1743517696,
+	1743518720,
+	1743519744,
+	1743520768,
+	1743521792,
+	1743522816,
+	1743523840,
+	1743524864,
+	1743525888,
+	1743526912,
+	1743527936,
+	1743528960,
+	1743529984,
+	1743531008,
+	1743532032,
+	1743533056,
+	1743534080,
+	1743535104,
+	1743536128,
+	1743537152,
+	1743538176,
+	1743539200,
+	1743540224,
+	1743541248,
+	1743542272,
+	1743543296,
+	1743544320,
+	1743550464,
+	1743566848,
+	1743576064,
+	1743579136,
+	1743581184,
+	1743582208,
+	1743583232,
+	1743584256,
+	1743585280,
+	1743586304,
+	1743587328,
+	1743588352,
+	1743591424,
+	1743592448,
+	1743602688,
+	1743607808,
+	1743624192,
+	1743630336,
+	1743631360,
+	1743632384,
+	1743633408,
+	1743634432,
+	1743635456,
+	1743636480,
+	1743637504,
+	1743638528,
+	1743639552,
+	1743640576,
+	1743641600,
+	1743642624,
+	1743643648,
+	1743644672,
+	1743645696,
+	1743646720,
+	1743647744,
+	1743648768,
+	1743649792,
+	1743650816,
+	1743651840,
+	1743654912,
+	1743655936,
+	1743656960,
+	1743657984,
+	1743659008,
+	1743660032,
+	1743661056,
+	1743662080,
+	1743663104,
+	1743664128,
+	1743665152,
+	1743673344,
+	1743674368,
+	1743675392,
+	1743684608,
+	1743686656,
+	1743687680,
+	1743691776,
+	1743692800,
+	1743693824,
+	1743694848,
+	1743695872,
+	1743696896,
+	1743697920,
+	1743698944,
+	1743700992,
+	1743703040,
+	1743715328,
+	1743716352,
+	1743727616,
+	1743733760,
+	1743740928,
+	1743755264,
+	1743756288,
+	1743761408,
+	1743762432,
+	1743763456,
+	1743765504,
+	1743766528,
+	1743768576,
+	1743769600,
+	1743773696,
+	1743778816,
+	1743785984,
+	1743791104,
+	1743800320,
+	1743803392,
+	1743813632,
+	1743821824,
+	1743825920,
+	1743830016,
+	1743844352,
+	1743850496,
+	1743865856,
+	1743870976,
+	1743872000,
+	1743888384,
+	1743894528,
+	1743895552,
+	1743903744,
+	1743915008,
+	1743929344,
+	1743945728,
+	1743946752,
+	1743953920,
+	1743955968,
+	1743956992,
+	1743958016,
+	1743964160,
+	1743967232,
+	1743969280,
+	1743974400,
+	1744013312,
+	1744043008,
+	1744048128,
+	1744058880,
+	1744059392,
+	1744060416,
+	1744061440,
+	1744062464,
+	1744063488,
+	1744064512,
+	1744065536,
+	1744073728,
+	1744086016,
+	1744103424,
+	1744108544,
+	1744115456,
+	1744122880,
+	1744124928,
+	1744130048,
+	1744141312,
+	1744142336,
+	1744177152,
+	1744178176,
+	1744193536,
+	1744205824,
+	1744206848,
+	1744208896,
+	1744214016,
+	1744215040,
+	1744283648,
+	1744284672,
+	1744285696,
+	1744291840,
+	1744294912,
+	1744306176,
+	1744322560,
+	1744331776,
+	1744337920,
+	1744345088,
+	1744349184,
+	1744355328,
+	1744360448,
+	1744362496,
+	1744363520,
+	1744364544,
+	1744373760,
+	1744374784,
+	1744385024,
+	1744398336,
+	1744404480,
+	1744406528,
+	1744408576,
+	1744413696,
+	1744414720,
+	1744415744,
+	1744416768,
+	1744419840,
+	1744420864,
+	1744434176,
+	1744436224,
+	1744445440,
+	1744463872,
+	1744468992,
+	1744483328,
+	1744486400,
+	1744492544,
+	1744494592,
+	1744497664,
+	1744500736,
+	1744501760,
+	1744510976,
+	1744512000,
+	1744524288,
+	1744527360,
+	1744534528,
+	1744535552,
+	1744543744,
+	1744551936,
+	1744555008,
+	1744563200,
+	1744564224,
+	1744575488,
+	1744577536,
+	1744584704,
+	1744592896,
+	1744594944,
+	1744612352,
+	1744620544,
+	1744621568,
+	1744627712,
+	1744631808,
+	1744634880,
+	1744649216,
+	1744686080,
+	1744690176,
+	1744691200,
+	1744693248,
+	1744701440,
+	1744704512,
+	1744715776,
+	1744716800,
+	1744717824,
+	1744718848,
+	1744728064,
+	1744744448,
+	1744747520,
+	1744749568,
+	1744755712,
+	1744779264,
+	1744782336,
+	1744787456,
+	1744788480,
+	1744799744,
+	1744800768,
+	1744812032,
+	1744816128,
+	1744818176,
+	1744819200,
+	1744823296,
+	1778384896,
+	1778385408,
+	1778385920,
+	1778386944,
+	1778388992,
+	1778396160,
+	1778401280,
+	1778515968,
+	1778647040,
+	1778909184,
+	1779105792,
+	1779171328,
+	1779433472,
+	1780482048,
+	1781530624,
+	1781661696,
+	1781792768,
+	1782054912,
+	1783234560,
+	1783300096,
+	1783627776,
+	1785462784,
+	1785724928,
+	1786249216,
+	1793064960,
+	1845886976,
+	1846542336,
+	1847732224,
+	1847733248,
+	1848115200,
+	1848380416,
+	1848414208,
+	1848639488,
+	1848836096,
+	1848901632,
+	1849163776,
+	1849688064,
+	1850212352,
+	1850408960,
+	1850441728,
+	1850449920,
+	1850458112,
+	1850474496,
+	1850482688,
+	1850508288,
+	1850514432,
+	1850521600,
+	1850523648,
+	1850540032,
+	1850736640,
+	1851260928,
+	1851540480,
+	1851596800,
+	1851654144,
+	1851785216,
+	1855455232,
+	1855717376,
+	1856315392,
+	1856372736,
+	1856815104,
+	1856831488,
+	1856839680,
+	1856847872,
+	1856856064,
+	1856880640,
+	1857028096,
+	1857552384,
+	1858076672,
+	1860435968,
+	1860706304,
+	1860960256,
+	1861222400,
+	1862270976,
+	1866596352,
+	1866711040,
+	1866743808,
+	1866989568,
+	1867841536,
+	1868283904,
+	1868363776,
+	1868364800,
+	1869611008,
+	1869742080,
+	1869873152,
+	1870055424,
+	1870086144,
+	1870102528,
+	1870135296,
+	1870397440,
+	1870528512,
+	1870659584,
+	1872756736,
+	1873412096,
+	1873543168,
+	1873805312,
+	1874460672,
+	1874853888,
+	1875902464,
+	1876164608,
+	1876761600,
+	1876787200,
+	1876819968,
+	1876886528,
+	1876887552,
+	1876888576,
+	1876889600,
+	1876946944,
+	1876948992,
+	1876951040,
+	1877213184,
+	1877696512,
+	1877711872,
+	1877712896,
+	1879048192,
+	1883242496,
+	1883373568,
+	1883832320,
+	1883897856,
+	1884291072,
+	1884815360,
+	1885339648,
+	1885470720,
+	1885601792,
+	1886224384,
+	1886322688,
+	1886388224,
+	1886650368,
+	1887043584,
+	1887174656,
+	1887436800,
+	1887698944,
+	1888038912,
+	1891631104,
+	1893728256,
+	1895825408,
+	1896349696,
+	1896595456,
+	1896611840,
+	1896873984,
+	1897005056,
+	1897261056,
+	1897262080,
+	1897398272,
+	1897857024,
+	1898708992,
+	1898971136,
+	1899274240,
+	1899291648,
+	1899364352,
+	1899495424,
+	1899626496,
+	1899692032,
+	1899749376,
+	1899888640,
+	1900019712,
+	1902116864,
+	1903165440,
+	1903689728,
+	1904214016,
+	1904369664,
+	1904373760,
+	1904476160,
+	1904738304,
+	1908539392,
+	1908761600,
+	1908932608,
+	1909063680,
+	1909194752,
+	1909481472,
+	1909489664,
+	1909522432,
+	1909719040,
+	1909744640,
+	1909766144,
+	1909784576,
+	1909850112,
+	1910112256,
+	1910243328,
+	1910505472,
+	1911554048,
+	1912078336,
+	1914437632,
+	1914650624,
+	1914651648,
+	1916141568,
+	1916534784,
+	1916796928,
+	1917059072,
+	1917796352,
+	1917845504,
+	1918894080,
+	1919418368,
+	1919811584,
+	1919827968,
+	1919877120,
+	1919918080,
+	1919942656,
+	1920204800,
+	1920335872,
+	1920401408,
+	1920434176,
+	1920450560,
+	1920452608,
+	1920453632,
+	1920454656,
+	1920458752,
+	1921253376,
+	1921449984,
+	1921646592,
+	1921859584,
+	1921863680,
+	1921864704,
+	1921875968,
+	1925447680,
+	1925642240,
+	1926234112,
+	1926496256,
+	1926627328,
+	1926692864,
+	1926758400,
+	1927282688,
+	1928331264,
+	1930952704,
+	1931214848,
+	1931427840,
+	1931428864,
+	1931429888,
+	1931430912,
+	1931476992,
+	1932146688,
+	1932263424,
+	1932394496,
+	1932460032,
+	1932525568,
+	1933918208,
+	1934884864,
+	1934934016,
+	1934999552,
+	1935933440,
+	1936195584,
+	1937244160,
+	1937510400,
+	1939079168,
+	1939341312,
+	1939472384,
+	1939603456,
+	1939734528,
+	1939800064,
+	1940275200,
+	1940389888,
+	1940652032,
+	1941176320,
+	1941635072,
+	1941636096,
+	1941637120,
+	1941638144,
+	1941831680,
+	1941962752,
+	1944059904,
+	1946159104,
+	1946163200,
+	1946222592,
+	1946288128,
+	1946419200,
+	1946681344,
+	1947009024,
+	1947205632,
+	1949433856,
+	1949564928,
+	1949827072,
+	1949990912,
+	1950011392,
+	1950089216,
+	1950482432,
+	1950527488,
+	1950648320,
+	1950649344,
+	1950658560,
+	1950659584,
+	1950679040,
+	1950744576,
+	1951137792,
+	1951268864,
+	1951727616,
+	1952026624,
+	1952075776,
+	1952102400,
+	1952382976,
+	1953497088,
+	1953759232,
+	1954545664,
+	1958739968,
+	1958809600,
+	1958813696,
+	1958844416,
+	1958847488,
+	1958850560,
+	1958871040,
+	1959002112,
+	1959108608,
+	1959109632,
+	1959133184,
+	1959198720,
+	1959231488,
+	1959526400,
+	1959723008,
+	1959788544,
+	1960091648,
+	1960126464,
+	1960127488,
+	1960132608,
+	1960148992,
+	1960189952,
+	1960198144,
+	1960214528,
+	1960247296,
+	1960312832,
+	1960837120,
+	1962016768,
+	1962147840,
+	1962278912,
+	1962409984,
+	1962622976,
+	1962672128,
+	1962829824,
+	1962830848,
+	1962835968,
+	1962901504,
+	1963458560,
+	1964310528,
+	1964376064,
+	1964507136,
+	1965031424,
+	1965555712,
+	1965817856,
+	1966080000,
+	1966419968,
+	1966452736,
+	1966669824,
+	1966735360,
+	1966800896,
+	1966866432,
+	1967128576,
+	1967652864,
+	1967800320,
+	1967804416,
+	1967816704,
+	1967849472,
+	1967915008,
+	1968177152,
+	1969487872,
+	1969688576,
+	1969694720,
+	1969702912,
+	1969717248,
+	1969793024,
+	1969881088,
+	1970274304,
+	1970814976,
+	1970831360,
+	1970864128,
+	1970896896,
+	1970913280,
+	1970962432,
+	1971060736,
+	1971322880,
+	1981284352,
+	1981415424,
+	1981546496,
+	1981677568,
+	1981743104,
+	1983905792,
+	1984036864,
+	1984131072,
+	1984430080,
+	1984954368,
+	1985216512,
+	1985486848,
+	1985495040,
+	1985511424,
+	1985544192,
+	1985736704,
+	1986400256,
+	1986404352,
+	1986503680,
+	1986504704,
+	1986505728,
+	1986506752,
+	1987051520,
+	1987575808,
+	1987837952,
+	1987969024,
+	1988067328,
+	1988362240,
+	1989148672,
+	1991376896,
+	1991507968,
+	1991770112,
+	1991802880,
+	1991901184,
+	1992032256,
+	1992163328,
+	1992228864,
+	1992294400,
+	1992359936,
+	1992368128,
+	1992376320,
+	1992384512,
+	1992392704,
+	1992425472,
+	1992458240,
+	1992491008,
+	1992523776,
+	1992556544,
+	1992949760,
+	1993080832,
+	1993605120,
+	1993670656,
+	1993850880,
+	1994391552,
+	1994653696,
+	1994784768,
+	1995374592,
+	1995571200,
+	1995702272,
+	1995964416,
+	1996488704,
+	1996619776,
+	1996652544,
+	1996685312,
+	1996750848,
+	1997012992,
+	1997144064,
+	1997506560,
+	1997537280,
+	1997717504,
+	1997721600,
+	1997725696,
+	1997729792,
+	1997733888,
+	1997799424,
+	1998274560,
+	1998290944,
+	1998299136,
+	1998307328,
+	1998323712,
+	1998467072,
+	1998569472,
+	1998585856,
+	1998848000,
+	1998913536,
+	1998946304,
+	1998962688,
+	1998979072,
+	1999011840,
+	1999028224,
+	1999032320,
+	1999036416,
+	1999044608,
+	1999110144,
+	1999126528,
+	1999142912,
+	1999175680,
+	1999241216,
+	1999254528,
+	1999273984,
+	1999276032,
+	1999298560,
+	1999372288,
+	1999634432,
+	2000224256,
+	2000289792,
+	2000388096,
+	2000420864,
+	2000486400,
+	2000551936,
+	2000625664,
+	2001457152,
+	2001600512,
+	2001731584,
+	2001915904,
+	2001993728,
+	2002255872,
+	2002780160,
+	2003566592,
+	2003828736,
+	2004353024,
+	2004877312,
+	2005925888,
+	2006228992,
+	2006233088,
+	2006433792,
+	2007025664,
+	2007070720,
+	2007071744,
+	2007072768,
+	2007105536,
+	2007236608,
+	2008023040,
+	2011693056,
+	2011922432,
+	2012741632,
+	2013028352,
+	2013065216,
+	2013069312,
+	2013134848,
+	2013265920,
+	2014838784,
+	2015232000,
+	2015297536,
+	2015363072,
+	2015887360,
+	2016149504,
+	2016411648,
+	2016673792,
+	2016739328,
+	2016804864,
+	2017460224,
+	2017722368,
+	2017992704,
+	2018017280,
+	2018246656,
+	2018508800,
+	2019035136,
+	2019164160,
+	2019295232,
+	2019426304,
+	2019491840,
+	2021654528,
+	2021916672,
+	2021949440,
+	2021982208,
+	2022047744,
+	2022182912,
+	2022183936,
+	2022211584,
+	2022244352,
+	2022670336,
+	2025848832,
+	2030045184,
+	2030047232,
+	2030305280,
+	2030567424,
+	2031091712,
+	2031616000,
+	2031878144,
+	2032009216,
+	2032074752,
+	2032140288,
+	2032402432,
+	2032467968,
+	2032533504,
+	2032664576,
+	2033057792,
+	2033077248,
+	2033090560,
+	2033123328,
+	2033188864,
+	2033321984,
+	2033385472,
+	2033491968,
+	2033504256,
+	2033508352,
+	2033627136,
+	2033630208,
+	2033647616,
+	2033713152,
+	2033844224,
+	2033879040,
+	2033881088,
+	2033885184,
+	2033909760,
+	2033975296,
+	2034499584,
+	2035023872,
+	2035253248,
+	2035875840,
+	2036629504,
+	2036662272,
+	2036715520,
+	2042626048,
+	2042691584,
+	2042757120,
+	2042888192,
+	2043199488,
+	2043215872,
+	2043412480,
+	2044723200,
+	2046296064,
+	2046754816,
+	2046836736,
+	2046853120,
+	2047082496,
+	2047344640,
+	2047410176,
+	2047475712,
+	2047508480,
+	2047509504,
+	2047510016,
+	2047510528,
+	2047511040,
+	2047511552,
+	2047512576,
+	2047516672,
+	2047524864,
+	2047541248,
+	2047606784,
+	2047672320,
+	2047737856,
+	2049966080,
+	2050031616,
+	2050162688,
+	2051014656,
+	2053111808,
+	2053505024,
+	2053521408,
+	2053525504,
+	2054160384,
+	2054619136,
+	2055234560,
+	2055239680,
+	2055733248,
+	2056290304,
+	2056830976,
+	2057043968,
+	2059141120,
+	2059403264,
+	2059796480,
+	2059937792,
+	2059938816,
+	2059943936,
+	2060005376,
+	2060189696,
+	2061500416,
+	2062548992,
+	2063079424,
+	2063085568,
+	2063548416,
+	2063630336,
+	2063859712,
+	2064121856,
+	2066841600,
+	2066915328,
+	2067005440,
+	2067267584,
+	2067398656,
+	2067402752,
+	2067406848,
+	2067415040,
+	2067431424,
+	2067447808,
+	2067456000,
+	2067460096,
+	2067464192,
+	2067529728,
+	2067595264,
+	2067660800,
+	2067791872,
+	2069889024,
+	2070020096,
+	2070118400,
+	2070151168,
+	2070216704,
+	2070347776,
+	2070708224,
+	2070728704,
+	2070937600,
+	2071986176,
+	2072530944,
+	2072576000,
+	2072641536,
+	2073034752,
+	2073296896,
+	2073362432,
+	2073427968,
+	2073559040,
+	2074083328,
+	2074345472,
+	2074607616,
+	2074869760,
+	2075000832,
+	2075147264,
+	2075152384,
+	2075197440,
+	2075262976,
+	2075394048,
+	2075656192,
+	2075918336,
+	2076442624,
+	2076672000,
+	2077097984,
+	2078801920,
+	2079457280,
+	2079506432,
+	2079507456,
+	2079588352,
+	2079916032,
+	2080178176,
+	2080268288,
+	2080269312,
+	2080784384,
+	2081292288,
+	2081423360,
+	2081685504,
+	2081751040,
+	2081755136,
+	2081759232,
+	2081767424,
+	2081783808,
+	2081816576,
+	2082258944,
+	2082275328,
+	2082406400,
+	2083024896,
+	2083028992,
+	2083045376,
+	2083057664,
+	2083127296,
+	2083160064,
+	2083454976,
+	2084569088,
+	2084700160,
+	2084765696,
+	2084831232,
+	2085093376,
+	2085158912,
+	2085224448,
+	2085355520,
+	2086141952,
+	2086207488,
+	2086240256,
+	2086273024,
+	2086404096,
+	2087454720,
+	2087462912,
+	2087542784,
+	2087714816,
+	2087845888,
+	2087976960,
+	2088042496,
+	2088108032,
+	2088632320,
+	2088763392,
+	2090041344,
+	2090240256,
+	2090270720,
+	2090336256,
+	2090598400,
+	2090860544,
+	2090926080,
+	2090991616,
+	2091057152,
+	2091122688,
+	2091646976,
+	2091778048,
+	2092957696,
+	2093219840,
+	2093481984,
+	2094792704,
+	2095054848,
+	2095120384,
+	2095185920,
+	2095316992,
+	2095579136,
+	2095710208,
+	2095841280,
+	2096103424,
+	2096136192,
+	2096234496,
+	2096349184,
+	2096627712,
+	2096693248,
+	2096758784,
+	2097020928,
+	2099232768,
+	2099249152,
+	2099314688,
+	2099380224,
+	2099445760,
+	2099478528,
+	2099511296,
+	2099773440,
+	2100985856,
+	2101182464,
+	2101215232,
+	2101346304,
+	2101870592,
+	2101936128,
+	2102001664,
+	2102132736,
+	2102165504,
+	2102198272,
+	2102263808,
+	2102394880,
+	2102919168,
+	2103443456,
+	2103574528,
+	2103967744,
+	2104492032,
+	2108227584,
+	2108358656,
+	2110783488,
+	2110914560,
+	2110980096,
+	2111111168,
+	2111201280,
+	2111242240,
+	2111307776,
+	2111438848,
+	2111504384,
+	2111569920,
+	2111700992,
+	2113830912,
+	2113847296,
+	2302360320,
+	2302367744,
+	2332375040,
+	2332376064,
+	2332381184,
+	2332384256,
+	2332388352,
+	2332393472,
+	2332401664,
+	2332409856,
+	2332412928,
+	2332413952,
+	2332414976,
+	2332423168,
+	2332622848,
+	2340487168,
+	2341732352,
+	2342191104,
+	2342453248,
+	2343174144,
+	2343567360,
+	2344026112,
+	2344222720,
+	2344419328,
+	2344878080,
+	2345140224,
+	2345664512,
+	2346254336,
+	2346385408,
+	2346450944,
+	2346713088,
+	2346844160,
+	2353725440,
+	2358181888,
+	2362245120,
+	2362310656,
+	2362572800,
+	2363490304,
+	2364342272,
+	2364538880,
+	2364735488,
+	2364932096,
+	2365128704,
+	2365194240,
+	2365521920,
+	2415919104,
+	2416377856,
+	2416705536,
+	2419066880,
+	2419067904,
+	2419079168,
+	2419081216,
+	2419087360,
+	2419104768,
+	2419108864,
+	2419110912,
+	2419111936,
+	2419117056,
+	2419118080,
+	2419119104,
+	2419121152,
+	2419129344,
+	2419326976,
+	2423980032,
+	2432630784,
+	2462332928,
+	2462336000,
+	2462337024,
+	2462338048,
+	2462342144,
+	2462347264,
+	2462348288,
+	2462350336,
+	2516582400,
+	2524119040,
+	2524512256,
+	2524577792,
+	2525071360,
+	2525075456,
+	2525085696,
+	2525091840,
+	2525101056,
+	2525626368,
+	2531196928,
+	2532442112,
+	2532443136,
+	2532444160,
+	2532449280,
+	2532453376,
+	2532454400,
+	2532455424,
+	2532456448,
+	2532461568,
+	2532462592,
+	2532465664,
+	2532466688,
+	2532470784,
+	2532471808,
+	2532472832,
+	2532481024,
+	2532482048,
+	2532483072,
+	2532484096,
+	2532485120,
+	2532489216,
+	2532490240,
+	2532491264,
+	2532496384,
+	2532499456,
+	2532500480,
+	2532501504,
+	2532502528,
+	2532503552,
+	2532504576,
+	2532505600,
+	2533294080,
+	2556985344,
+	2566914048,
+	2567110656,
+	2569142272,
+	2569273344,
+	2573402112,
+	2573533184,
+	2574647296,
+	2634022912,
+	2635202560,
+	2638020608,
+	2641821696,
+	2641823744,
+	2641824768,
+	2641825792,
+	2641828864,
+	2641839104,
+	2641850368,
+	2641855488,
+	2641856512,
+	2641857536,
+	2641858560,
+	2641859584,
+	2641860608,
+	2641861632,
+	2641862656,
+	2641863680,
+	2641865728,
+	2641870848,
+	2641871872,
+	2641883136,
+	2641886208,
+	2642018304,
+	2643722240,
+	2644246528,
+	2650734592,
+	2682388480,
+	2685612032,
+	2685652992,
+	2685654016,
+	2685655040,
+	2685677568,
+	2697608192,
+	2697630720,
+	2697631744,
+	2697635840,
+	2697647104,
+	2697648128,
+	2697649152,
+	2697650176,
+	2697651200,
+	2697652224,
+	2697653248,
+	2697654272,
+	2697655296,
+	2697656320,
+	2697657344,
+	2699968512,
+	2714697728,
+	2724790272,
+	2734686208,
+	2737767424,
+	2738159616,
+	2738160640,
+	2738161664,
+	2738162688,
+	2738168832,
+	2738169856,
+	2738170880,
+	2738171904,
+	2738172928,
+	2738173952,
+	2738174976,
+	2738176000,
+	2738182144,
+	2738183168,
+	2738184192,
+	2738185216,
+	2738186240,
+	2738187264,
+	2738188288,
+	2738189312,
+	2738190336,
+	2738191360,
+	2738192384,
+	2738193408,
+	2738194432,
+	2738200576,
+	2738201600,
+	2738202624,
+	2738203648,
+	2738207744,
+	2738215936,
+	2738221056,
+	2742878208,
+	2743992320,
+	2746286080,
+	2746417152,
+	2748055552,
+	2754871296,
+	2792292352,
+	2810904576,
+	2814181376,
+	2816275456,
+	2829058048,
+	2863857664,
+	2869428224,
+	2871132160,
+	2871263232,
+	2871525376,
+	2874146816,
+	2874408960,
+	2874671104,
+	2875719680,
+	2876243968,
+	2876506112,
+	2876768256,
+	2882535424,
+	2936012800,
+	2937061376,
+	2937585664,
+	2937978880,
+	2938765312,
+	2938896384,
+	2939027456,
+	2939158528,
+	2940207104,
+	2942697472,
+	2942992384,
+	2943314944,
+	2943324160,
+	2943325184,
+	2943326208,
+	2943327232,
+	2943328256,
+	2943329280,
+	2943330304,
+	2943331328,
+	2943334400,
+	2945581056,
+	2945712128,
+	2945974272,
+	2946392064,
+	2946498560,
+	2947587072,
+	2947592192,
+	2947595264,
+	2947678208,
+	2948104192,
+	2948136960,
+	2948202496,
+	2948333568,
+	3024879616,
+	3024945152,
+	3025010688,
+	3025403904,
+	3025534976,
+	3025666048,
+	3026073600,
+	3026083840,
+	3026089984,
+	3026091008,
+	3026157568,
+	3026190336,
+	3028385792,
+	3028418560,
+	3028811776,
+	3029602304,
+	3029637120,
+	3029653504,
+	3029655552,
+	3029696512,
+	3029724160,
+	3029770240,
+	3029860352,
+	3030384640,
+	3031592960,
+	3031593984,
+	3031613440,
+	3031957504,
+	3032219648,
+	3032323072,
+	3033070592,
+	3033071616,
+	3033137152,
+	3033530368,
+	3033715712,
+	3033718784,
+	3033792512,
+	3034505216,
+	3034513408,
+	3035168768,
+	3035185152,
+	3035205632,
+	3035316224,
+	3035328512,
+	3035334656,
+	3054538752,
+	3054539776,
+	3054551040,
+	3054632960,
+	3055007744,
+	3055011840,
+	3055550464,
+	3056623616,
+	3056664576,
+	3056730112,
+	3056758784,
+	3056795648,
+	3056992256,
+	3057054720,
+	3057451008,
+	3058696192,
+	3058958336,
+	3059220480,
+	3059482624,
+	3059744768,
+	3060793344,
+	3061841920,
+	3062890496,
+	3063742464,
+	3063955456,
+	3064856576,
+	3066560512,
+	3068952576,
+	3068991488,
+	3068992512,
+	3069050880,
+	3069116416,
+	3069181952,
+	3070099456,
+	3070174208,
+	3070180352,
+	3070230528,
+	3074424832,
+	3075383296,
+	3075384320,
+	3075388416,
+	3075582976,
+	3075585024,
+	3075735552,
+	3076227072,
+	3076229120,
+	3076231168,
+	3076259840,
+	3078619136,
+	3080716288,
+	3081240576,
+	3081371648,
+	3081502720,
+	3082158080,
+	3082289152,
+	3082813440,
+	3229391360,
+	3230433280,
+	3230434304,
+	3230435328,
+	3230440448,
+	3230441472,
+	3230442496,
+	3230443520,
+	3230444544,
+	3230445568,
+	3230446592,
+	3230447616,
+	3230448640,
+	3230449664,
+	3230450688,
+	3230451712,
+	3230452736,
+	3230453760,
+	3230454784,
+	3389023232,
+	3389028864,
+	3389042688,
+	3389227008,
+	3389292544,
+	3389324288,
+	3389378560,
+	3389379584,
+	3389380608,
+	3389392384,
+	3389407744,
+	3389409280,
+	3389413120,
+	3389413376,
+	3389414400,
+	3389417216,
+	3389418496,
+	3389419008,
+	3389420032,
+	3389435904,
+	3389521920,
+	3389522432,
+	3389522944,
+	3389524992,
+	3389528064,
+	3389541632,
+	3389554688,
+	3389571072,
+	3389595648,
+	3389596160,
+	3389599744,
+	3389600512,
+	3389600768,
+	3389601280,
+	3389602048,
+	3389602304,
+	3389669376,
+	3389681664,
+	3389682688,
+	3389683712,
+	3389684736,
+	3389784320,
+	3389784576,
+	3389788416,
+	3389788672,
+	3389788928,
+	3389802496,
+	3389805568,
+	3389808640,
+	3389809152,
+	3389811200,
+	3389812480,
+	3389813760,
+	3389931520,
+	3389932800,
+	3389933824,
+	3389934080,
+	3389934592,
+	3389935104,
+	3389937664,
+	3389939968,
+	3389941760,
+	3389942784,
+	3389943552,
+	3389944320,
+	3389945344,
+	3389946880,
+	3389947648,
+	3389948160,
+	3389949696,
+	3389949952,
+	3389953280,
+	3389953792,
+	3389955328,
+	3389955584,
+	3389958400,
+	3389958656,
+	3389959168,
+	3389960192,
+	3389962240,
+	3389968384,
+	3389969664,
+	3389971200,
+	3389971456,
+	3389971968,
+	3389972736,
+	3389972992,
+	3389974272,
+	3389975296,
+	3389975552,
+	3389976064,
+	3389976320,
+	3389978112,
+	3389979392,
+	3390325248,
+	3390328576,
+	3390330624,
+	3390330880,
+	3390331392,
+	3390332416,
+	3390337536,
+	3390338304,
+	3390339072,
+	3390340352,
+	3390340608,
+	3390340864,
+	3390386176,
+	3390387200,
+	3390388224,
+	3390389248,
+	3390407424,
+	3390407680,
+	3390409984,
+	3390410240,
+	3390411520,
+	3390411776,
+	3390412288,
+	3390412800,
+	3390413312,
+	3390413824,
+	3390502912,
+	3390503936,
+	3390770176,
+	3390770688,
+	3390801920,
+	3391414784,
+	3391488000,
+	3391488512,
+	3391490048,
+	3391500288,
+	3391504384,
+	3391512576,
+	3391520768,
+	3391521280,
+	3391521792,
+	3391522304,
+	3391522560,
+	3391522816,
+	3391523328,
+	3391523840,
+	3391524352,
+	3391525376,
+	3391526144,
+	3391526400,
+	3391526912,
+	3391527424,
+	3391527936,
+	3391528448,
+	3391528960,
+	3391529984,
+	3391531008,
+	3391531520,
+	3391531776,
+	3391533056,
+	3391535104,
+	3391537152,
+	3391620096,
+	3391620864,
+	3391622912,
+	3391653632,
+	3391653888,
+	3391654912,
+	3391655680,
+	3391655936,
+	3391657472,
+	3391658752,
+	3391659008,
+	3391659520,
+	3391660544,
+	3391686656,
+	3391687424,
+	3391687680,
+	3391717376,
+	3391717888,
+	3391723520,
+	3391733760,
+	3391734784,
+	3391735808,
+	3391746048,
+	3391835136,
+	3391852544,
+	3391885312,
+	3391893504,
+	3391898368,
+	3391900160,
+	3391906048,
+	3391914240,
+	3391915008,
+	3391918592,
+	3391946752,
+	3391947264,
+	3391950592,
+	3391950848,
+	3392016384,
+	3392016896,
+	3392017408,
+	3392020480,
+	3392045056,
+	3392069632,
+	3392098816,
+	3392102400,
+	3392103424,
+	3392104448,
+	3392105472,
+	3392109568,
+	3392110080,
+	3392110592,
+	3392111104,
+	3392413952,
+	3392414208,
+	3392417536,
+	3392442112,
+	3392442368,
+	3392506880,
+	3392507648,
+	3392782336,
+	3392783360,
+	3392784384,
+	3392785408,
+	3392787456,
+	3392788480,
+	3392794624,
+	3392798720,
+	3392825344,
+	3392827392,
+	3392864256,
+	3392864512,
+	3392918528,
+	3392924672,
+	3392925696,
+	3392942080,
+	3392954368,
+	3392958464,
+	3392963584,
+	3392964608,
+	3392966656,
+	3393012736,
+	3393014784,
+	3393017856,
+	3393026816,
+	3393027840,
+	3393089536,
+	3393124352,
+	3393125376,
+	3393126144,
+	3393146880,
+	3393147136,
+	3393147392,
+	3393147904,
+	3393148928,
+	3393167360,
+	3393189888,
+	3393191168,
+	3393257472,
+	3393259520,
+	3393282048,
+	3393283072,
+	3393284096,
+	3393285120,
+	3393366016,
+	3393388544,
+	3393520640,
+	3393523712,
+	3393585152,
+	3393609728,
+	3393634304,
+	3393658880,
+	3393659904,
+	3393660928,
+	3393661952,
+	3393726464,
+	3393736704,
+	3393744896,
+	3393745920,
+	3393746944,
+	3393747968,
+	3393814528,
+	3393843200,
+	3393844224,
+	3393845248,
+	3393846272,
+	3393849344,
+	3393856512,
+	3393858048,
+	3393860608,
+	3393867776,
+	3393906688,
+	3393912320,
+	3393966080,
+	3393977344,
+	3394042880,
+	3394064384,
+	3394067456,
+	3394111488,
+	3394232320,
+	3394238464,
+	3394289664,
+	3394291712,
+	3394306048,
+	3394351104,
+	3394352128,
+	3394353152,
+	3394354176,
+	3394501632,
+	3394502656,
+	3394503680,
+	3394504704,
+	3394506752,
+	3394508288,
+	3394508800,
+	3394621440,
+	3394697472,
+	3394698240,
+	3394719744,
+	3394772992,
+	3394832384,
+	3394854912,
+	3394857984,
+	3394860800,
+	3394889728,
+	3394895872,
+	3394899968,
+	3394900992,
+	3394902016,
+	3394903040,
+	3394905344,
+	3394920448,
+	3394921472,
+	3394922496,
+	3394923520,
+	3394924544,
+	3394945280,
+	3394946048,
+	3394948352,
+	3394953216,
+	3394961408,
+	3394985984,
+	3394994176,
+	3395006464,
+	3395018752,
+	3395026944,
+	3395028992,
+	3395039232,
+	3395091456,
+	3395092480,
+	3395156992,
+	3395176960,
+	3395178752,
+	3395181568,
+	3395223552,
+	3395224576,
+	3395225600,
+	3395227648,
+	3395284992,
+	3395288064,
+	3395289088,
+	3395305472,
+	3395307520,
+	3395309568,
+	3395313664,
+	3395315712,
+	3395317760,
+	3395321856,
+	3395323904,
+	3395325952,
+	3395330048,
+	3395332096,
+	3395334144,
+	3395338240,
+	3395340288,
+	3395342336,
+	3395346432,
+	3395348480,
+	3395350528,
+	3395354624,
+	3395356672,
+	3395358720,
+	3395362816,
+	3395371008,
+	3395379200,
+	3395383296,
+	3395387392,
+	3395403776,
+	3395411968,
+	3395414016,
+	3395416064,
+	3395420160,
+	3395422208,
+	3395424256,
+	3395428352,
+	3395430400,
+	3395432448,
+	3395436544,
+	3395444736,
+	3395446784,
+	3395448832,
+	3395452928,
+	3395461120,
+	3395463168,
+	3395465216,
+	3395469312,
+	3395471360,
+	3395473408,
+	3395477504,
+	3395479552,
+	3395481600,
+	3395485696,
+	3395502080,
+	3395510272,
+	3395512320,
+	3395514368,
+	3395518464,
+	3395526656,
+	3395528704,
+	3395530752,
+	3395534848,
+	3395536896,
+	3395538944,
+	3395543040,
+	3395545088,
+	3395547136,
+	3395551232,
+	3395553280,
+	3395555328,
+	3395559424,
+	3395567616,
+	3395569664,
+	3395571712,
+	3395575808,
+	3395577856,
+	3395579904,
+	3395584000,
+	3395586048,
+	3395588096,
+	3395592192,
+	3395594240,
+	3395596288,
+	3395600384,
+	3395602432,
+	3395604480,
+	3395608576,
+	3395616768,
+	3395633152,
+	3395641344,
+	3395649536,
+	3395665920,
+	3395674112,
+	3395676160,
+	3395678208,
+	3395682304,
+	3395690496,
+	3395698688,
+	3395715072,
+	3395717120,
+	3395719168,
+	3395723264,
+	3395731456,
+	3395733504,
+	3395735552,
+	3395739648,
+	3395741696,
+	3395743744,
+	3395747840,
+	3395749888,
+	3395751936,
+	3395756032,
+	3395764224,
+	3395772416,
+	3395774464,
+	3395776512,
+	3395780608,
+	3395796992,
+	3395805184,
+	3395807232,
+	3395809280,
+	3395813376,
+	3395944448,
+	3396009984,
+	3396042752,
+	3396075520,
+	3396141056,
+	3396206592,
+	3396222976,
+	3396239360,
+	3396255744,
+	3396272128,
+	3396304896,
+	3396313088,
+	3396321280,
+	3396337664,
+	3396403200,
+	3396407296,
+	3396411392,
+	3396419584,
+	3396435968,
+	3396452352,
+	3396460544,
+	3396464640,
+	3396468736,
+	3396476928,
+	3396485120,
+	3396501504,
+	3396534272,
+	3396542464,
+	3396550656,
+	3396567040,
+	3396599808,
+	3396608000,
+	3396612096,
+	3396616192,
+	3396624384,
+	3396632576,
+	3396665344,
+	3396681728,
+	3396698112,
+	3396730880,
+	3396739072,
+	3396747264,
+	3396763648,
+	3396796416,
+	3396804608,
+	3396812800,
+	3396816896,
+	3396820992,
+	3396829184,
+	3396861952,
+	3396878336,
+	3396894720,
+	3396927488,
+	3396993024,
+	3397001216,
+	3397009408,
+	3397021696,
+	3397023744,
+	3397025792,
+	3397026816,
+	3397083136,
+	3397088256,
+	3397089280,
+	3397128192,
+	3397130240,
+	3397217024,
+	3397217536,
+	3397218304,
+	3397234688,
+	3397320704,
+	3397321216,
+	3397321472,
+	3397321728,
+	3397321984,
+	3397322240,
+	3397323776,
+	3397324800,
+	3397330944,
+	3397332992,
+	3397349376,
+	3397353472,
+	3397357568,
+	3397361664,
+	3397369856,
+	3397370368,
+	3397370880,
+	3397371904,
+	3397373952,
+	3397374208,
+	3397374976,
+	3397376000,
+	3397378048,
+	3397505024,
+	3397517312,
+	3397527296,
+	3397574656,
+	3397586944,
+	3397595136,
+	3397636096,
+	3397722112,
+	3397794304,
+	3397812224,
+	3397832704,
+	3397833728,
+	3397834752,
+	3397835776,
+	3397922816,
+	3397963776,
+	3397967872,
+	3397974016,
+	3398035200,
+	3398208512,
+	3398209536,
+	3398210560,
+	3398211584,
+	3398212608,
+	3398279168,
+	3398307840,
+	3398370304,
+	3398373376,
+	3398377472,
+	3398383616,
+	3398394880,
+	3398395904,
+	3398606848,
+	3398613504,
+	3398614016,
+	3398616064,
+	3398617088,
+	3398668288,
+	3398705152,
+	3398713344,
+	3398721536,
+	3398770688,
+	3398803456,
+	3398819840,
+	3398832128,
+	3398836224,
+	3398842368,
+	3398877184,
+	3398885376,
+	3398893568,
+	3398902016,
+	3398926336,
+	3399004160,
+	3399024640,
+	3399026432,
+	3399036928,
+	3399335936,
+	3399393280,
+	3399414272,
+	3399519232,
+	3399523328,
+	3399528448,
+	3399631616,
+	3399633664,
+	3399745536,
+	3399770112,
+	3399835648,
+	3399856128,
+	3399864320,
+	3399872256,
+	3399872512,
+	3399873280,
+	3399873792,
+	3399875328,
+	3399875584,
+	3399933952,
+	3400028160,
+	3400040448,
+	3400041472,
+	3400042496,
+	3400043520,
+	3400048640,
+	3400052736,
+	3400171520,
+	3400194048,
+	3400196096,
+	3400259584,
+	3400263680,
+	3400264448,
+	3400269824,
+	3400271616,
+	3400335360,
+	3400336896,
+	3400337408,
+	3400364032,
+	3400366080,
+	3400392704,
+	3400417280,
+	3400432640,
+	3400589312,
+	3400769536,
+	3400770560,
+	3400771584,
+	3400772608,
+	3400790016,
+	3400826880,
+	3400847360,
+	3400861696,
+	3400866816,
+	3400888320,
+	3400933376,
+	3400974336,
+	3401383936,
+	3401404416,
+	3401431040,
+	3401515008,
+	3401532416,
+	3401533440,
+	3401535488,
+	3401580544,
+	3402104832,
+	3402366976,
+	3405775872,
+	3405777408,
+	3405779456,
+	3405780992,
+	3405785600,
+	3405786368,
+	3405786624,
+	3405795584,
+	3405795840,
+	3405797888,
+	3405799424,
+	3405801472,
+	3405804032,
+	3405806080,
+	3405807616,
+	3405808128,
+	3405808640,
+	3405809920,
+	3405811200,
+	3405811712,
+	3405812224,
+	3405812736,
+	3405813248,
+	3405813760,
+	3405820160,
+	3405832192,
+	3405841408,
+	3405844992,
+	3405847040,
+	3405857024,
+	3405857280,
+	3405858304,
+	3405859840,
+	3405863424,
+	3405865216,
+	3405865472,
+	3405865984,
+	3405868032,
+	3405905152,
+	3405905408,
+	3405922304,
+	3405924608,
+	3405934592,
+	3405938176,
+	3405941760,
+	3405944320,
+	3405944832,
+	3405945856,
+	3405946880,
+	3405952000,
+	3405956096,
+	3405959424,
+	3405960704,
+	3405963776,
+	3405964544,
+	3405966336,
+	3405988864,
+	3405989888,
+	3405990656,
+	3405991936,
+	3405996032,
+	3405998336,
+	3406000128,
+	3406002176,
+	3406002944,
+	3406006016,
+	3406007040,
+	3406008064,
+	3406070784,
+	3406071296,
+	3406075648,
+	3406075904,
+	3406081536,
+	3406083072,
+	3406084608,
+	3406089472,
+	3406090240,
+	3406095104,
+	3406095872,
+	3406103552,
+	3406104320,
+	3406104576,
+	3406105344,
+	3406107904,
+	3406108160,
+	3406113792,
+	3406114304,
+	3406115840,
+	3406116864,
+	3406117888,
+	3406131712,
+	3406132736,
+	3406133248,
+	3406146560,
+	3406148608,
+	3406149120,
+	3406149888,
+	3406150144,
+	3406150656,
+	3406151168,
+	3406152448,
+	3406157312,
+	3406158336,
+	3406201600,
+	3406202880,
+	3406203392,
+	3406204416,
+	3406206464,
+	3406208256,
+	3406208768,
+	3406225408,
+	3406231552,
+	3406266624,
+	3406268928,
+	3406271232,
+	3406272000,
+	3406274048,
+	3406282752,
+	3406284800,
+	3406299136,
+	3406301184,
+	3406305024,
+	3406305280,
+	3406317056,
+	3406320128,
+	3406321152,
+	3406322432,
+	3406327296,
+	3406328576,
+	3406341632,
+	3406342400,
+	3406343424,
+	3406346240,
+	3406346752,
+	3406347776,
+	3406348288,
+	3406349568,
+	3406349824,
+	3406351104,
+	3406352640,
+	3406352896,
+	3406353408,
+	3406354688,
+	3406355456,
+	3406372864,
+	3406373888,
+	3406379264,
+	3406380800,
+	3406381312,
+	3406382592,
+	3406383104,
+	3406383872,
+	3406384128,
+	3406389248,
+	3406390272,
+	3406392320,
+	3406405120,
+	3406438912,
+	3406444544,
+	3406449152,
+	3406451712,
+	3406452736,
+	3406454528,
+	3406462208,
+	3406513664,
+	3406515200,
+	3406516736,
+	3406517248,
+	3406521344,
+	3406523648,
+	3406525696,
+	3406526976,
+	3406528000,
+	3406530560,
+	3406531840,
+	3406532096,
+	3406541824,
+	3406548992,
+	3406565376,
+	3406566144,
+	3406567424,
+	3406575872,
+	3406577920,
+	3406578176,
+	3406579200,
+	3406583552,
+	3406583808,
+	3406586880,
+	3406587648,
+	3406590464,
+	3406591488,
+	3406594560,
+	3406596352,
+	3406611456,
+	3406612480,
+	3406615296,
+	3406617344,
+	3406619136,
+	3406622720,
+	3406631424,
+	3406632960,
+	3406638080,
+	3406647296,
+	3406649344,
+	3406650368,
+	3406671104,
+	3406684160,
+	3406684928,
+	3406686464,
+	3406698496,
+	3406700800,
+	3406706688,
+	3406707968,
+	3406708224,
+	3406718976,
+	3406721536,
+	3406722560,
+	3406733824,
+	3406739456,
+	3406741504,
+	3406742016,
+	3406747136,
+	3406751488,
+	3406755328,
+	3406757888,
+	3406763008,
+	3406763520,
+	3406780160,
+	3406780416,
+	3406784768,
+	3406786560,
+	3406791168,
+	3406796032,
+	3406796544,
+	3406797824,
+	3406802432,
+	3406816000,
+	3406817280,
+	3406819328,
+	3406820864,
+	3406825984,
+	3406826496,
+	3406827520,
+	3406830336,
+	3406833152,
+	3406835968,
+	3406836224,
+	3406838272,
+	3406839552,
+	3406857472,
+	3406864640,
+	3406864896,
+	3406871040,
+	3406881792,
+	3406884352,
+	3406884864,
+	3406886144,
+	3406889472,
+	3406893568,
+	3406896128,
+	3406898944,
+	3406903296,
+	3406907904,
+	3406911488,
+	3406923776,
+	3406930944,
+	3406936832,
+	3406937600,
+	3406948096,
+	3406948608,
+	3406952448,
+	3406952704,
+	3406954240,
+	3406955008,
+	3406955520,
+	3406956288,
+	3406962432,
+	3406963968,
+	3406966784,
+	3406967808,
+	3406972928,
+	3406974976,
+	3406976768,
+	3406980096,
+	3406981376,
+	3406981888,
+	3406982656,
+	3406987520,
+	3406988032,
+	3406988288,
+	3406991360,
+	3406993664,
+	3407005440,
+	3407007744,
+	3407008512,
+	3407009536,
+	3407020288,
+	3407024640,
+	3407026176,
+	3407027712,
+	3407028224,
+	3407030528,
+	3407031296,
+	3407031808,
+	3407034880,
+	3407035392,
+	3407036416,
+	3407037440,
+	3407038464,
+	3407045888,
+	3407048448,
+	3407053568,
+	3407054080,
+	3407056896,
+	3407057664,
+	3407058176,
+	3407059968,
+	3407065088,
+	3407065600,
+	3407073280,
+	3407078400,
+	3407079680,
+	3407081984,
+	3407083520,
+	3407085312,
+	3407089920,
+	3407095808,
+	3407096832,
+	3407097856,
+	3407101184,
+	3407102208,
+	3407107072,
+	3407108352,
+	3407112704,
+	3407115008,
+	3407115520,
+	3407115776,
+	3407116800,
+	3407117824,
+	3407120128,
+	3407120384,
+	3407123968,
+	3407144448,
+	3407144960,
+	3407145984,
+	3407151104,
+	3407151616,
+	3407153152,
+	3407153664,
+	3407155712,
+	3407159552,
+	3407159808,
+	3407161600,
+	3407162368,
+	3407168512,
+	3407172096,
+	3407175680,
+	3407182848,
+	3407185920,
+	3407188224,
+	3407203840,
+	3407222784,
+	3407223808,
+	3407224576,
+	3407234048,
+	3407236096,
+	3407236608,
+	3407238144,
+	3407238912,
+	3407240192,
+	3407241984,
+	3407243776,
+	3407247872,
+	3407250176,
+	3407258368,
+	3407259136,
+	3407260160,
+	3407261696,
+	3407266304,
+	3407278592,
+	3407279360,
+	3407279616,
+	3407281152,
+	3407282176,
+	3407294208,
+	3407297792,
+	3407298048,
+	3407300864,
+	3407303936,
+	3407305728,
+	3407307264,
+	3407309568,
+	3407310848,
+	3407315456,
+	3407318016,
+	3407326208,
+	3407328768,
+	3407329792,
+	3407331328,
+	3407332608,
+	3407332864,
+	3407334400,
+	3407339520,
+	3407340032,
+	3407340544,
+	3407345920,
+	3407346432,
+	3407351040,
+	3407352320,
+	3407354624,
+	3407358720,
+	3407362048,
+	3407362560,
+	3407364864,
+	3407366656,
+	3407367936,
+	3407368192,
+	3407369216,
+	3407369728,
+	3407370752,
+	3407376128,
+	3407376384,
+	3407377408,
+	3407378944,
+	3407384832,
+	3407386624,
+	3407387904,
+	3407388928,
+	3407390464,
+	3407395328,
+	3407398656,
+	3407399424,
+	3407401984,
+	3407403264,
+	3407403776,
+	3407410176,
+	3407418112,
+	3407418368,
+	3407425024,
+	3407425536,
+	3407429632,
+	3407436544,
+	3407438592,
+	3407438848,
+	3407440384,
+	3407446784,
+	3407447808,
+	3407448576,
+	3407450880,
+	3407452416,
+	3407452672,
+	3407455232,
+	3407455744,
+	3407457792,
+	3407459328,
+	3407459840,
+	3407462144,
+	3407464192,
+	3407464448,
+	3407464960,
+	3407466496,
+	3407471872,
+	3407473408,
+	3407473664,
+	3407475200,
+	3407481856,
+	3407487488,
+	3407491328,
+	3407491584,
+	3407492864,
+	3407493120,
+	3407494144,
+	3407495424,
+	3407496192,
+	3407498240,
+	3407499264,
+	3407500288,
+	3407503616,
+	3407504896,
+	3407508224,
+	3407508480,
+	3407511808,
+	3407515392,
+	3407515648,
+	3407516672,
+	3407518208,
+	3407519232,
+	3407522304,
+	3407523072,
+	3407523840,
+	3407526144,
+	3407530496,
+	3407532544,
+	3407533568,
+	3407535616,
+	3407536128,
+	3407537152,
+	3407538176,
+	3407544320,
+	3407546880,
+	3407548160,
+	3407548416,
+	3407549440,
+	3407549952,
+	3407554560,
+	3407555840,
+	3407557888,
+	3407560960,
+	3407561216,
+	3407565056,
+	3407566848,
+	3407570432,
+	3407572224,
+	3407574272,
+	3407575296,
+	3407575552,
+	3407576320,
+	3407595520,
+	3407596032,
+	3407603968,
+	3407606016,
+	3407608320,
+	3407612416,
+	3407612928,
+	3407618304,
+	3407618560,
+	3407620864,
+	3407621120,
+	3407623680,
+	3407624192,
+	3407628544,
+	3407628800,
+	3407629312,
+	3407631872,
+	3407632384,
+	3407638528,
+	3407643392,
+	3407644672,
+	3407645696,
+	3407646976,
+	3407652096,
+	3407653120,
+	3407653376,
+	3407655424,
+	3407657216,
+	3407657728,
+	3407660032,
+	3407667712,
+	3407671040,
+	3407675904,
+	3407677440,
+	3407678720,
+	3407678976,
+	3407682560,
+	3407687168,
+	3407689984,
+	3407691008,
+	3407691520,
+	3407693056,
+	3407694080,
+	3407696128,
+	3407698432,
+	3407699712,
+	3407700992,
+	3407701760,
+	3407704064,
+	3407706112,
+	3407721984,
+	3407723264,
+	3407723776,
+	3407724032,
+	3407727872,
+	3407729152,
+	3407730944,
+	3407733504,
+	3407734528,
+	3407735040,
+	3407735296,
+	3407738880,
+	3407740416,
+	3407745024,
+	3407747328,
+	3407747840,
+	3407748352,
+	3407757824,
+	3407761664,
+	3407763200,
+	3407769344,
+	3407771904,
+	3407772416,
+	3407779840,
+	3407780864,
+	3407782400,
+	3407785216,
+	3407785728,
+	3407788800,
+	3407790592,
+	3407796480,
+	3407797248,
+	3407797760,
+	3407800320,
+	3407801088,
+	3407802368,
+	3407803904,
+	3407804928,
+	3407817984,
+	3407818240,
+	3407819008,
+	3407819520,
+	3407820288,
+	3407824128,
+	3407824896,
+	3407826944,
+	3407828224,
+	3407831296,
+	3407833344,
+	3407833600,
+	3407834112,
+	3407838208,
+	3407847936,
+	3407851008,
+	3407851776,
+	3407852800,
+	3407854336,
+	3407854848,
+	3407858688,
+	3407862784,
+	3407863296,
+	3407864064,
+	3407865088,
+	3407869952,
+	3407871232,
+	3407877120,
+	3407884288,
+	3407886336,
+	3407887360,
+	3407887872,
+	3407889408,
+	3407891456,
+	3407892736,
+	3407893504,
+	3407896320,
+	3407898112,
+	3407898880,
+	3407905280,
+	3407906048,
+	3407907840,
+	3407910912,
+	3407919616,
+	3407921152,
+	3407922176,
+	3407923968,
+	3407924224,
+	3407926272,
+	3407938560,
+	3407939328,
+	3407939584,
+	3407942912,
+	3407944192,
+	3407945728,
+	3407953664,
+	3407953920,
+	3407954688,
+	3407954944,
+	3407956224,
+	3407957760,
+	3407963136,
+	3407968768,
+	3407970560,
+	3407971072,
+	3407974656,
+	3407977472,
+	3407977984,
+	3407982080,
+	3407984896,
+	3407988736,
+	3407989248,
+	3407989760,
+	3407990272,
+	3407992320,
+	3407994880,
+	3407995392,
+	3407997184,
+	3407999744,
+	3408001536,
+	3408004096,
+	3408008448,
+	3408009984,
+	3408013056,
+	3408015360,
+	3408016896,
+	3408017408,
+	3408020224,
+	3408020736,
+	3408022528,
+	3408026624,
+	3408030208,
+	3408032000,
+	3408040704,
+	3408041472,
+	3408041984,
+	3408044288,
+	3408044544,
+	3408050944,
+	3408052224,
+	3408055296,
+	3408062464,
+	3408064512,
+	3408065024,
+	3408065792,
+	3408067328,
+	3409379840,
+	3409380352,
+	3409381888,
+	3409382656,
+	3409384960,
+	3409387008,
+	3409403136,
+	3409405184,
+	3409407232,
+	3409407488,
+	3409409024,
+	3409409792,
+	3409412096,
+	3409416704,
+	3409428480,
+	3409429504,
+	3409435136,
+	3409435904,
+	3409436672,
+	3409445120,
+	3409445888,
+	3409447936,
+	3409451008,
+	3409454592,
+	3409455104,
+	3409456640,
+	3409457152,
+	3409462272,
+	3409465856,
+	3409466368,
+	3409469184,
+	3409473024,
+	3409475840,
+	3409486080,
+	3409488128,
+	3409488896,
+	3409489664,
+	3409491712,
+	3409492224,
+	3409492736,
+	3409494016,
+	3409495552,
+	3409496320,
+	3409498112,
+	3409498624,
+	3409499648,
+	3409500160,
+	3409502976,
+	3409503232,
+	3409504000,
+	3409504256,
+	3409506304,
+	3409509376,
+	3409509888,
+	3409511680,
+	3409511936,
+	3409513472,
+	3409517568,
+	3409520384,
+	3409522176,
+	3409525248,
+	3409526016,
+	3409527296,
+	3409528064,
+	3409528320,
+	3409529088,
+	3409533440,
+	3409536256,
+	3409538304,
+	3409541888,
+	3409550592,
+	3409561600,
+	3409562112,
+	3409563136,
+	3409567232,
+	3409567744,
+	3409573376,
+	3409574144,
+	3409575168,
+	3409575424,
+	3409838592,
+	3409871616,
+	3409873664,
+	3409879296,
+	3409888512,
+	3409896448,
+	3409897984,
+	3409901056,
+	3410796544,
+	3410798592,
+	3410808832,
+	3410809856,
+	3410810880,
+	3410817024,
+	3410818048,
+	3410867200,
+	3410898944,
+	3410926592,
+	3410952192,
+	3410960384,
+	3411018752,
+	3411025920,
+	3411032320,
+	3411050752,
+	3411051520,
+	3411052544,
+	3411054592,
+	3411083264,
+	3411087360,
+	3411145728,
+	3411148800,
+	3411152896,
+	3411177472,
+	3411178496,
+	3411179520,
+	3411180544,
+	3411206144,
+	3411207168,
+	3411208192,
+	3411209216,
+	3411214336,
+	3411216384,
+	3411217408,
+	3411228672,
+	3411271680,
+	3411410944,
+	3411419136,
+	3411427328,
+	3411431424,
+	3411435520,
+	3411474944,
+	3411475968,
+	3411550208,
+	3411591168,
+	3411607552,
+	3411609600,
+	3411641600,
+	3411642368,
+	3411644416,
+	3411673088,
+	3411675136,
+	3411676160,
+	3411705856,
+	3411714048,
+	3411722240,
+	3411746816,
+	3411763200,
+	3411769344,
+	3411804160,
+	3411805696,
+	3411845120,
+	3411869696,
+	3411870720,
+	3411871744,
+	3411872000,
+	3411872256,
+	3411872768,
+	3411873792,
+	3411877888,
+	3411886080,
+	3411902464,
+	3411904512,
+	3411905536,
+	3411905792,
+	3411906048,
+	3411906560,
+	3411910656,
+	3411918848,
+	3411935232,
+	3411936256,
+	3411937280,
+	3411939328,
+	3412000768,
+	3412025344,
+	3412029440,
+	3412033536,
+	3412051968,
+	3412052992,
+	3412054016,
+	3412058112,
+	3412264960,
+	3412267008,
+	3412283392,
+	3412336640,
+	3412340736,
+	3412343296,
+	3412343808,
+	3412344576,
+	3412348928,
+	3412353024,
+	3412377600,
+	3412598784,
+	3412680704,
+	3412688896,
+	3412787200,
+	3413024768,
+	3413037056,
+	3413043200,
+	3413043712,
+	3413266432,
+	3413267456,
+	3413268480,
+	3413269504,
+	3413308416,
+	3413557248,
+	3413569792,
+	3413571584,
+	3413579776,
+	3413581824,
+	3413594112,
+	3413595392,
+	3413602560,
+	3413602816,
+	3413603328,
+	3413604352,
+	3413606400,
+	3413850624,
+	3414171648,
+	3414188032,
+	3414220800,
+	3414231040,
+	3414302720,
+	3414433792,
+	3414618112,
+	3414646784,
+	3414650880,
+	3414663168,
+	3415137024,
+	3415138304,
+	3415236608,
+	3415277568,
+	3415474176,
+	3415490560,
+	3415494656,
+	3415496192,
+	3415563264,
+	3415752704,
+	3415769088,
+	3415801856,
+	3416047616,
+	3416133632,
+	3416273920,
+	3416287232,
+	3416293632,
+	3416309760,
+	3416326144,
+	3416372224,
+	3416372992,
+	3416375296,
+	3416694784,
+	3416726528,
+	3416784896,
+	3416930816,
+	3416981504,
+	3417034752,
+	3417038848,
+	3417179136,
+	3417179648,
+	3417179904,
+	3417202688,
+	3417276416,
+	3417292800,
+	3417309184,
+	3417325568,
+	3417352192,
+	3417853952,
+	3417947392,
+	3418071040,
+	3418161152,
+	3418162688,
+	3418189824,
+	3418210304,
+	3418220544,
+	3418221568,
+	3418222592,
+	3418251264,
+	3418290432,
+	3418292224,
+	3418292736,
+	3418293504,
+	3418294016,
+	3418296320,
+	3418308608,
+	3418326272,
+	3418329088,
+	3418331136,
+	3418357760,
+	3418480640,
+	3418519552,
+	3418570752,
+	3418583040,
+	3418587136,
+	3418619904,
+	3418621952,
+	3418627072,
+	3418993920,
+	3418994176,
+	3419073536,
+	3419226112,
+	3419242496,
+	3419357184,
+	3419361280,
+	3419363328,
+	3419364352,
+	3419365376,
+	3419369472,
+	3419373568,
+	3419389952,
+	3419392000,
+	3419394048,
+	3419398144,
+	3419406336,
+	3419410432,
+	3419414528,
+	3419529216,
+	3419668480,
+	3419688960,
+	3419924480,
+	3420038144,
+	3420372992,
+	3420389376,
+	3420393472,
+	3523346432,
+	3523350528,
+	3523543040,
+	3523557376,
+	3523575808,
+	3523579904,
+	3523688448,
+	3523689472,
+	3524001792,
+	3524018176,
+	3524034560,
+	3524050944,
+	3524067328,
+	3524083712,
+	3524100096,
+	3524149248,
+	3524161536,
+	3524165632,
+	3524173824,
+	3524182016,
+	3524190208,
+	3524198400,
+	3524206592,
+	3524214784,
+	3524222976,
+	3524231168,
+	3524290560,
+	3524296704,
+	3524591616,
+	3524624384,
+	3524657152,
+	3524730880,
+	3524853760,
+	3524919296,
+	3525050368,
+	3525312512,
+	3525574656,
+	3525836800,
+	3526557696,
+	3526623232,
+	3526639616,
+	3526656000,
+	3526688768,
+	3526721536,
+	3526934528,
+	3527933952,
+	3527966720,
+	3527974912,
+	3527983104,
+	3527999488,
+	3528007680,
+	3528015872,
+	3528032256,
+	3528065024,
+	3528073216,
+	3528081408,
+	3528089600,
+	3528097792,
+	3528105984,
+	3528114176,
+	3528130560,
+	3528196096,
+	3528204288,
+	3528212480,
+	3528228864,
+	3528261632,
+	3528327168,
+	3528335360,
+	3528343552,
+	3528359936,
+	3528368128,
+	3528376320,
+	3528409088,
+	3528450048,
+	3528589312,
+	3528949760,
+	3528953856,
+	3528957952,
+	3535388672,
+	3535822848,
+	3544186880,
+	3544449024,
+	3544580096,
+	3545235456,
+	3545300992,
+	3545366528,
+	3545432064,
+	3545497600,
+	3545628672,
+	3545759744,
+	3545825280,
+	3545890816,
+	3546021888,
+	3546152960,
+	3546284032,
+	3546415104,
+	3546480640,
+	3546497024,
+	3546505216,
+	3546513408,
+	3546546176,
+	3546611712,
+	3546628096,
+	3546644480,
+	3546677248,
+	3546742784,
+	3546775552,
+	3548905472,
+	3549167616,
+	3549298688,
+	3549331456,
+	3549364224,
+	3549429760,
+	3549560832,
+	3549626368,
+	3549691904,
+	3549954048,
+	3550085120,
+	3550150656,
+	3550167040,
+	3550175232,
+	3550183424,
+	3550216192,
+	3550478336,
+	3550740480,
+	3640290304,
+	3657433088,
+	3657498624,
+	3657564160,
+	3657695232,
+	3657826304,
+	3657891840,
+	3657957376,
+	3658088448,
+	3658153984,
+	3658219520,
+	3658285056,
+	3658350592,
+	3658481664,
+	3658743808,
+	3658809344,
+	3658842112,
+	3658874880,
+	3659005952,
+	3659137024,
+	3659202560,
+	3659268096,
+	3659399168,
+	3661103104,
+	3661365248,
+	3661496320,
+	3661529088,
+	3661561856,
+	3661627392,
+	3661758464,
+	3661824000,
+	3661856768,
+	3661889536,
+	3662020608,
+	3662151680,
+	3662413824,
+	3662544896,
+	3662675968,
+	3662938112,
+	3663200256,
+	3663724544,
+	3663855616,
+	3663888384,
+	3663904768,
+	3663912960,
+	3663921152,
+	3664009216,
+	3664011264,
+	3664019456,
+	3664248832,
+	3664281600,
+	3664289792,
+	3664297984,
+	3664300032,
+	3664302080,
+	3664306176,
+	3664314368,
+	3664379904,
+	3664510976,
+	3664576512,
+	3669606400,
+	3669618688,
+	3670016000,
+	3670081536,
+	3670147072,
+	3670212608,
+	3670278144,
+	3670540288,
+	3670802432,
+	3670933504,
+	3673161728,
+	3673423872,
+	3673554944,
+	3673751552,
+	3678928896,
+	3679584256,
+	3679682560,
+	3680125952,
+	3680126976,
+	3680128000,
+	3682598912,
+	3683647488,
+	3683909632,
+	3683975168,
+	3684007936,
+	3684024320,
+	3684040704,
+	3684048896,
+	3684057088,
+	3684065280,
+	3684069376,
+	3684073472,
+	3684106240,
+	3684114432,
+	3684122624,
+	3684139008,
+	3684171776,
+	3684302848,
+	3684433920,
+	3684564992,
+	3684597760,
+	3684630528,
+	3684646912,
+	3684663296,
+	3688366080,
+	3688497152,
+	3688628224,
+	3688693760,
+	3688759296,
+	3688890368,
+	3689021440,
+	3689086976,
+	3689152512,
+	3689283584,
+	3689414656,
+	3689676800,
+	3689807872,
+	3690070016,
+	3690201088,
+	3697655808,
+	3698327552,
+	3700981760,
+	3701080064,
+	3701403648,
+	3701473280,
+	3703570432,
+	3703701504,
+	3703832576,
+	3704094720,
+	3706126336,
+	3706159104,
+	3706208256,
+	3706322944,
+	3706847232,
+	3707209728,
+	3707240448,
+	3707502592,
+	3707764736,
+	3707895808,
+	3707961344,
+	3707994112,
+	3708026880,
+	3708092416,
+	3708125184,
+	3708157952,
+	3708223488,
+	3708231680,
+	3708239872,
+	3708248064,
+	3708256256,
+	3708289024,
+	3708420096,
+	3708485632,
+	3708518400,
+	3708534784,
+	3708542976,
+	3708551168,
+	3708583936,
+	3708616704,
+	3708633088,
+	3708641280,
+	3708649472,
+	3708682240,
+	3715760128,
+	3716186112,
+	3716218880,
+	3716284416,
+	3716538368,
+	3716677632,
+	3716743168,
+	3719036928,
+	3719299072,
+	3720347648,
+	3720478720,
+	3720544256,
+	3720609792,
+	3720740864,
+	3720806400,
+	3720814592,
+	3720818688,
+	3720822784,
+	3720839168,
+	3720855552,
+	3720863744,
+	3720871936,
+	3721134080,
+	3721265152,
+	3721330688,
+	3721347072,
+	3721363456,
+	3721396224,
+	3721658368,
+	3721723904,
+	3721789440,
+	3721920512,
+	3722444800,
+	3722969088,
+	3723231232,
+	3723362304,
+	3723427840,
+	3723460608,
+	3725590528,
+	3725721600,
+	3725852672,
+	3725983744,
+	3726049280,
+	3726114816,
+	3726245888,
+	3726376960,
+	3726639104,
+	3728736256,
+	3729260544,
+	3729391616,
+	3729457152,
+	3729522688,
+	3729784832,
+	3729915904,
+	3729981440,
+	3730014208,
+	3730046976,
+	3730112512,
+	3730145280,
+	3730178048,
+	3730309120,
+	3730440192,
+	3730571264,
+	3732733952,
+	3732832256,
+	3732930560,
+	3733192704,
+	3733454848,
+	3735027712,
+	3735158784,
+	3735224320,
+	3735232512,
+	3735240704,
+	3735257088,
+	3735552000,
+	3735683072,
+	3735814144,
+	3735846912,
+	3735879680,
+	3735945216,
+	3736076288,
+	3736600576,
+	3737124864,
+	3737387008,
+	3737518080,
+	3737583616,
+	3737649152,
+	3737911296,
+	3738042368,
+	3738173440,
+	3738697728,
+	3738828800,
+	3738894336,
+	3738959872,
+	3739090944,
+	3740270592,
+	3740794880,
+	3740860416,
+	3740893184,
+	3740901376,
+	3740905472,
+	3740909568,
+	3741319168,
+	3741450240,
+	3741581312,
+	3741843456,
+	3742629888,
+	3743135744,
+	3743272960,
+	3743284224,
+	3745513472,
+	3747610624,
+	3748659200,
+	3748921344,
+	3749183488,
+	3749707776,
+	3749840896,
+	3750756352,
+	3751804928,
+	3752198144,
+	3753902080,
+	3754295296,
+	3754491904,
+	3754557440,
+	3754950656,
+	3755212800,
+	3755343872,
+	3755737088,
+	3755978752,
+	3755982848,
+	3757047808,
+	3757572096,
+	3757867008,
+	3757965312,
+	3758030848,
+	3758091264,
+	3758095360,
+	}
+var CNIPDataNum = []uint{
+	256,
+	512,
+	2048,
+	8192,
+	256,
+	512,
+	1024,
+	256,
+	256,
+	512,
+	1024,
+	4096,
+	8192,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	1024,
+	4096,
+	8192,
+	16384,
+	65536,
+	256,
+	512,
+	256,
+	256,
+	512,
+	2048,
+	4096,
+	8192,
+	16384,
+	65536,
+	2048,
+	512,
+	256,
+	1024,
+	4096,
+	8192,
+	16384,
+	262144,
+	524288,
+	65536,
+	131072,
+	65536,
+	65536,
+	524288,
+	262144,
+	524288,
+	262144,
+	131072,
+	131072,
+	262144,
+	262144,
+	131072,
+	262144,
+	524288,
+	131072,
+	262144,
+	2048,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1048576,
+	1024,
+	1024,
+	1024,
+	65536,
+	524288,
+	1048576,
+	131072,
+	131072,
+	1048576,
+	1024,
+	1024,
+	1024,
+	1024,
+	131072,
+	131072,
+	1048576,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	524288,
+	1048576,
+	2048,
+	262144,
+	524288,
+	2048,
+	32768,
+	2048,
+	2048,
+	16384,
+	4096,
+	8192,
+	32768,
+	65536,
+	16384,
+	1024,
+	8192,
+	1024,
+	16384,
+	4096,
+	1024,
+	1024,
+	16384,
+	32768,
+	1024,
+	2048,
+	2048,
+	1024,
+	131072,
+	1024,
+	65536,
+	262144,
+	524288,
+	524288,
+	2097152,
+	262144,
+	1024,
+	2048,
+	4096,
+	8192,
+	16384,
+	32768,
+	65536,
+	262144,
+	1048576,
+	262144,
+	65536,
+	8192,
+	512,
+	256,
+	2048,
+	4096,
+	524288,
+	131072,
+	65536,
+	524288,
+	2097152,
+	4194304,
+	2097152,
+	262144,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	512,
+	1024,
+	2048,
+	4096,
+	8192,
+	16384,
+	32768,
+	2097152,
+	524288,
+	262144,
+	65536,
+	4194304,
+	131072,
+	32768,
+	16384,
+	1024,
+	2048,
+	2048,
+	1024,
+	8192,
+	32768,
+	8192,
+	4096,
+	2048,
+	1024,
+	32768,
+	262144,
+	131072,
+	65536,
+	65536,
+	262144,
+	262144,
+	32768,
+	8192,
+	4096,
+	1024,
+	2048,
+	65536,
+	131072,
+	4096,
+	1024,
+	2048,
+	8192,
+	32768,
+	262144,
+	524288,
+	8192,
+	2048,
+	1024,
+	4096,
+	32768,
+	65536,
+	16384,
+	8192,
+	4096,
+	1024,
+	2048,
+	262144,
+	131072,
+	65536,
+	8192,
+	1024,
+	2048,
+	4096,
+	16384,
+	32768,
+	1048576,
+	8192,
+	1024,
+	2048,
+	4096,
+	16384,
+	32768,
+	65536,
+	131072,
+	1048576,
+	524288,
+	131072,
+	65536,
+	16384,
+	8192,
+	4096,
+	2048,
+	1024,
+	32768,
+	131072,
+	2048,
+	1024,
+	1024,
+	4096,
+	8192,
+	16384,
+	32768,
+	65536,
+	262144,
+	32768,
+	131072,
+	262144,
+	1048576,
+	1048576,
+	32768,
+	32768,
+	131072,
+	262144,
+	524288,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	2048,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	262144,
+	2097152,
+	262144,
+	65536,
+	262144,
+	2097152,
+	524288,
+	262144,
+	256,
+	512,
+	1024,
+	131072,
+	262144,
+	131072,
+	131072,
+	262144,
+	262144,
+	16384,
+	16384,
+	8192,
+	262144,
+	131072,
+	131072,
+	65536,
+	32768,
+	32768,
+	65536,
+	65536,
+	65536,
+	65536,
+	131072,
+	131072,
+	131072,
+	524288,
+	131072,
+	65536,
+	65536,
+	262144,
+	524288,
+	131072,
+	65536,
+	32768,
+	32768,
+	262144,
+	2048,
+	131072,
+	32768,
+	32768,
+	32768,
+	32768,
+	16384,
+	32768,
+	131072,
+	262144,
+	524288,
+	65536,
+	131072,
+	131072,
+	131072,
+	131072,
+	131072,
+	524288,
+	1048576,
+	131072,
+	131072,
+	131072,
+	131072,
+	524288,
+	524288,
+	131072,
+	65536,
+	65536,
+	262144,
+	65536,
+	32768,
+	32768,
+	65536,
+	32768,
+	32768,
+	262144,
+	262144,
+	131072,
+	131072,
+	262144,
+	262144,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	131072,
+	32768,
+	32768,
+	131072,
+	131072,
+	32768,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	131072,
+	131072,
+	32768,
+	4096,
+	4194304,
+	524288,
+	131072,
+	65536,
+	65536,
+	65536,
+	16384,
+	16384,
+	32768,
+	131072,
+	524288,
+	262144,
+	131072,
+	65536,
+	65536,
+	65536,
+	65536,
+	131072,
+	131072,
+	131072,
+	131072,
+	524288,
+	1048576,
+	131072,
+	262144,
+	65536,
+	65536,
+	131072,
+	524288,
+	131072,
+	131072,
+	262144,
+	131072,
+	65536,
+	32768,
+	65536,
+	65536,
+	32768,
+	65536,
+	1024,
+	1024,
+	2048,
+	4096,
+	4096,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	4096,
+	8192,
+	16384,
+	16384,
+	8192,
+	4096,
+	4096,
+	16384,
+	4096,
+	16384,
+	262144,
+	131072,
+	65536,
+	65536,
+	16384,
+	131072,
+	131072,
+	65536,
+	32768,
+	32768,
+	16384,
+	8192,
+	8192,
+	16384,
+	16384,
+	65536,
+	16384,
+	16384,
+	32768,
+	32768,
+	32768,
+	16384,
+	16384,
+	16384,
+	16384,
+	32768,
+	16384,
+	16384,
+	262144,
+	262144,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	65536,
+	65536,
+	32768,
+	32768,
+	16384,
+	16384,
+	32768,
+	65536,
+	16384,
+	16384,
+	32768,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	131072,
+	262144,
+	65536,
+	65536,
+	65536,
+	65536,
+	32768,
+	32768,
+	65536,
+	65536,
+	65536,
+	262144,
+	65536,
+	32768,
+	32768,
+	131072,
+	262144,
+	131072,
+	262144,
+	1024,
+	1024,
+	1024,
+	262144,
+	1048576,
+	262144,
+	65536,
+	65536,
+	131072,
+	524288,
+	131072,
+	1024,
+	1024,
+	1024,
+	65536,
+	1024,
+	65536,
+	2048,
+	524288,
+	262144,
+	131072,
+	1024,
+	8192,
+	1048576,
+	2048,
+	1024,
+	4096,
+	32768,
+	8192,
+	8192,
+	256,
+	512,
+	2048,
+	4096,
+	8192,
+	512,
+	256,
+	2048,
+	4096,
+	262144,
+	8192,
+	4096,
+	1024,
+	2048,
+	262144,
+	131072,
+	65536,
+	1024,
+	2048,
+	4096,
+	8192,
+	65536,
+	131072,
+	262144,
+	1048576,
+	262144,
+	262144,
+	131072,
+	8192,
+	2048,
+	1024,
+	4096,
+	262144,
+	524288,
+	131072,
+	2048,
+	1024,
+	4096,
+	8192,
+	262144,
+	262144,
+	262144,
+	131072,
+	1024,
+	2048,
+	4096,
+	8192,
+	16384,
+	32768,
+	131072,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	2048,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	512,
+	1024,
+	2048,
+	4096,
+	1024,
+	16384,
+	131072,
+	262144,
+	131072,
+	65536,
+	262144,
+	1048576,
+	1048576,
+	131072,
+	65536,
+	262144,
+	524288,
+	65536,
+	65536,
+	1048576,
+	262144,
+	524288,
+	524288,
+	1048576,
+	131072,
+	262144,
+	1024,
+	1024,
+	262144,
+	1024,
+	4096,
+	65536,
+	65536,
+	131072,
+	524288,
+	131072,
+	131072,
+	32768,
+	8192,
+	8192,
+	16384,
+	8192,
+	8192,
+	1024,
+	1024,
+	1024,
+	16384,
+	32768,
+	524288,
+	262144,
+	1024,
+	8192,
+	131072,
+	2097152,
+	262144,
+	131072,
+	8192,
+	131072,
+	16384,
+	8192,
+	4096,
+	8192,
+	8192,
+	8192,
+	524288,
+	524288,
+	2097152,
+	262144,
+	8192,
+	131072,
+	1048576,
+	4194304,
+	65536,
+	4096,
+	8192,
+	524288,
+	65536,
+	8192,
+	1024,
+	1024,
+	131072,
+	131072,
+	131072,
+	2048,
+	16384,
+	8192,
+	262144,
+	65536,
+	131072,
+	2097152,
+	524288,
+	65536,
+	262144,
+	524288,
+	131072,
+	1048576,
+	262144,
+	262144,
+	256,
+	32768,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	262144,
+	262144,
+	8192,
+	1024,
+	8192,
+	4194304,
+	131072,
+	131072,
+	65536,
+	131072,
+	524288,
+	524288,
+	131072,
+	131072,
+	262144,
+	32768,
+	65536,
+	262144,
+	131072,
+	131072,
+	262144,
+	262144,
+	65536,
+	2048,
+	262144,
+	2097152,
+	524288,
+	131072,
+	8192,
+	262144,
+	131072,
+	65536,
+	1024,
+	1024,
+	262144,
+	65536,
+	262144,
+	262144,
+	8192,
+	1024,
+	131072,
+	131072,
+	65536,
+	32768,
+	1024,
+	131072,
+	2097152,
+	1048576,
+	524288,
+	524288,
+	131072,
+	4096,
+	2048,
+	262144,
+	524288,
+	131072,
+	1024,
+	131072,
+	65536,
+	262144,
+	8192,
+	32768,
+	65536,
+	16384,
+	1024,
+	2048,
+	32768,
+	131072,
+	131072,
+	262144,
+	1048576,
+	524288,
+	262144,
+	65536,
+	1024,
+	1024,
+	131072,
+	262144,
+	262144,
+	65536,
+	16384,
+	1048576,
+	524288,
+	262144,
+	4096,
+	16384,
+	8192,
+	8192,
+	262144,
+	131072,
+	65536,
+	32768,
+	16384,
+	2048,
+	1024,
+	1024,
+	4096,
+	8192,
+	65536,
+	65536,
+	131072,
+	2048,
+	1024,
+	1024,
+	16384,
+	131072,
+	2048,
+	262144,
+	131072,
+	65536,
+	65536,
+	524288,
+	1048576,
+	1048576,
+	262144,
+	131072,
+	1024,
+	1024,
+	1024,
+	1024,
+	262144,
+	1024,
+	131072,
+	65536,
+	65536,
+	1048576,
+	4096,
+	16384,
+	8192,
+	16384,
+	262144,
+	262144,
+	262144,
+	4096,
+	262144,
+	131072,
+	131072,
+	131072,
+	65536,
+	65536,
+	8192,
+	262144,
+	262144,
+	262144,
+	1024,
+	1024,
+	1024,
+	1024,
+	131072,
+	2097152,
+	1048576,
+	2048,
+	2048,
+	65536,
+	131072,
+	262144,
+	262144,
+	65536,
+	1048576,
+	4096,
+	262144,
+	131072,
+	4096,
+	4096,
+	262144,
+	32768,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	32768,
+	131072,
+	131072,
+	65536,
+	4096,
+	4096,
+	2048,
+	65536,
+	262144,
+	131072,
+	4194304,
+	65536,
+	4096,
+	8192,
+	1024,
+	1024,
+	2048,
+	131072,
+	65536,
+	1024,
+	1024,
+	65536,
+	32768,
+	8192,
+	131072,
+	65536,
+	262144,
+	4096,
+	1024,
+	1024,
+	16384,
+	32768,
+	8192,
+	4096,
+	32768,
+	65536,
+	262144,
+	1048576,
+	131072,
+	131072,
+	131072,
+	131072,
+	16384,
+	131072,
+	1024,
+	1024,
+	32768,
+	32768,
+	524288,
+	65536,
+	131072,
+	524288,
+	524288,
+	262144,
+	131072,
+	262144,
+	4096,
+	4096,
+	65536,
+	32768,
+	65536,
+	262144,
+	524288,
+	131072,
+	4096,
+	4096,
+	32768,
+	65536,
+	262144,
+	1048576,
+	131072,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	131072,
+	524288,
+	16384,
+	32768,
+	32768,
+	16384,
+	2048,
+	32768,
+	262144,
+	4194304,
+	131072,
+	65536,
+	131072,
+	65536,
+	65536,
+	131072,
+	65536,
+	4096,
+	524288,
+	131072,
+	131072,
+	8192,
+	16384,
+	32768,
+	65536,
+	4096,
+	4096,
+	2048,
+	1024,
+	1024,
+	1024,
+	1024,
+	524288,
+	262144,
+	131072,
+	65536,
+	8192,
+	262144,
+	262144,
+	65536,
+	262144,
+	32768,
+	32768,
+	131072,
+	65536,
+	65536,
+	65536,
+	65536,
+	4096,
+	8192,
+	4096,
+	8192,
+	32768,
+	32768,
+	32768,
+	32768,
+	32768,
+	262144,
+	131072,
+	262144,
+	65536,
+	65536,
+	8192,
+	262144,
+	131072,
+	65536,
+	65536,
+	65536,
+	262144,
+	524288,
+	131072,
+	8192,
+	32768,
+	65536,
+	262144,
+	65536,
+	32768,
+	2048,
+	65536,
+	4096,
+	2048,
+	4096,
+	4096,
+	65536,
+	262144,
+	16384,
+	8192,
+	8192,
+	16384,
+	131072,
+	4096,
+	8192,
+	262144,
+	65536,
+	32768,
+	16384,
+	16384,
+	32768,
+	16384,
+	4096,
+	4096,
+	8192,
+	65536,
+	16384,
+	4096,
+	32768,
+	65536,
+	8192,
+	1024,
+	2048,
+	2048,
+	8192,
+	131072,
+	524288,
+	65536,
+	65536,
+	32768,
+	65536,
+	65536,
+	65536,
+	8192,
+	4096,
+	131072,
+	65536,
+	4096,
+	262144,
+	262144,
+	524288,
+	131072,
+	524288,
+	524288,
+	1048576,
+	262144,
+	4096,
+	4096,
+	16384,
+	2048,
+	1024,
+	1024,
+	32768,
+	131072,
+	262144,
+	1048576,
+	131072,
+	16384,
+	262144,
+	2048,
+	4096,
+	65536,
+	131072,
+	1048576,
+	262144,
+	65536,
+	65536,
+	524288,
+	262144,
+	262144,
+	131072,
+	65536,
+	65536,
+	131072,
+	262144,
+	262144,
+	8192,
+	32768,
+	262144,
+	524288,
+	2048,
+	131072,
+	65536,
+	65536,
+	65536,
+	262144,
+	32768,
+	32768,
+	65536,
+	131072,
+	1024,
+	1024,
+	16384,
+	32768,
+	8192,
+	4194304,
+	2048,
+	4096,
+	131072,
+	524288,
+	524288,
+	262144,
+	131072,
+	65536,
+	65536,
+	262144,
+	65536,
+	65536,
+	131072,
+	262144,
+	16384,
+	1024,
+	32768,
+	65536,
+	131072,
+	2048,
+	65536,
+	8192,
+	4096,
+	8192,
+	2048,
+	1024,
+	16384,
+	131072,
+	32768,
+	2048,
+	4096,
+	2048,
+	65536,
+	262144,
+	262144,
+	131072,
+	16384,
+	65536,
+	32768,
+	16384,
+	4096,
+	65536,
+	65536,
+	131072,
+	262144,
+	2048,
+	65536,
+	262144,
+	1048576,
+	262144,
+	65536,
+	16384,
+	32768,
+	262144,
+	65536,
+	65536,
+	32768,
+	1024,
+	512,
+	512,
+	512,
+	512,
+	1024,
+	4096,
+	8192,
+	16384,
+	32768,
+	65536,
+	65536,
+	65536,
+	65536,
+	16384,
+	65536,
+	2097152,
+	131072,
+	4096,
+	4096,
+	4096,
+	262144,
+	65536,
+	1024,
+	2048,
+	524288,
+	32768,
+	16384,
+	262144,
+	262144,
+	262144,
+	65536,
+	1024,
+	1024,
+	16384,
+	4096,
+	262144,
+	1048576,
+	524288,
+	2048,
+	4096,
+	2048,
+	16384,
+	262144,
+	524288,
+	32768,
+	8192,
+	262144,
+	131072,
+	4096,
+	4096,
+	8192,
+	16384,
+	16384,
+	8192,
+	4096,
+	4096,
+	65536,
+	65536,
+	65536,
+	65536,
+	2097152,
+	131072,
+	32768,
+	32768,
+	8192,
+	65536,
+	32768,
+	4096,
+	4096,
+	1048576,
+	524288,
+	4096,
+	65536,
+	131072,
+	262144,
+	65536,
+	65536,
+	131072,
+	524288,
+	262144,
+	262144,
+	262144,
+	131072,
+	131072,
+	1024,
+	4096,
+	65536,
+	131072,
+	262144,
+	262144,
+	262144,
+	131072,
+	32768,
+	131072,
+	262144,
+	32768,
+	1024,
+	1024,
+	262144,
+	65536,
+	65536,
+	1024,
+	1024,
+	16384,
+	131072,
+	131072,
+	65536,
+	4096,
+	4096,
+	8192,
+	16384,
+	32768,
+	131072,
+	16384,
+	32768,
+	65536,
+	4096,
+	16384,
+	8192,
+	1024,
+	32768,
+	32768,
+	16384,
+	131072,
+	32768,
+	65536,
+	262144,
+	65536,
+	65536,
+	131072,
+	262144,
+	65536,
+	32768,
+	32768,
+	131072,
+	262144,
+	2048,
+	2048,
+	2048,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	524288,
+	32768,
+	256,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	262144,
+	131072,
+	131072,
+	131072,
+	65536,
+	524288,
+	262144,
+	65536,
+	65536,
+	131072,
+	262144,
+	131072,
+	131072,
+	262144,
+	32768,
+	16384,
+	65536,
+	16384,
+	32768,
+	65536,
+	131072,
+	16384,
+	16384,
+	65536,
+	65536,
+	65536,
+	32768,
+	32768,
+	262144,
+	524288,
+	32768,
+	32768,
+	16384,
+	524288,
+	65536,
+	65536,
+	131072,
+	32768,
+	32768,
+	65536,
+	131072,
+	524288,
+	524288,
+	131072,
+	65536,
+	524288,
+	1048576,
+	65536,
+	65536,
+	16384,
+	65536,
+	65536,
+	32768,
+	8192,
+	16384,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	16384,
+	16384,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	262144,
+	524288,
+	524288,
+	65536,
+	65536,
+	131072,
+	65536,
+	131072,
+	65536,
+	65536,
+	65536,
+	131072,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	65536,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	65536,
+	65536,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	131072,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	32768,
+	65536,
+	65536,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	65536,
+	65536,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	65536,
+	65536,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	65536,
+	65536,
+	65536,
+	65536,
+	65536,
+	32768,
+	65536,
+	65536,
+	65536,
+	1024,
+	65536,
+	65536,
+	524288,
+	131072,
+	262144,
+	524288,
+	262144,
+	262144,
+	524288,
+	524288,
+	262144,
+	262144,
+	524288,
+	1048576,
+	1048576,
+	524288,
+	262144,
+	131072,
+	131072,
+	65536,
+	131072,
+	1048576,
+	2097152,
+	65536,
+	32768,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	131072,
+	262144,
+	262144,
+	1024,
+	1048576,
+	1024,
+	1024,
+	1024,
+	65536,
+	16384,
+	65536,
+	131072,
+	262144,
+	65536,
+	65536,
+	131072,
+	131072,
+	65536,
+	262144,
+	2048,
+	4096,
+	1024,
+	1024,
+	32768,
+	2097152,
+	32768,
+	65536,
+	524288,
+	2048,
+	2048,
+	2048,
+	8192,
+	8192,
+	1024,
+	8192,
+	524288,
+	1048576,
+	1024,
+	1024,
+	16384,
+	262144,
+	32768,
+	1024,
+	1024,
+	65536,
+	131072,
+	131072,
+	1024,
+	8192,
+	131072,
+	8192,
+	65536,
+	16384,
+	8192,
+	1024,
+	8192,
+	1024,
+	1024,
+	1024,
+	1024,
+	8192,
+	32768,
+	2048,
+	2048,
+	1048576,
+	8192,
+	65536,
+	4096,
+	4096,
+	65536,
+	32768,
+	1024,
+	65536,
+	262144,
+	262144,
+	262144,
+	65536,
+	1048576,
+	1048576,
+	1048576,
+	524288,
+	65536,
+	8192,
+	131072,
+	524288,
+	32768,
+	1024,
+	1024,
+	65536,
+	8192,
+	524288,
+	65536,
+	1024,
+	1024,
+	4194304,
+	524288,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	131072,
+	1024,
+	2048,
+	4096,
+	262144,
+	2097152,
+	524288,
+	131072,
+	65536,
+	262144,
+	8192,
+	524288,
+	4194304,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	512,
+	1024,
+	512,
+	8192,
+	1024,
+	1024,
+	1024,
+	1024,
+	512,
+	512,
+	512,
+	256,
+	512,
+	512,
+	256,
+	256,
+	512,
+	256,
+	4096,
+	256,
+	512,
+	512,
+	256,
+	256,
+	256,
+	8192,
+	4096,
+	256,
+	512,
+	512,
+	256,
+	512,
+	256,
+	256,
+	512,
+	4096,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	512,
+	512,
+	256,
+	512,
+	512,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	1024,
+	256,
+	512,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	512,
+	256,
+	256,
+	1024,
+	1024,
+	256,
+	256,
+	512,
+	256,
+	512,
+	512,
+	2048,
+	4096,
+	8192,
+	8192,
+	512,
+	512,
+	512,
+	256,
+	256,
+	512,
+	256,
+	512,
+	512,
+	512,
+	256,
+	512,
+	512,
+	512,
+	256,
+	512,
+	512,
+	1024,
+	512,
+	256,
+	256,
+	512,
+	2048,
+	16384,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	512,
+	256,
+	512,
+	2048,
+	256,
+	1024,
+	1024,
+	4096,
+	1024,
+	4096,
+	4096,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	512,
+	512,
+	512,
+	256,
+	256,
+	4096,
+	512,
+	256,
+	512,
+	8192,
+	256,
+	4096,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	256,
+	1024,
+	1024,
+	256,
+	256,
+	1024,
+	256,
+	256,
+	2048,
+	2048,
+	4096,
+	1024,
+	2048,
+	4096,
+	1024,
+	1024,
+	1024,
+	256,
+	256,
+	1024,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	512,
+	1024,
+	2048,
+	8192,
+	1024,
+	256,
+	2048,
+	512,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	8192,
+	4096,
+	4096,
+	1024,
+	1024,
+	1024,
+	1024,
+	2048,
+	4096,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	2048,
+	256,
+	256,
+	256,
+	4096,
+	1024,
+	512,
+	4096,
+	1024,
+	1024,
+	2048,
+	1024,
+	2048,
+	2048,
+	1024,
+	2048,
+	2048,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	2048,
+	512,
+	256,
+	2048,
+	4096,
+	256,
+	1024,
+	4096,
+	1024,
+	2048,
+	1024,
+	1024,
+	256,
+	2048,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	256,
+	256,
+	256,
+	4096,
+	1024,
+	4096,
+	1024,
+	4096,
+	8192,
+	1024,
+	2048,
+	4096,
+	1024,
+	1024,
+	1024,
+	256,
+	256,
+	1024,
+	1024,
+	1024,
+	2048,
+	4096,
+	2048,
+	1024,
+	16384,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	8192,
+	8192,
+	4096,
+	4096,
+	16384,
+	8192,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	8192,
+	2048,
+	2048,
+	4096,
+	8192,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	16384,
+	8192,
+	2048,
+	2048,
+	4096,
+	8192,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	8192,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	8192,
+	16384,
+	8192,
+	8192,
+	16384,
+	8192,
+	2048,
+	2048,
+	4096,
+	8192,
+	8192,
+	16384,
+	2048,
+	2048,
+	4096,
+	8192,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	2048,
+	2048,
+	4096,
+	8192,
+	8192,
+	2048,
+	2048,
+	4096,
+	16384,
+	8192,
+	2048,
+	2048,
+	4096,
+	131072,
+	65536,
+	32768,
+	32768,
+	65536,
+	65536,
+	16384,
+	16384,
+	16384,
+	16384,
+	32768,
+	8192,
+	8192,
+	16384,
+	65536,
+	4096,
+	4096,
+	8192,
+	16384,
+	16384,
+	8192,
+	4096,
+	4096,
+	8192,
+	8192,
+	16384,
+	32768,
+	8192,
+	8192,
+	16384,
+	32768,
+	8192,
+	4096,
+	4096,
+	8192,
+	8192,
+	32768,
+	16384,
+	16384,
+	32768,
+	8192,
+	8192,
+	16384,
+	32768,
+	8192,
+	8192,
+	4096,
+	4096,
+	8192,
+	32768,
+	16384,
+	16384,
+	32768,
+	65536,
+	2048,
+	2048,
+	8192,
+	2048,
+	2048,
+	256,
+	256,
+	4096,
+	1024,
+	1024,
+	2048,
+	1024,
+	256,
+	256,
+	4096,
+	4096,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	1024,
+	4096,
+	2048,
+	4096,
+	4096,
+	4096,
+	4096,
+	2048,
+	512,
+	512,
+	1024,
+	2048,
+	256,
+	256,
+	1024,
+	2048,
+	8192,
+	256,
+	8192,
+	256,
+	8192,
+	2048,
+	4096,
+	4096,
+	4096,
+	256,
+	4096,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	4096,
+	4096,
+	1024,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	8192,
+	4096,
+	1024,
+	4096,
+	4096,
+	2048,
+	1024,
+	1024,
+	4096,
+	256,
+	1024,
+	1024,
+	2048,
+	4096,
+	4096,
+	8192,
+	8192,
+	8192,
+	8192,
+	8192,
+	4096,
+	4096,
+	1024,
+	4096,
+	8192,
+	1024,
+	256,
+	8192,
+	4096,
+	1024,
+	256,
+	4096,
+	8192,
+	8192,
+	256,
+	1024,
+	1024,
+	4096,
+	256,
+	256,
+	4096,
+	8192,
+	4096,
+	4096,
+	4096,
+	256,
+	512,
+	256,
+	256,
+	256,
+	1024,
+	8192,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	4096,
+	8192,
+	2048,
+	8192,
+	2048,
+	256,
+	256,
+	1024,
+	256,
+	1024,
+	256,
+	2048,
+	1024,
+	1024,
+	8192,
+	4096,
+	1024,
+	8192,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	8192,
+	2048,
+	1024,
+	1024,
+	4096,
+	4096,
+	8192,
+	16384,
+	4096,
+	2048,
+	256,
+	1024,
+	2048,
+	4096,
+	524288,
+	262144,
+	262144,
+	1024,
+	512,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	512,
+	512,
+	512,
+	2048,
+	512,
+	256,
+	256,
+	512,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	512,
+	256,
+	512,
+	512,
+	512,
+	256,
+	256,
+	512,
+	1024,
+	256,
+	256,
+	256,
+	2048,
+	256,
+	2048,
+	512,
+	256,
+	256,
+	1024,
+	512,
+	2048,
+	512,
+	512,
+	256,
+	512,
+	512,
+	256,
+	512,
+	256,
+	512,
+	256,
+	2048,
+	1024,
+	256,
+	2048,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	1024,
+	512,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	512,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	1024,
+	512,
+	512,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	512,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	4096,
+	512,
+	256,
+	512,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	2048,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	1024,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	1024,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	1024,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	512,
+	1024,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	2048,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	2048,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	256,
+	512,
+	2048,
+	512,
+	1024,
+	256,
+	512,
+	256,
+	256,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	2048,
+	256,
+	512,
+	256,
+	256,
+	256,
+	4096,
+	512,
+	256,
+	256,
+	512,
+	256,
+	2048,
+	512,
+	256,
+	256,
+	1024,
+	256,
+	256,
+	2048,
+	512,
+	256,
+	256,
+	512,
+	2048,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	1024,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	2048,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	1024,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	2048,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	2048,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	512,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	2048,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	4096,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	2048,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	512,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	2048,
+	1024,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	512,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	2048,
+	512,
+	512,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	256,
+	4096,
+	512,
+	256,
+	256,
+	512,
+	256,
+	256,
+	256,
+	256,
+	256,
+	1024,
+	256,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	4096,
+	1024,
+	4096,
+	4096,
+	512,
+	4096,
+	256,
+	256,
+	1024,
+	2048,
+	4096,
+	2048,
+	4096,
+	1024,
+	512,
+	2048,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	2048,
+	4096,
+	8192,
+	8192,
+	4096,
+	4096,
+	8192,
+	256,
+	512,
+	8192,
+	8192,
+	1024,
+	2048,
+	256,
+	1024,
+	256,
+	1024,
+	1024,
+	1024,
+	8192,
+	8192,
+	8192,
+	8192,
+	4096,
+	2048,
+	1024,
+	256,
+	8192,
+	1024,
+	1024,
+	256,
+	256,
+	512,
+	1024,
+	4096,
+	8192,
+	16384,
+	2048,
+	1024,
+	256,
+	256,
+	512,
+	4096,
+	8192,
+	16384,
+	1024,
+	1024,
+	2048,
+	4096,
+	2048,
+	4096,
+	4096,
+	16384,
+	1024,
+	1024,
+	1024,
+	8192,
+	2048,
+	4096,
+	4096,
+	4096,
+	2048,
+	256,
+	256,
+	256,
+	4096,
+	8192,
+	4096,
+	4096,
+	8192,
+	8192,
+	32768,
+	8192,
+	4096,
+	512,
+	256,
+	1024,
+	1024,
+	1024,
+	1024,
+	1024,
+	8192,
+	256,
+	1024,
+	2048,
+	1024,
+	1024,
+	256,
+	256,
+	512,
+	1024,
+	2048,
+	32768,
+	256,
+	8192,
+	8192,
+	2048,
+	2048,
+	8192,
+	8192,
+	2048,
+	4096,
+	4096,
+	4096,
+	256,
+	8192,
+	8192,
+	8192,
+	16384,
+	4096,
+	1024,
+	512,
+	1024,
+	8192,
+	8192,
+	1024,
+	16384,
+	2048,
+	1024,
+	2048,
+	256,
+	8192,
+	1024,
+	256,
+	256,
+	8192,
+	8192,
+	1024,
+	8192,
+	512,
+	1024,
+	256,
+	4096,
+	256,
+	256,
+	256,
+	8192,
+	8192,
+	16384,
+	16384,
+	8192,
+	2048,
+	4096,
+	256,
+	8192,
+	512,
+	512,
+	1024,
+	8192,
+	1024,
+	1024,
+	1024,
+	4096,
+	256,
+	512,
+	256,
+	256,
+	256,
+	4096,
+	16384,
+	256,
+	2048,
+	2048,
+	8192,
+	8192,
+	2048,
+	8192,
+	2048,
+	32768,
+	2048,
+	2048,
+	1024,
+	256,
+	256,
+	1024,
+	8192,
+	32768,
+	4096,
+	2048,
+	1024,
+	1024,
+	4096,
+	4096,
+	16384,
+	2048,
+	2048,
+	4096,
+	8192,
+	4096,
+	1024,
+	8192,
+	8192,
+	4096,
+	4096,
+	2048,
+	1024,
+	4096,
+	4096,
+	2048,
+	4096,
+	4096,
+	8192,
+	2048,
+	4096,
+	4096,
+	1024,
+	1024,
+	16384,
+	16384,
+	16384,
+	16384,
+	16384,
+	16384,
+	32768,
+	8192,
+	4096,
+	8192,
+	8192,
+	8192,
+	8192,
+	8192,
+	8192,
+	8192,
+	8192,
+	16384,
+	1024,
+	16384,
+	32768,
+	32768,
+	65536,
+	8192,
+	65536,
+	131072,
+	262144,
+	262144,
+	262144,
+	524288,
+	65536,
+	16384,
+	16384,
+	32768,
+	32768,
+	32768,
+	8192,
+	32768,
+	8192,
+	8192,
+	16384,
+	8192,
+	8192,
+	16384,
+	32768,
+	8192,
+	8192,
+	8192,
+	8192,
+	8192,
+	8192,
+	16384,
+	65536,
+	8192,
+	8192,
+	16384,
+	32768,
+	65536,
+	8192,
+	8192,
+	16384,
+	8192,
+	8192,
+	16384,
+	16384,
+	8192,
+	131072,
+	4096,
+	4096,
+	8192,
+	16384,
+	8192,
+	262144,
+	131072,
+	131072,
+	65536,
+	65536,
+	65536,
+	65536,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	131072,
+	131072,
+	65536,
+	16384,
+	8192,
+	8192,
+	32768,
+	65536,
+	16384,
+	16384,
+	32768,
+	65536,
+	32768,
+	32768,
+	262144,
+	131072,
+	32768,
+	32768,
+	65536,
+	131072,
+	65536,
+	65536,
+	262144,
+	131072,
+	65536,
+	16384,
+	8192,
+	8192,
+	32768,
+	262144,
+	262144,
+	262144,
+	1024,
+	65536,
+	65536,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	65536,
+	65536,
+	65536,
+	65536,
+	131072,
+	262144,
+	65536,
+	32768,
+	32768,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	262144,
+	131072,
+	32768,
+	32768,
+	65536,
+	131072,
+	65536,
+	32768,
+	32768,
+	131072,
+	131072,
+	262144,
+	131072,
+	131072,
+	262144,
+	262144,
+	524288,
+	131072,
+	32768,
+	16384,
+	8192,
+	8192,
+	65536,
+	2048,
+	8192,
+	32768,
+	32768,
+	8192,
+	8192,
+	2048,
+	2048,
+	4096,
+	8192,
+	65536,
+	131072,
+	65536,
+	65536,
+	8192,
+	2048,
+	65536,
+	65536,
+	65536,
+	65536,
+	262144,
+	262144,
+	131072,
+	131072,
+	262144,
+	131072,
+	131072,
+	65536,
+	65536,
+	65536,
+	32768,
+	1024,
+	1024,
+	1024,
+	1048576,
+	262144,
+	65536,
+	32768,
+	16384,
+	16384,
+	8192,
+	8192,
+	8192,
+	4096,
+	4096,
+	32768,
+	8192,
+	8192,
+	16384,
+	32768,
+	131072,
+	131072,
+	131072,
+	32768,
+	32768,
+	16384,
+	16384,
+	32768,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	262144,
+	131072,
+	131072,
+	131072,
+	262144,
+	16384,
+	262144,
+	32768,
+	131072,
+	1024,
+	2097152,
+	131072,
+	131072,
+	262144,
+	524288,
+	16384,
+	32768,
+	16384,
+	65536,
+	131072,
+	2048,
+	262144,
+	65536,
+	131072,
+	65536,
+	32768,
+	32768,
+	65536,
+	32768,
+	32768,
+	65536,
+	8192,
+	8192,
+	8192,
+	8192,
+	32768,
+	131072,
+	65536,
+	32768,
+	16384,
+	8192,
+	8192,
+	32768,
+	16384,
+	16384,
+	8192,
+	8192,
+	32768,
+	131072,
+	131072,
+	32768,
+	65536,
+	131072,
+	8192,
+	65536,
+	65536,
+	262144,
+	524288,
+	131072,
+	65536,
+	65536,
+	131072,
+	65536,
+	8192,
+	4096,
+	4096,
+	16384,
+	16384,
+	4096,
+	8192,
+	262144,
+	131072,
+	65536,
+	16384,
+	16384,
+	32768,
+	262144,
+	65536,
+	65536,
+	131072,
+	524288,
+	524288,
+	262144,
+	131072,
+	65536,
+	32768,
+	32768,
+	131072,
+	131072,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	262144,
+	2097152,
+	524288,
+	131072,
+	65536,
+	65536,
+	262144,
+	131072,
+	65536,
+	32768,
+	32768,
+	65536,
+	32768,
+	32768,
+	131072,
+	131072,
+	131072,
+	262144,
+	65536,
+	32768,
+	262144,
+	262144,
+	524288,
+	131072,
+	65536,
+	8192,
+	8192,
+	16384,
+	32768,
+	131072,
+	131072,
+	32768,
+	32768,
+	65536,
+	131072,
+	524288,
+	524288,
+	262144,
+	131072,
+	65536,
+	65536,
+	262144,
+	131072,
+	131072,
+	524288,
+	131072,
+	65536,
+	65536,
+	131072,
+	131072,
+	524288,
+	65536,
+	32768,
+	8192,
+	4096,
+	4096,
+	16384,
+	131072,
+	131072,
+	262144,
+	524288,
+	131072,
+	1024,
+	1024,
+	1024,
+	2097152,
+	1048576,
+	262144,
+	131072,
+	524288,
+	131072,
+	1024,
+	1048576,
+	262144,
+	131072,
+	131072,
+	131072,
+	65536,
+	131072,
+	262144,
+	131072,
+	131072,
+	131072,
+	4096,
+	4096,
+	524288,
+	262144,
+	32768,
+	65536,
+	32768,
+	1024,
+	512,
+	}
diff --git a/chinaip_gen.go b/chinaip_gen.go
new file mode 100644
index 00000000..3f632b6d
--- /dev/null
+++ b/chinaip_gen.go
@@ -0,0 +1,84 @@
+// +build generate
+// go run chinaip_gen.go
+
+package main
+
+import (
+	"bufio"
+	"strconv"
+	"fmt"
+	"log"
+	"encoding/binary"
+	"net/http"
+	"os"
+	"strings"
+	"net"
+	"errors"
+)
+
+const (
+	apnicFile = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"
+)
+
+// ip to long int
+func ip2long(ipstr string) (uint32, error) {
+	ip := net.ParseIP(ipstr)
+	if ip == nil {
+		return 0, errors.New("Invalid IP")
+	}
+	ip = ip.To4()
+	if ip == nil {
+		return 0, errors.New("Not IPv4")
+	}
+	return binary.BigEndian.Uint32(ip), nil
+}
+
+func main() {
+	resp, err := http.Get(apnicFile)
+	if err != nil {
+		panic(err)
+	}
+	if resp.StatusCode != 200 {
+		panic(fmt.Errorf("Unexpected status %d", resp.StatusCode))
+	}
+	defer resp.Body.Close()
+	scanner := bufio.NewScanner(resp.Body)
+	
+	start_list := []string{}
+	count_list := []string{}
+
+	for scanner.Scan() {
+		line := scanner.Text()
+		line = strings.TrimSpace(line)
+		parts := strings.Split(line, "|")
+		if len(parts) < 5 {
+			continue
+		}
+		if strings.ToLower(parts[1]) != "cn" || strings.ToLower(parts[2]) != "ipv4" {
+			continue
+		}
+		ip := parts[3]
+		count := parts[4]
+		ipLong, err := ip2long(ip)
+		if err != nil {
+			panic(err)
+		}	
+		start_list = append(start_list, strconv.FormatUint(uint64(ipLong), 10))
+		count_list = append(count_list, count)
+	}
+
+	file, err := os.OpenFile("chinaip_data.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
+	if err != nil {
+		log.Fatalf("Failed to generate chinaip_data.go: %v", err)
+	}
+	defer file.Close()
+
+	fmt.Fprintln(file, "package main")
+	fmt.Fprint(file, "var CNIPDataStart = []uint32 {\n	")
+	fmt.Fprint(file, strings.Join(start_list, ",\n	"))
+	fmt.Fprintln(file, ",\n	}")
+
+	fmt.Fprint(file, "var CNIPDataNum = []uint{\n	")
+	fmt.Fprint(file, strings.Join(count_list, ",\n	"))
+	fmt.Fprintln(file, ",\n	}")
+}
diff --git a/chinaip_init.go b/chinaip_init.go
new file mode 100644
index 00000000..ce27f191
--- /dev/null
+++ b/chinaip_init.go
@@ -0,0 +1,25 @@
+package main
+
+// data range by first byte
+var CNIPDataRange [256]struct {
+	start int
+	end   int
+}
+
+func initCNIPData() {
+	n := len(CNIPDataStart)
+	var curr uint32 = 0
+	var preFirstByte uint32 = 0
+	for i := 0; i < n; i++ {
+		firstByte := CNIPDataStart[i] >> 24
+		if curr != firstByte {
+			curr = firstByte
+			if preFirstByte != 0 {
+				CNIPDataRange[preFirstByte].end = i - 1
+			}
+			CNIPDataRange[firstByte].start = i
+			preFirstByte = firstByte
+		}
+	}
+	CNIPDataRange[preFirstByte].end = n - 1
+}
diff --git a/config.go b/config.go
index 3e7a11ba..0705e1de 100644
--- a/config.go
+++ b/config.go
@@ -4,7 +4,6 @@ import (
 	"errors"
 	"flag"
 	"fmt"
-	"github.com/cyfdecyf/bufio"
 	"net"
 	"os"
 	"path"
@@ -12,11 +11,13 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/cyfdecyf/bufio"
 )
 
 const (
-	version           = "0.9.3"
-	defaultListenAddr = "127.0.0.1:7777"
+	version           = "1.5"
+	defaultListenAddr = "127.0.0.1:4411"
 )
 
 type LoadBalanceMode byte
@@ -27,23 +28,11 @@ const (
 	loadBalanceLatency
 )
 
-// allow the same tunnel ports as polipo
-var defaultTunnelAllowedPort = []string{
-	"22", "80", "443", // ssh, http, https
-	"873",                      // rsync
-	"143", "220", "585", "993", // imap, imap3, imap4-ssl, imaps
-	"109", "110", "473", "995", // pop2, pop3, hybrid-pop, pop3s
-	"5222", "5269", // jabber-client, jabber-server
-	"2401", "3690", "9418", // cvspserver, svn, git
-}
-
 type Config struct {
 	RcFile      string // config file
-	LogFile     string
-	AlwaysProxy bool
-	LoadBalance LoadBalanceMode
-
-	TunnelAllowedPort map[string]bool // allowed ports to create tunnel
+	LogFile     string // path for log file
+	JudgeByIP   bool
+	LoadBalance LoadBalanceMode // select load balance mode
 
 	SshServer []string
 
@@ -57,52 +46,40 @@ type Config struct {
 	DialTimeout time.Duration
 	ReadTimeout time.Duration
 
-	Core         int
-	DetectSSLErr bool
+	Core int
 
 	HttpErrorCode int
 
+	dir        string // directory containing config file
+	DirectFile string // direct sites specified by user
+	ProxyFile  string // sites using proxy specified by user
+	RejectFile string
+
 	// not configurable in config file
 	PrintVer        bool
-	EstimateTimeout bool // if run estimateTimeout()
 
 	// not config option
-	saveReqLine bool // for http and cow parent, should save request line from client
+	saveReqLine bool // for http and meow parent, should save request line from client
+	Cert        string
+	Key         string
 }
 
 var config Config
 var configNeedUpgrade bool // whether should upgrade config file
 
-var configPath struct {
-	dir           string // directory containing config file and blocked site list
-	alwaysBlocked string // blocked sites specified by user
-	alwaysDirect  string // direct sites specified by user
-	stat          string // site visit statistics
-}
-
 func printVersion() {
-	fmt.Println("cow version", version)
+	fmt.Println("MEOW version", version)
 }
 
-func init() {
-	initConfigDir()
-	// fmt.Println("home dir:", homeDir)
-
-	configPath.alwaysBlocked = path.Join(configPath.dir, alwaysBlockedFname)
-	configPath.alwaysDirect = path.Join(configPath.dir, alwaysDirectFname)
-	configPath.stat = path.Join(configPath.dir, statFname)
+func initConfig(rcFile string) {
+	config.dir = path.Dir(rcFile)
+	config.DirectFile = path.Join(config.dir, directFname)
+	config.ProxyFile = path.Join(config.dir, proxyFname)
+	config.RejectFile = path.Join(config.dir, rejectFname)
 
-	config.DetectSSLErr = false
-	config.AlwaysProxy = false
+	config.JudgeByIP = true
 
 	config.AuthTimeout = 2 * time.Hour
-	config.DialTimeout = defaultDialTimeout
-	config.ReadTimeout = defaultReadTimeout
-
-	config.TunnelAllowedPort = make(map[string]bool)
-	for _, port := range defaultTunnelAllowedPort {
-		config.TunnelAllowedPort[port] = true
-	}
 }
 
 // Whether command line options specifies listen addr
@@ -112,15 +89,30 @@ func parseCmdLineConfig() *Config {
 	var c Config
 	var listenAddr string
 
-	flag.StringVar(&c.RcFile, "rc", path.Join(configPath.dir, rcFname), "configuration file")
+	flag.StringVar(&c.RcFile, "rc", "", "config file, defaults to $HOME/.meow/rc on Unix, ./rc.txt on Windows")
 	// Specifying listen default value to StringVar would override config file options
 	flag.StringVar(&listenAddr, "listen", "", "listen address, disables listen in config")
 	flag.IntVar(&c.Core, "core", 2, "number of cores to use")
 	flag.StringVar(&c.LogFile, "logFile", "", "write output to file")
 	flag.BoolVar(&c.PrintVer, "version", false, "print version")
-	flag.BoolVar(&c.EstimateTimeout, "estimate", true, "enable/disable estimate timeout")
+	flag.StringVar(&c.Cert, "cert", "", "cert for local https proxy")
+	flag.StringVar(&c.Key, "key", "", "key for local https proxy")
 
 	flag.Parse()
+
+	if c.RcFile == "" {
+		c.RcFile = getDefaultRcFile()
+	} else {
+		c.RcFile = expandTilde(c.RcFile)
+	}
+	if err := isFileExists(c.RcFile); err != nil {
+		Fatal("fail to get config file:", err)
+	}
+	initConfig(c.RcFile)
+	initDomainList(config.DirectFile, domainTypeDirect)
+	initDomainList(config.ProxyFile, domainTypeProxy)
+	initDomainList(config.RejectFile, domainTypeReject)
+
 	if listenAddr != "" {
 		configParser{}.ParseListen(listenAddr)
 		cmdHasListenAddr = true // must come after parse
@@ -182,14 +174,12 @@ func (p proxyParser) ProxySocks5(val string) {
 func (pp proxyParser) ProxyHttp(val string) {
 	var userPasswd, server string
 
-	arr := strings.Split(val, "@")
-	if len(arr) == 1 {
-		server = arr[0]
-	} else if len(arr) == 2 {
-		userPasswd = arr[0]
-		server = arr[1]
+	idx := strings.LastIndex(val, "@")
+	if idx == -1 {
+		server = val
 	} else {
-		Fatal("http parent proxy contains more than one @:", val)
+		userPasswd = val[:idx]
+		server = val[idx+1:]
 	}
 
 	if err := checkServerAddr(server); err != nil {
@@ -203,6 +193,28 @@ func (pp proxyParser) ProxyHttp(val string) {
 	parentProxy.add(parent)
 }
 
+func (pp proxyParser) ProxyHttps(val string) {
+	var userPasswd, server string
+
+	idx := strings.LastIndex(val, "@")
+	if idx == -1 {
+		server = val
+	} else {
+		userPasswd = val[:idx]
+		server = val[idx+1:]
+	}
+
+	if err := checkServerAddr(server); err != nil {
+		Fatal("parent http server", err)
+	}
+
+	config.saveReqLine = true
+
+	parent := newHttpsParent(server)
+	parent.initAuth(userPasswd)
+	parentProxy.add(parent)
+}
+
 // Parse method:passwd@server:port
 func parseMethodPasswdServer(val string) (method, passwd, server string, err error) {
 	// Use the right-most @ symbol to seperate method:passwd and server:port.
@@ -240,31 +252,32 @@ func (pp proxyParser) ProxySs(val string) {
 	parentProxy.add(parent)
 }
 
-func (pp proxyParser) ProxyCow(val string) {
+func (pp proxyParser) ProxyMeow(val string) {
 	method, passwd, server, err := parseMethodPasswdServer(val)
 	if err != nil {
-		Fatal("cow parent", err)
+		Fatal("meow parent", err)
 	}
 
 	if err := checkServerAddr(server); err != nil {
-		Fatal("parent cow server", err)
+		Fatal("parent meow server", err)
 	}
 
 	config.saveReqLine = true
-	parent := newCowParent(server, method, passwd)
+	parent := newMeowParent(server, method, passwd)
 	parentProxy.add(parent)
 }
 
 // listenParser provides functions to parse different types of listen addresses
 type listenParser struct{}
 
-func (lp listenParser) ListenHttp(val string) {
+func (lp listenParser) ListenHttp(val string, proto string) {
 	if cmdHasListenAddr {
 		return
 	}
+
 	arr := strings.Fields(val)
 	if len(arr) > 2 {
-		Fatal("too many fields in listen = http://", val)
+		Fatal("too many fields in listen =", proto, val)
 	}
 
 	var addr, addrInPAC string
@@ -274,20 +287,20 @@ func (lp listenParser) ListenHttp(val string) {
 	}
 
 	if err := checkServerAddr(addr); err != nil {
-		Fatal("listen http server", err)
+		Fatal("listen", proto, "server", err)
 	}
-	addListenProxy(newHttpProxy(addr, addrInPAC))
+	addListenProxy(newHttpProxy(addr, addrInPAC, proto))
 }
 
-func (lp listenParser) ListenCow(val string) {
+func (lp listenParser) ListenMeow(val string) {
 	if cmdHasListenAddr {
 		return
 	}
 	method, passwd, addr, err := parseMethodPasswdServer(val)
 	if err != nil {
-		Fatal("listen cow", err)
+		Fatal("listen meow", err)
 	}
-	addListenProxy(newCowProxy(method, passwd, addr))
+	addListenProxy(newMeowProxy(method, passwd, addr))
 }
 
 // configParser provides functions to parse options in config file.
@@ -332,16 +345,22 @@ func (p configParser) ParseListen(val string) {
 	}
 
 	methodName := "Listen" + strings.ToUpper(protocol[0:1]) + protocol[1:]
+	if methodName == "ListenHttps" {
+		methodName = "ListenHttp"
+	}
 	method := parser.MethodByName(methodName)
 	if method == zeroMethod {
 		Fatalf("no such listen protocol \"%s\"\n", arr[0])
 	}
-	args := []reflect.Value{reflect.ValueOf(server)}
-	method.Call(args)
+	if methodName == "ListenMeow" {
+		method.Call([]reflect.Value{reflect.ValueOf(server)})
+	} else {
+		method.Call([]reflect.Value{reflect.ValueOf(server), reflect.ValueOf(protocol)})
+	}
 }
 
 func (p configParser) ParseLogFile(val string) {
-	config.LogFile = val
+	config.LogFile = expandTilde(val)
 }
 
 func (p configParser) ParseAddrInPAC(val string) {
@@ -367,17 +386,6 @@ func (p configParser) ParseAddrInPAC(val string) {
 	}
 }
 
-func (p configParser) ParseTunnelAllowedPort(val string) {
-	arr := strings.Split(val, ",")
-	for _, s := range arr {
-		s = strings.TrimSpace(s)
-		if _, err := strconv.Atoi(s); err != nil {
-			Fatal("tunnel allowed ports", err)
-		}
-		config.TunnelAllowedPort[s] = true
-	}
-}
-
 func (p configParser) ParseSocksParent(val string) {
 	var pp proxyParser
 	pp.ProxySocks5(val)
@@ -428,10 +436,6 @@ func (p configParser) ParseHttpUserPasswd(val string) {
 	http.passwdCnt++
 }
 
-func (p configParser) ParseAlwaysProxy(val string) {
-	config.AlwaysProxy = parseBool(val, "alwaysProxy")
-}
-
 func (p configParser) ParseLoadBalance(val string) {
 	switch val {
 	case "backup":
@@ -445,6 +449,20 @@ func (p configParser) ParseLoadBalance(val string) {
 	}
 }
 
+func (p configParser) ParseDirectFile(val string) {
+	config.DirectFile = expandTilde(val)
+	if err := isFileExists(config.DirectFile); err != nil {
+		Fatal("direct file:", err)
+	}
+}
+
+func (p configParser) ParseProxyFile(val string) {
+	config.ProxyFile = expandTilde(val)
+	if err := isFileExists(config.ProxyFile); err != nil {
+		Fatal("proxy file:", err)
+	}
+}
+
 var shadow struct {
 	parent *shadowsocksParent
 	passwd string
@@ -522,12 +540,9 @@ func (p configParser) ParseUserPasswd(val string) {
 }
 
 func (p configParser) ParseUserPasswdFile(val string) {
-	exist, err := isFileExists(val)
+	err := isFileExists(val)
 	if err != nil {
-		Fatal("userPasswdFile error:", err)
-	}
-	if !exist {
-		Fatal("userPasswdFile", val, "does not exist")
+		Fatal("userPasswdFile:", err)
 	}
 	config.UserPasswdFile = val
 }
@@ -556,8 +571,16 @@ func (p configParser) ParseDialTimeout(val string) {
 	config.DialTimeout = parseDuration(val, "dialTimeout")
 }
 
-func (p configParser) ParseDetectSSLErr(val string) {
-	config.DetectSSLErr = parseBool(val, "detectSSLErr")
+func (p configParser) ParseJudgeByIP(val string) {
+	config.JudgeByIP = parseBool(val, "judgeByIP")
+}
+
+func (p configParser) ParseCert(val string) {
+	config.Cert = val
+}
+
+func (p configParser) ParseKey(val string) {
+	config.Key = val
 }
 
 // overrideConfig should contain options from command line to override options
@@ -566,12 +589,7 @@ func parseConfig(rc string, override *Config) {
 	// fmt.Println("rcFile:", path)
 	f, err := os.Open(expandTilde(rc))
 	if err != nil {
-		if os.IsNotExist(err) {
-			fmt.Printf("Config file %s not found, using default options\n", rc)
-		} else {
-			fmt.Println("Error opening config file:", err)
-		}
-		return
+		Fatal("Error opening config file:", err)
 	}
 
 	IgnoreUTF8BOM(f)
@@ -709,8 +727,6 @@ func overrideConfig(oldconfig, override *Config) {
 			}
 		}
 	}
-
-	oldconfig.EstimateTimeout = override.EstimateTimeout
 }
 
 // Must call checkConfig before using config.
@@ -718,24 +734,6 @@ func checkConfig() {
 	checkShadowsocks()
 	// listenAddr must be handled first, as addrInPAC dependends on this.
 	if listenProxy == nil {
-		listenProxy = []Proxy{newHttpProxy(defaultListenAddr, "")}
+		listenProxy = []Proxy{newHttpProxy(defaultListenAddr, "", "http")}
 	}
 }
-
-func mkConfigDir() (err error) {
-	if configPath.dir == "" {
-		return os.ErrNotExist
-	}
-	exists, err := isDirExists(configPath.dir)
-	if err != nil {
-		errl.Printf("Error checking config directory: %v\n", err)
-		return
-	}
-	if exists {
-		return
-	}
-	if err = os.Mkdir(configPath.dir, 0755); err != nil {
-		errl.Printf("Error create config directory %s: %v\n", configPath.dir, err)
-	}
-	return
-}
diff --git a/config_test.go b/config_test.go
index 42355577..fe30a137 100644
--- a/config_test.go
+++ b/config_test.go
@@ -23,35 +23,6 @@ func TestParseListen(t *testing.T) {
 	}
 }
 
-func TestTunnelAllowedPort(t *testing.T) {
-	parser := configParser{}
-	parser.ParseTunnelAllowedPort("1, 2, 3, 4, 5")
-	parser.ParseTunnelAllowedPort("6")
-	parser.ParseTunnelAllowedPort("7")
-	parser.ParseTunnelAllowedPort("8")
-
-	testData := []struct {
-		port    string
-		allowed bool
-	}{
-		{"80", true}, // default allowd ports
-		{"443", true},
-		{"1", true},
-		{"3", true},
-		{"5", true},
-		{"7", true},
-		{"8080", false},
-		{"8388", false},
-	}
-
-	for _, td := range testData {
-		allowed := config.TunnelAllowedPort[td.port]
-		if allowed != td.allowed {
-			t.Errorf("port %s allowed %v, got %v\n", td.port, td.allowed, allowed)
-		}
-	}
-}
-
 func TestParseProxy(t *testing.T) {
 	pool, ok := parentProxy.(*backupParentPool)
 	if !ok {
diff --git a/config_unix.go b/config_unix.go
index 6ff78cde..003ce798 100644
--- a/config_unix.go
+++ b/config_unix.go
@@ -7,15 +7,14 @@ import (
 )
 
 const (
-	rcFname            = "rc"
-	alwaysBlockedFname = "blocked"
-	alwaysDirectFname  = "direct"
-	statFname          = "stat"
+	rcFname      = "rc"
+	directFname  = "direct"
+	proxyFname   = "proxy"
+	rejectFname  = "reject"
 
 	newLine = "\n"
 )
 
-func initConfigDir() {
-	home := getUserHomeDir()
-	configPath.dir = path.Join(home, ".cow")
+func getDefaultRcFile() string {
+	return path.Join(path.Join(getUserHomeDir(), ".meow", rcFname))
 }
diff --git a/config_windows.go b/config_windows.go
index 98f8d16a..07f0deae 100644
--- a/config_windows.go
+++ b/config_windows.go
@@ -6,16 +6,16 @@ import (
 )
 
 const (
-	rcFname            = "rc.txt"
-	alwaysBlockedFname = "blocked.txt"
-	alwaysDirectFname  = "direct.txt"
-	statFname          = "stat.txt"
+	rcFname      = "rc.txt"
+	directFname  = "direct.txt"
+	proxyFname   = "proxy.txt"
+	rejectFname  = "reject.txt"
 
 	newLine = "\r\n"
 )
 
-func initConfigDir() {
-	// On windows, put the configuration file in the same directory of cow executable
+func getDefaultRcFile() string {
+	// On windows, put the configuration file in the same directory of meow executable
 	// This is not a reliable way to detect binary directory, but it works for double click and run
-	configPath.dir = path.Dir(os.Args[0])
+	return path.Join(path.Dir(os.Args[0]), rcFname)
 }
diff --git a/conn_pool.go b/conn_pool.go
index b09cfe1a..3506915e 100644
--- a/conn_pool.go
+++ b/conn_pool.go
@@ -60,7 +60,7 @@ func putConnToChan(sv *serverConn, ch chan *serverConn, chname string) {
 	}
 }
 
-func (cp *ConnPool) Get(hostPort string, asDirect bool) (sv *serverConn) {
+func (cp *ConnPool) Get(hostPort string, direct bool) (sv *serverConn) {
 	// Get from site specific connection first.
 	// Direct connection are all site specific, so must use site specific
 	// first to avoid using parent proxy for direct sites.
@@ -78,7 +78,7 @@ func (cp *ConnPool) Get(hostPort string, asDirect bool) (sv *serverConn) {
 
 	// All mulplexing connections are for blocked sites,
 	// so for direct sites we should stop here.
-	if asDirect && !config.AlwaysProxy {
+	if direct {
 		return nil
 	}
 
@@ -92,7 +92,7 @@ func (cp *ConnPool) Get(hostPort string, asDirect bool) (sv *serverConn) {
 func (cp *ConnPool) Put(sv *serverConn) {
 	// Multiplexing connections.
 	switch sv.Conn.(type) {
-	case httpConn, cowConn:
+	case httpConn, meowConn:
 		putConnToChan(sv, cp.muxConn, "muxConn")
 		return
 	}
diff --git a/directip.go b/directip.go
new file mode 100644
index 00000000..c0f47a7f
--- /dev/null
+++ b/directip.go
@@ -0,0 +1,30 @@
+package main
+
+func ipShouldDirect(ip string) (direct bool) {
+	direct = false
+	defer func() {
+		if r := recover(); r != nil {
+			errl.Printf("error judging ip should direct: %s", ip)
+		}
+	}()
+	_, isPrivate := hostIsIP(ip)
+	if isPrivate {
+		return true
+	}
+	ipLong, err := ip2long(ip)
+	if err != nil {
+		return false
+	}
+	if ipLong == 0 {
+		return true
+	}
+	firstByte := ipLong >> 24
+	if CNIPDataRange[firstByte].end == 0 {
+		return false
+	}
+	ipIndex := searchRange(CNIPDataRange[firstByte].start, CNIPDataRange[firstByte].end, func(i int) bool {
+		return CNIPDataStart[i] > ipLong
+	})
+	ipIndex--
+	return ipLong <= CNIPDataStart[ipIndex]+(uint32)(CNIPDataNum[ipIndex])
+}
diff --git a/directip_test.go b/directip_test.go
new file mode 100644
index 00000000..1740119e
--- /dev/null
+++ b/directip_test.go
@@ -0,0 +1,50 @@
+package main
+
+import (
+	"net"
+	"testing"
+)
+
+func TestIPShouldDirect(t *testing.T) {
+
+	initCNIPData()
+
+	blockedIPDomains := []string{
+		"youtube.com",
+		"twitter.com",
+	}
+	for _, domain := range blockedIPDomains {
+		hostIPs, err := net.LookupIP(domain)
+
+		if err != nil {
+			continue
+		}
+
+		var ip string
+		ip = hostIPs[0].String()
+
+		if ipShouldDirect(ip) {
+			t.Errorf("ip %s should be considered using proxy, domain: %s", ip, domain)
+		}
+	}
+
+	directIPDomains := []string{
+		"baidu.com",
+		"www.ahut.edu.cn",
+	}
+	for _, domain := range directIPDomains {
+		hostIPs, err := net.LookupIP(domain)
+
+		if err != nil {
+			continue
+		}
+
+		var ip string
+		ip = hostIPs[0].String()
+
+		if !ipShouldDirect(ip) {
+			t.Errorf("ip %s should be considered using direct, domain: %s", ip, domain)
+		}
+	}
+
+}
diff --git a/directlist.go b/directlist.go
new file mode 100644
index 00000000..41f24463
--- /dev/null
+++ b/directlist.go
@@ -0,0 +1,126 @@
+package main
+
+import (
+	"github.com/cyfdecyf/bufio"
+	"net"
+	"os"
+	"strings"
+	"sync"
+)
+
+type DomainList struct {
+	Domain map[string]DomainType
+	sync.RWMutex
+}
+
+type DomainType byte
+
+const (
+	domainTypeUnknown DomainType = iota
+	domainTypeDirect
+	domainTypeProxy
+	domainTypeReject
+)
+
+func newDomainList() *DomainList {
+	return &DomainList{
+		Domain: map[string]DomainType{},
+	}
+}
+
+func (domainList *DomainList) judge(url *URL) (domainType DomainType) {
+	debug.Printf("judging host: %s", url.Host)
+	if domainList.Domain[url.Host] == domainTypeReject || domainList.Domain[url.Domain] == domainTypeReject {
+		debug.Printf("host or domain should reject")
+		return domainTypeReject
+	}
+	if parentProxy.empty() { // no way to retry, so always visit directly
+		return domainTypeDirect
+	}
+	if url.Domain == "" { // simple host or private ip
+		return domainTypeDirect
+	}
+	if domainList.Domain[url.Host] == domainTypeDirect || domainList.Domain[url.Domain] == domainTypeDirect {
+		debug.Printf("host or domain should direct")
+		return domainTypeDirect
+	}
+	if domainList.Domain[url.Host] == domainTypeProxy || domainList.Domain[url.Domain] == domainTypeProxy {
+		debug.Printf("host or domain should using proxy")
+		return domainTypeProxy
+	}
+
+	if !config.JudgeByIP {
+		return domainTypeProxy
+	}
+
+	var ip string
+	isIP, isPrivate := hostIsIP(url.Host)
+	if isIP {
+		if isPrivate {
+			domainList.add(url.Host, domainTypeDirect)
+			return domainTypeDirect
+		}
+		ip = url.Host
+	} else {
+		hostIPs, err := net.LookupIP(url.Host)
+		if err != nil {
+			errl.Printf("error looking up host ip %s, err %s", url.Host, err)
+			return domainTypeProxy
+		}
+		ip = hostIPs[0].String()
+	}
+
+	if ipShouldDirect(ip) {
+		domainList.add(url.Host, domainTypeDirect)
+		return domainTypeDirect
+	} else {
+		domainList.add(url.Host, domainTypeProxy)
+		return domainTypeProxy
+	}
+}
+
+func (domainList *DomainList) add(host string, domainType DomainType) {
+	domainList.Lock()
+	defer domainList.Unlock()
+	domainList.Domain[host] = domainType
+}
+
+func (domainList *DomainList) GetDomainList() []string {
+	lst := make([]string, 0)
+	for site, domainType := range domainList.Domain {
+		if domainType == domainTypeDirect {
+			lst = append(lst, site)
+		}
+	}
+	return lst
+}
+
+var domainList = newDomainList()
+
+func initDomainList(domainListFile string, domainType DomainType) {
+	var err error
+	if err = isFileExists(domainListFile); err != nil {
+		return
+	}
+	f, err := os.Open(domainListFile)
+	if err != nil {
+		errl.Println("Error opening domain list:", err)
+		return
+	}
+	defer f.Close()
+
+	domainList.Lock()
+	defer domainList.Unlock()
+	scanner := bufio.NewScanner(f)
+	for scanner.Scan() {
+		domain := strings.TrimSpace(scanner.Text())
+		if domain == "" {
+			continue
+		}
+		debug.Printf("Loaded domain %s as type %v", domain, domainType)
+		domainList.Domain[domain] = domainType
+	}
+	if scanner.Err() != nil {
+		errl.Printf("Error reading domain list %s: %v\n", domainListFile, scanner.Err())
+	}
+}
diff --git a/directlist_test.go b/directlist_test.go
new file mode 100644
index 00000000..1b0407f1
--- /dev/null
+++ b/directlist_test.go
@@ -0,0 +1,31 @@
+package main
+
+import (
+	"testing"
+)
+
+func Testjudge(t *testing.T) {
+	domainList := newDomainList()
+
+	domainList.Domain["com.cn"] = domainTypeDirect
+	domainList.Domain["edu.cn"] = domainTypeDirect
+	domainList.Domain["baidu.com"] = domainTypeDirect
+
+	g, _ := ParseRequestURI("gtemp.com")
+	if domainList.judge(g) == domainTypeProxy {
+		t.Error("never visited site should be considered using proxy")
+	}
+
+	directDomains := []string{
+		"baidu.com",
+		"www.baidu.com",
+		"www.ahut.edu.cn",
+	}
+	for _, domain := range directDomains {
+		url, _ := ParseRequestURI(domain)
+		if domainList.judge(url) == domainTypeDirect {
+			t.Errorf("domain %s in direct list should be considered using direct, host: %s", domain, url.Host)
+		}
+	}
+
+}
diff --git a/doc/implementation.md b/doc/implementation.md
index 8ef94c34..aa9639af 100644
--- a/doc/implementation.md
+++ b/doc/implementation.md
@@ -6,9 +6,9 @@
 
 The final design is evolved from different previous implementations. The other subsections following this one describe how its evolved.
 
-COW uses separate goroutines to read client requests and server responses.
+meow uses separate goroutines to read client requests and server responses.
 
-- For each client, COW will create one *request goroutine* to
+- For each client, meow will create one *request goroutine* to
   - accept client request (read from client connection)
   - create connection if no one not exist
   - send request to the server (write to server connection)
@@ -18,9 +18,9 @@ COW uses separate goroutines to read client requests and server responses.
 
 One client must have one request goroutine, and may have multiple response goroutine. Response goroutine is created when the server connection is created.
 
-This makes it possible for COW to support HTTP pipeline. (Not very sure about this.) COW does not pack multiple requests and send in batch, but it can send request before previous request response is received. If the client (browser) and the web server supports HTTP pipeline, then COW will not in effect make them go back to wating response for each request.
+This makes it possible for meow to support HTTP pipeline. (Not very sure about this.) meow does not pack multiple requests and send in batch, but it can send request before previous request response is received. If the client (browser) and the web server supports HTTP pipeline, then meow will not in effect make them go back to wating response for each request.
 
-But this design does make COW more complicated. I must be careful to avoid concurrency problems between the request and response goroutine.
+But this design does make meow more complicated. I must be careful to avoid concurrency problems between the request and response goroutine.
 
 Here's things that worth noting:
 
diff --git a/doc/logrotate.d/cow b/doc/logrotate.d/cow
deleted file mode 100644
index 00cfbbfa..00000000
--- a/doc/logrotate.d/cow
+++ /dev/null
@@ -1,9 +0,0 @@
-/var/log/cow {
-  rotate 4
-  weekly
-  compress
-  missingok
-  postrotate
-    /etc/init.d/cow restart
-  endscript
-}
diff --git a/doc/osx/info.chenyufei.cow.plist b/doc/osx/net.ohrz.meow.plist
similarity index 69%
rename from doc/osx/info.chenyufei.cow.plist
rename to doc/osx/net.ohrz.meow.plist
index b9915c06..caf8815b 100644
--- a/doc/osx/info.chenyufei.cow.plist
+++ b/doc/osx/net.ohrz.meow.plist
@@ -3,10 +3,10 @@
 <plist version="1.0">
   <dict>
     <key>Label</key>
-    <string>info.chenyufei.cow</string>
+    <string>net.ohrz.meow</string>
     <key>ProgramArguments</key>
     <array>
-	<string>COWBINARY</string>
+	<string>MEOWBINARY</string>
     </array>
     <key>KeepAlive</key>
     <dict>
@@ -15,5 +15,10 @@
     </dict>
     <key>RunAtLoad</key>
     <true/>
+    <key>SoftResourceLimits</key>
+    <dict>
+      <key>NumberOfFiles</key>
+      <integer>20480</integer>
+    </dict>
   </dict>
 </plist>
diff --git a/doc/sample-config/check_direct.py b/doc/sample-config/check_direct.py
new file mode 100644
index 00000000..877edc23
--- /dev/null
+++ b/doc/sample-config/check_direct.py
@@ -0,0 +1,29 @@
+import os
+import subprocess
+
+directlist = open('direct').read().splitlines()
+
+direct_cn = open('direct_cn', 'w')
+direct_ok = open('direct_ok', 'w')
+direct_fail = open('direct_fail', 'w')
+
+
+for domain in directlist:
+    if domain.endswith('.cn'):
+        direct_cn.write(domain + '\n')
+        print domain + ': cn'
+    else:
+        p = subprocess.Popen(['ping', domain], stdout=subprocess.PIPE)
+        streamdata = p.communicate()[0]
+        ret = p.returncode
+        #ret = os.system('ping {}'.format(domain))
+        if ret == 0:
+            direct_ok.write(domain + '\n')
+            print domain + ': ok'
+        else:
+            direct_fail.write(domain + '\n')
+            print domain + ': fail'
+            
+direct_cn.close()
+direct_ok.close()
+direct_fail.close()
diff --git a/doc/sample-config/direct b/doc/sample-config/direct
new file mode 100644
index 00000000..2f03b902
--- /dev/null
+++ b/doc/sample-config/direct
@@ -0,0 +1,431 @@
+com.cn
+edu.cn
+org.cn
+net.cn
+gov.cn
+weibo.cn
+sina.cn
+tbcdn.cn
+sinajs.cn
+amazon.cn
+360.cn
+flyme.cn
+mtime.cn
+12306.cn
+ifanr.cn
+kuwo.cn
+domob.cn
+kuaipan.cn
+3g.cn
+sinaimg.cn
+tianya.cn
+url.cn
+blued.cn
+189.cn
+10086.cn
+10010.cn
+uc.cn
+damai.cn
+suning.cn
+alimama.cn
+liebao.cn
+mifile.cn
+voicecloud.cn
+wps.cn
+8684.cn
+uniqlo.cn
+bbwc.cn
+3.cn
+maxthon.cn
+xda.cn
+cntv.cn
+6.cn
+meizu.cn
+360doc.cn
+sto.cn
+xiaomi.cn
+ccb.cn
+macx.cn
+d.cn
+m1905.cn
+t.cn
+sh.cn
+bong.cn
+mafengwo.cn
+ucloud.cn
+xdf.cn
+china.cn
+ip.cn
+news.cn
+linux.cn
+dict.cn
+windowsazure.cn
+dwz.cn
+10010.com
+115.com
+123u.com
+126.com
+126.net
+163.com
+17173.com
+178.com
+17cdn.com
+21cn.com
+2288.org
+3322.org
+360buy.com
+360buyimg.com
+360doc.com
+360safe.com
+36kr.com
+400gb.com
+4399.com
+51.la
+51buy.com
+51cto.com
+51job.com
+51jobcdn.com
+5d6d.com
+5d6d.net
+61.com
+6600.org
+6rooms.com
+7766.org
+7k7k.com
+8800.org
+8866.org
+90g.org
+91.com
+9966.org
+acfun.tv
+aicdn.com
+ali213.net
+alibaba.com
+alicdn.com
+aliexpress.com
+aliimg.com
+alikunlun.com
+alimama.com
+alipay.com
+alipayobjects.com
+alisoft.com
+aliyun.com
+aliyuncdn.com
+aliyuncs.com
+anzhi.com
+appinn.com
+appdownload.itunes.apple.com
+apple.com
+appsina.com
+archlinuxcn.org
+atpanel.com
+baidu.com
+baidupcs.com
+baidustatic.com
+baifendian.com
+baihe.com
+baixing.com
+bdimg.com
+bdstatic.com
+bilibili.tv
+blogbus.com
+blueidea.com
+ccb.com
+cctv.com
+cctvpic.com
+cdn20.com
+china.com
+chinabyte.com
+chinacache.com
+chinacache.net
+chinacaipu.com
+chinagba.com
+chinahr.com
+chinajoy.net
+chinamobile.com
+chinanetcenter.com
+chinanews.com
+chinapnr.com
+chinaren.com
+chinaspeeds.net
+chinaunix.net
+chinaz.com
+chint.com
+chiphell.com
+chuangxin.com
+ci123.com
+ciku5.com
+citysbs.com
+class.coursera.org
+cloudcdn.net
+cmbchina.com
+cmfu.com
+cmread.com
+cmwb.com
+cn.archive.ubuntu.com
+cn.bing.com
+cn.coremetrics.com
+cn.debian.org
+cn.msn.com
+cn
+cnak2.englishtown.com
+cnbeta.com
+cnbetacdn.com
+cnblogs.com
+cnepub.com
+cnzz.com
+comsenz.com
+csdn.net
+ct10000.com
+ctdisk.com
+dangdang.com
+dbank.com
+dedecms.com
+diandian.com
+dianping.com
+discuz.com
+discuz.net
+docin.com
+donews.com
+dospy.com
+douban.com
+douban.fm
+duapp.com
+duba.net
+duomi.com
+duote.com
+duowan.com
+egou.com
+et8.org
+etao.com
+f3322.org
+fantong.com
+fenzhi.com
+fhldns.com
+ganji.com
+gaopeng.com
+geekpark.net
+gfan.com
+gtimg.com
+hacdn.net
+hadns.net
+hao123.com
+hao123img.com
+hc360.com
+hdslb.com
+hexun.com
+hiapk.com
+hichina.com
+hoopchina.com
+huanqiu.com
+hudong.com
+huochepiao.com
+hupu.com
+iask.com
+iciba.com
+idqqimg.com
+ifanr.com
+ifeng.com
+ifengimg.com
+ijinshan.com
+iqiyi.com
+it168.com
+itcpn.net
+iteye.com
+itouzi.com
+jandan.net
+jd.com
+jiashule.com
+jiasule.com
+jiathis.com
+jiayuan.com
+jiepang.com
+jing.fm
+jobbole.com
+jstv.com
+jumei.com
+kaixin001.com
+kandian.com
+kandian.net
+kanimg.com
+kankanews.com
+kdnet.net
+koudai8.com
+ku6.com
+ku6cdn.com
+ku6img.com
+kuaidi100.com
+kugou.com
+lashou.com
+letao.com
+letv.com
+lietou.com
+linezing.com
+loli.mg
+loli.vg
+lvping.com
+lxdns.com
+mangocity.com
+mapbar.com
+mcbbs.net
+mediav.com
+meilishuo.com
+meituan.com
+meituan.net
+meizu.com
+microsoft.com
+miui.com
+moe123.com
+moegirl.org
+mop.com
+mtime.com
+my-card.in
+mydrivers.com
+mzstatic.com
+netease.com
+newsmth.net
+ngacn.cc
+nuomi.com
+okbuy.com
+optaim.com
+oschina.net
+paipai.com
+pcbeta.com
+pchome.net
+pcpop.com
+pengyou.com
+phoenixlzx.com
+phpwind.net
+pingan.com
+pool.ntp.org
+pplive.com
+pps.tv
+ppstream.com
+pptv.com
+pubyun.com
+qhimg.com
+qianlong.com
+qidian.com
+qingdaonews.com
+qiniu.com
+qiniudn.com
+qiushibaike.com
+qiyi.com
+qiyipic.com
+qq.com
+qqmail.com
+qstatic.com
+qunar.com
+qunarzz.com
+qvbuy.com
+renren.com
+renrendai.com
+rrfmn.com
+rrimg.com
+sanguosha.com
+sdo.com
+sina.com
+sinaapp.com
+sinaedge.com
+sinaimg.com
+sinajs.com
+skycn.com
+smzdm.com
+sogou.com
+sohu.com
+soku.com
+solidot.org
+soso.com
+soufun.com
+soufunimg.com
+staticfile.org
+staticsdo.com
+steamcn.com
+suning.com
+szzfgjj.com
+tanx.com
+taobao.com
+taobaocdn.com
+tbcache.com
+tdimg.com
+tencent.com
+tenpay.com
+tgbus.com
+thawte.com
+tiancity.com
+tianyaui.com
+tiexue.net
+tmall.com
+tmcdn.net
+tom.com
+tomonline-inc.com
+tuan800.com
+tuan800.net
+tuanimg.com
+tudou.com
+tudouui.com
+tuniu.com
+u148.net
+u17.com
+ubuntu.com
+ucjoy.com
+uni-marketers.com
+unionpay.com
+unionpaysecure.com
+upaiyun.com
+upyun.com
+uusee.com
+uuu9.com
+vaikan.com
+vancl.com
+vcimg.com
+verycd.com
+wandoujia.com
+wdjimg.com
+weibo.com
+weiphone.com
+weiyun.com
+west263.com
+wrating.com
+wscdns.com
+wumii.com
+xdcdn.net
+xiachufang.com
+xiami.com
+xiami.net
+xiaomi.com
+xiaonei.com
+xiazaiba.com
+xici.net
+xilu.com
+xinhuanet.com
+xinnet.com
+xlpan.com
+xnpic.com
+xungou.com
+xunlei.com
+ydstatic.com
+yesky.com
+yeyou.com
+yihaodian.com
+yihaodianimg.com
+yingjiesheng.com
+yintai.com
+yinyuetai.com
+yiqifa.com
+yixun.com
+ykimg.com
+ynet.com
+youdao.com
+yougou.com
+youku.com
+yupoo.com
+yy.com
+zbjimg.com
+zhaopin.com
+zhi.hu
+zhihu.com
+zhimg.com
+zhubajie.com
+zongheng.com
+hi-pda.com
diff --git a/doc/sample-config/proxy b/doc/sample-config/proxy
new file mode 100644
index 00000000..efe82392
--- /dev/null
+++ b/doc/sample-config/proxy
@@ -0,0 +1,10 @@
+google.com
+www.google.com.hk
+www.google.co.jp
+youtube.com
+twitter.com
+twimg.com
+t.co
+facebook.com
+fbcdn.net
+fb.me
diff --git a/doc/sample-config/rc b/doc/sample-config/rc
index 11c34805..0c6f3955 100644
--- a/doc/sample-config/rc
+++ b/doc/sample-config/rc
@@ -1,144 +1,21 @@
-# 配置文件中 # 开头的行为注释
-#
-# 代理服务器监听地址,重复多次来指定多个监听地址,语法:
-#
-#   listen = protocol://[optional@]server_address:server_port
-#
-# 支持的 protocol 如下:
-#
-# HTTP (提供 http 代理):
-#   listen = http://127.0.0.1:7777
-#
-#   上面的例子中,cow 生成的 PAC url 为 http://127.0.0.1:7777/pac
-#
-# cow (需两个 cow 服务器配合使用):
-#   listen = cow://encrypt_method:password@1.2.3.4:5678
-#
-#   若 1.2.3.4:5678 在国外,位于国内的 cow 配置其为二级代理后,两个 cow 之间可以
-#   通过加密连接传输 http 代理流量。目前的加密采用与 shadowsocks 相同的方式。
-#
-# 其他说明:
-# - 若 server_address 为 0.0.0.0,监听本机所有 IP 地址
-# - 可以用如下语法指定 PAC 中返回的代理服务器地址(当使用端口映射将 http 代理提供给外网时使用)
-#   listen = http://127.0.0.1:7777 1.2.3.4:5678
-#
-listen = http://127.0.0.1:7777
-
-# 日志文件路径,如不指定则输出到 stdout
-#logFile =
-
-# COW 默认仅对被墙网站使用二级代理
-# 下面选项设置为 true 后,所有网站都通过二级代理访问
-#alwaysProxy = false
-
-# 指定多个二级代理时使用的负载均衡策略,可选策略如下
-#
-#   backup:  默认策略,优先使用第一个指定的二级代理,其他仅作备份使用
-#   hash:    根据请求的 host name,优先使用 hash 到的某一个二级代理
-#   latency: 优先选择连接延迟最低的二级代理
-#
-# 一个二级代理连接失败后会依次尝试其他二级代理
-# 失败的二级代理会以一定的概率再次尝试使用,因此恢复后会重新启用
-#loadBalance = backup
+#############################
+# 监听地址,设为0.0.0.0可以监听所有端口,共享给局域网使用
+#############################
+listen = http://127.0.0.1:4411
 
 #############################
 # 指定二级代理
 #############################
-
-# 二级代理统一使用下列语法指定:
-#
-#   proxy = protocol://[authinfo@]server:port
-#
-# 重复使用 proxy 多次指定多个二级代理,backup 策略将按照二级代理出现的顺序来使用
-#
-# 目前支持的二级代理及配置举例:
-#
+# 例子:
 # SOCKS5:
 #   proxy = socks5://127.0.0.1:1080
-#
 # HTTP:
 #   proxy = http://127.0.0.1:8080
 #   proxy = http://user:password@127.0.0.1:8080
-#
-#   用户认证信息为可选项
-#
 # shadowsocks:
 #   proxy = ss://encrypt_method:password@1.2.3.4:8388
-#
-#   authinfo 中指定加密方法和密码,所有支持的加密方法如下:
+#   支持的加密方法如下:
 #     aes-128-cfb, aes-192-cfb, aes-256-cfb,
-#     bf-cfb, cast5-cfb, des-cfb, rc4-md5, rc4, table
-#   推荐使用 aes-128-cfb
-#
-# cow:
-#   proxy = cow://method:passwd@1.2.3.4:4321
-#
-#   authinfo 与 shadowsocks 相同
-
-
-#############################
-# 执行 ssh 命令创建 SOCKS5 代理
-#############################
-
-# 下面的选项可以让 COW 执行 ssh 命令创建本地 SOCKS5 代理,并在 ssh 断开后重连
-# COW 会自动使用通过 ssh 命令创建的代理,无需再通过 proxy 选项指定
-# 可重复指定多个
-#
-# 注意这一功能需要系统上已有 ssh 命令,且必须使用 ssh public key authentication
-#
-# 若指定该选项,COW 将执行以下命令:
-#     ssh -n -N -D <local_socks_port> -p <server_ssh_port> <user@server>
-# server_ssh_port 端口不指定则默认为 22
-# 如果要指定其他 ssh 选项,请修改 ~/.ssh/config
-#sshServer = user@server:local_socks_port[:server_ssh_port]
-
-#############################
-# 认证
-#############################
-
-# 指定允许的 IP 或者网段。网段仅支持 IPv4,可以指定 IPv6 地址,用逗号分隔多个项
-# 使用此选项时别忘了添加 127.0.0.1,否则本机访问也需要认证
-#allowedClient = 127.0.0.1, 192.168.1.0/24, 10.0.0.0/8
-
-# 要求客户端通过用户名密码认证
-# COW 总是先验证 IP 是否在 allowedClient 中,若不在其中再通过用户名密码认证
-#userPasswd = username:password
-
-# 如需指定多个用户名密码,可在下面选项指定的文件中列出,文件中每行内容如下
-#   username:password[:port]
-# port 为可选项,若指定,则该用户只能从指定端口连接 COW
-# 注意:如有重复用户,COW 会报错退出
-#userPasswdFile = /path/to/file
-
-# 认证失效时间
-# 语法:2h3m4s 表示 2 小时 3 分钟 4 秒
-#authTimeout = 2h
-
-#############################
-# 高级选项
-#############################
-
-# 将指定的 HTTP error code 认为是被干扰,使用二级代理重试,默认为空
-#httpErrorCode =
-
-# 最多允许使用多少个 CPU 核
-#core = 2
-
-# 允许建立隧道连接的端口,多个端口用逗号分隔,可重复多次
-# 默认总是允许下列服务的端口: ssh, http, https, rsync, imap, pop, jabber, cvs, git, svn
-# 如需允许其他端口,请用该选项添加
-# 限制隧道连接的端口可以防止将运行 COW 的服务器上只监听本机 ip 的服务暴露给外部
-#tunnelAllowedPort = 80, 443
-
-# GFW 会使 DNS 解析超时,也可能返回错误的地址,能连接但是读不到任何内容
-# 下面两个值改小一点可以加速检测网站是否被墙,但网络情况差时可能误判
-
-# 创建连接超时(语法跟 authTimeout 相同)
-#dialTimeout = 5s
-# 从服务器读超时
-#readTimeout = 5s
+#     bf-cfb, cast5-cfb, des-cfb, rc4-md5,
+#     chacha20, salsa20, rc4, table
 
-# 基于 client 是否很快关闭连接来检测 SSL 错误,只对 Chrome 有效
-# (Chrome 遇到 SSL 错误会直接关闭连接,而不是让用户选择是否继续)
-# 可能将可直连网站误判为被墙网站,当 GFW 进行 SSL 中间人攻击时可以考虑使用
-#detectSSLErr = false
diff --git a/doc/sample-config/rc-en b/doc/sample-config/rc-en
deleted file mode 100644
index 5e0c3523..00000000
--- a/doc/sample-config/rc-en
+++ /dev/null
@@ -1,171 +0,0 @@
-# Lines starting with "#" are comments.
-#
-# Listen address of the proxy server, repeat to specify multiple ones.
-# Syntax:
-#
-#   listen = protocol://[optional@]server_address:server_port
-#
-# Supported protocols:
-#
-# HTTP (provides http proxy):
-#   listen = http://127.0.0.1:7777
-#
-#   The generated PAC url in the above example is http://127.0.0.1:7777/pac
-#
-# cow (need two cow servers to use this protocol):
-#   listen = cow://encrypt_method:password@1.2.3.4:5678
-#
-# 	Suppose 1.2.3.4:5678 is outside your country and the network is not
-#   disturbed, then COW running in your own country should configure it
-#   as parent proxy. The two COW servers will use encrypted connection to
-# 	pass data. The encryption method used is the same as shadowsocks.
-#
-# Note:
-# - If server_address is 0.0.0.0, listen all IP addresses on the system.
-# - The following syntax can specify the proxy address in the generated PAC.
-#	(Use this if you are using port forwarding to provide COW to external network.)
-#
-#       listen = http://127.0.0.1:7777 1.2.3.4:5678
-#
-listen = http://127.0.0.1:7777
-
-# Log file path, defaults to stdout
-#logFile =
-
-# By default, COW only uses parent proxy if the site is blocked.
-# If the following option is true, COW will use parent proxy for all sites.
-#alwaysProxy = false
-
-# With multiple parent proxies, COW can employ one of the load balancing
-# strategies:
-#
-#   backup:  default policy, use the first prarent proxy in config,
-#            the others are just backup
-#   hash:    hash to a specific parent proxy according to host name
-#   latency: use the parent proxy with lowest connection latency
-#
-# When one parent proxy fails to connect, COW will try other parent proxies
-# in order.
-# Failed parent proxy will be tried with some probability, so they will be
-# used again after recovery.
-#loadBalance = backup
-
-#############################
-# Specify parent proxy
-#############################
-
-# Parent proxies are specified with a generic syntax (following RFC 3986):
-#
-#   proxy = protocol://[authinfo@]server:port
-#
-# Repeat to specify multiple parent proxies. Backup load balancing will use
-# them in order if one fails to connect.
-#
-# Supported parent proxies and config example:
-#
-# SOCKS5:
-#   proxy = socks5://127.0.0.1:1080
-#
-# HTTP:
-#   proxy = http://127.0.0.1:8080
-#   proxy = http://user:password@127.0.0.1:8080
-#
-# 	authinfo is optional
-#
-# shadowsocks:
-#   proxy = ss://encrypt_method:password@1.2.3.4:8388
-#
-#   authinfo specifies encryption method and password.
-#   Here are the supported encryption methods:
-#
-#     aes-128-cfb, aes-192-cfb, aes-256-cfb,
-#     bf-cfb, cast5-cfb, des-cfb, rc4-md5, rc4, table
-#
-#   aes-128-cfb is recommended.
-#
-# cow:
-#   proxy = cow://method:passwd@1.2.3.4:4321
-#
-#   authinfo is the same as shadowsocks parent proxy
-
-
-#############################
-# Run ssh command to create SOCKS5 parent proxy
-#############################
-
-# Note: shadowsocks is better, use it if you can.
-
-# The following option lets COW execute ssh command to create local
-# SOCKS5 proxy and automatically re-execute if ssh connection is closed.
-# The created SOCKS5 proxy will be used as a parent proxy.
-# The option can be repeated to create multiple SOCKS5 proxies.
-#
-# Note: requires ssh command and must use ssh public key authentication.
-#
-# COW will execute the following command if the option is given:
-#
-#     ssh -n -N -D <local_socks_port> -p <server_ssh_port> <user@server>
-#
-# server_ssh_port defaults to 22
-# Please modify ~/.ssh/config to specify other ssh options
-#sshServer = user@server:local_socks_port[:server_ssh_port]
-
-#############################
-# Authentication
-#############################
-
-# Specify allowed IP address (IPv4 and IPv6) or sub-network (only IPv4).
-# Don't forget to specify 127.0.0.1 with this option.
-#allowedClient = 127.0.0.1, 192.168.1.0/24, 10.0.0.0/8
-
-# Require username and password authentication. COW always check IP in
-# allowedClient first, then ask for username authentication.
-#userPasswd = username:password
-
-# To specify multiple username and password, list all those in a file with
-# content like this:
-#
-#   username:password[:port]
-#
-# port is optional, user can only connect from the specific port if specified.
-# COW will report error and exit if there's duplicated user.
-#userPasswdFile = /path/to/file
-
-# Time interval to keep authentication information.
-# Syntax: 2h3m4s means 2 hours 3 minutes 4 seconds
-#authTimeout = 2h
-
-#############################
-# Advanced options
-#############################
-
-# Take a specific HTTP error code as blocked and use parent proxy to retry.
-#httpErrorCode =
-
-# Maximum CPU core to use.
-#core = 2
-
-# Ports allowed to create tunnel (HTTP CONNECT method), comma separated list
-# or repeat to append more ports.
-# Ports for the following service are allowed by default:
-#
-#     ssh, http, https, rsync, imap, pop, jabber, cvs, git, svn
-#
-# Limiting ports for tunneling prevents exposing internal services to outside.
-#tunnelAllowedPort = 80, 443
-
-# GFW may timeout DNS query, or return wrong server address which can connect
-# but blocks on read forever.
-# Decrease the following timeout values can speed up detecting blocked sites,
-# but may mistake normal sites as blocked.
-
-# DNS and connection timeout (same syntax with authTimeout).
-#dialTimeout = 5s
-# Read from server timeout.
-#readTimeout = 5s
-
-# Detect SSL error based on client close connection speed, only effective for
-# Chrome.
-# This detection is no reliable, may mistaken normal sites as blocked.
-# Only consider this option when GFW is making middle man attack.
-#detectSSLErr = false
diff --git a/doc/sample-config/rc-full b/doc/sample-config/rc-full
new file mode 100644
index 00000000..d5a650bb
--- /dev/null
+++ b/doc/sample-config/rc-full
@@ -0,0 +1,143 @@
+# 配置文件中 # 开头的行为注释
+#
+# 代理服务器监听地址,重复多次来指定多个监听地址,语法:
+#
+#   listen = protocol://[optional@]server_address:server_port
+#
+# 支持的 protocol 如下:
+#
+# HTTP (提供 http 代理):
+#   listen = http://127.0.0.1:4411
+#
+#   上面的例子中,MEOW 生成的 PAC url 为 http://127.0.0.1:4411/pac
+#
+# HTTPS (提供 https 代理):
+#   listen = https://example.com:443
+#   cert = /path/to/cert.pem
+#   key = /path/to/key.pem
+#
+#   上面的例子中,MEOW 生成的 PAC url 为 https://example.com:443/pac
+#
+# MEOW (需两个 MEOW 服务器配合使用):
+#   listen = meow://encrypt_method:password@1.2.3.4:5678
+#
+#   若 1.2.3.4:5678 在国外,位于国内的 MEOW 配置其为二级代理后,两个 MEOW 之间可以
+#   通过加密连接传输 http 代理流量。采用与 shadowsocks 相同的加密方式。
+#
+# 其他说明:
+# - 若 server_address 为 0.0.0.0,监听本机所有 IP 地址
+# - 可以用如下语法指定 PAC 中返回的代理服务器地址(当使用端口映射将 http 代理提供给外网时使用)
+#   listen = http://127.0.0.1:4411 1.2.3.4:5678
+#
+listen = http://127.0.0.1:4411
+
+#############################
+# 通过IP判断是否直连,默认开启
+#############################
+#judgeByIP = true
+
+# 日志文件路径,如不指定则输出到 stdout
+#logFile =
+
+# 指定多个二级代理时使用的负载均衡策略,可选策略如下
+#
+#   backup:  默认策略,优先使用第一个指定的二级代理,其他仅作备份使用
+#   hash:    根据请求的 host name,优先使用 hash 到的某一个二级代理
+#   latency: 优先选择连接延迟最低的二级代理
+#
+# 一个二级代理连接失败后会依次尝试其他二级代理
+# 失败的二级代理会以一定的概率再次尝试使用,因此恢复后会重新启用
+#loadBalance = backup
+
+#############################
+# 指定二级代理
+#############################
+
+# 二级代理统一使用下列语法指定:
+#
+#   proxy = protocol://[authinfo@]server:port
+#
+# 重复使用 proxy 多次指定多个二级代理,backup 策略将按照二级代理出现的顺序来使用
+#
+# 目前支持的二级代理及配置举例:
+#
+# SOCKS5:
+#   proxy = socks5://127.0.0.1:1080
+#
+# HTTP:
+#   proxy = http://127.0.0.1:8080
+#   proxy = http://user:password@127.0.0.1:8080
+#
+#   用户认证信息为可选项
+#
+# HTTPS:
+#   proxy = https://example.com:8080
+#   proxy = https://user:password@example.com:8080
+#
+#   用户认证信息为可选项
+#
+# Shadowsocks:
+#   proxy = ss://encrypt_method:password@1.2.3.4:8388
+#
+#   authinfo 中指定加密方法和密码,所有支持的加密方法如下:
+#     aes-128-cfb, aes-192-cfb, aes-256-cfb,
+#     bf-cfb, cast5-cfb, des-cfb, rc4-md5,
+#     chacha20, salsa20, rc4, table
+#
+# MEOW:
+#   proxy = meow://method:passwd@1.2.3.4:4321
+#
+#   authinfo 与 shadowsocks 相同
+
+
+#############################
+# 执行 ssh 命令创建 SOCKS5 代理
+#############################
+
+# 下面的选项可以让 MEOW 执行 ssh 命令创建本地 SOCKS5 代理,并在 ssh 断开后重连
+# MEOW 会自动使用通过 ssh 命令创建的代理,无需再通过 proxy 选项指定
+# 可重复指定多个
+#
+# 注意这一功能需要系统上已有 ssh 命令,且必须使用 ssh public key authentication
+#
+# 若指定该选项,MEOW 将执行以下命令:
+#     ssh -n -N -D <local_socks_port> -p <server_ssh_port> <user@server>
+# server_ssh_port 端口不指定则默认为 22
+# 如果要指定其他 ssh 选项,请修改 ~/.ssh/config
+#sshServer = user@server:local_socks_port[:server_ssh_port]
+
+#############################
+# 认证
+#############################
+
+# 指定允许的 IP 或者网段。网段仅支持 IPv4,可以指定 IPv6 地址,用逗号分隔多个项
+# 使用此选项时别忘了添加 127.0.0.1,否则本机访问也需要认证
+#allowedClient = 127.0.0.1, 192.168.1.0/24, 10.0.0.0/8
+
+# 要求客户端通过用户名密码认证
+# MEOW 总是先验证 IP 是否在 allowedClient 中,若不在其中再通过用户名密码认证
+#userPasswd = username:password
+
+# 如需指定多个用户名密码,可在下面选项指定的文件中列出,文件中每行内容如下
+#   username:password[:port]
+# port 为可选项,若指定,则该用户只能从指定端口连接 MEOW
+# 注意:如有重复用户,MEOW 会报错退出
+#userPasswdFile = /path/to/file
+
+# 认证失效时间
+# 语法:2h3m4s 表示 2 小时 3 分钟 4 秒
+#authTimeout = 2h
+
+#############################
+# 高级选项
+#############################
+
+# 将指定的 HTTP error code 认为是被干扰,使用二级代理重试,默认为空
+#httpErrorCode =
+
+# 最多允许使用多少个 CPU 核
+#core = 2
+
+# 修改 direct/proxy 文件路径,如不指定,默认在配置文件所在目录下
+#directFile = <dir to rc file>/direct
+#proxyFile = <dir to rc file>/proxy
diff --git a/doc/sample-config/reject b/doc/sample-config/reject
new file mode 100644
index 00000000..c0ebf737
--- /dev/null
+++ b/doc/sample-config/reject
@@ -0,0 +1,32 @@
+acs86.com
+adcome.cn
+adinfuse.com
+admaster.com.cn
+admob.com
+adsage.cn
+adsage.com
+adsmogo.org
+ads.mobclix.com
+adview.cn
+adwhirl.com
+adwo.com
+appads.com
+domob.cn
+domob.org
+doubleclick.net
+duomeng.cn
+duomeng.net
+duomeng.org
+googeadsserving.cn
+guomob.com
+immob.cn
+inmobi.com
+mobads.baidu.com
+mobads-logs.baidu.com
+smartadserver.com
+tapjoyads.com
+umeng.co
+umeng.com
+umtrack.com
+uyunad.com
+youmi.net
diff --git a/error.go b/error.go
index fad75c75..cfa73ffa 100644
--- a/error.go
+++ b/error.go
@@ -26,12 +26,12 @@ func init() {
 
 	errPageRawTmpl := `<!DOCTYPE html>
 <html>
-	<head> <title>COW Proxy</title> </head>
+	<head> <title>MEOW Proxy</title> </head>
 	<body>
 		<h1>{{.H1}}</h1>
 		{{.Msg}}
 		<hr />
-		Generated by <i>COW ` + version + `</i> <br />
+		Generated by <i>MEOW ` + version + `</i> <br />
 		Host <i>` + hostName + `</i> <br />
 		{{.T}}
 	</body>
diff --git a/estimate_timeout.go b/estimate_timeout.go
deleted file mode 100644
index 6a975c6c..00000000
--- a/estimate_timeout.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package main
-
-import (
-	"io"
-	"net"
-	"time"
-)
-
-// For once blocked site, use min dial/read timeout to make switching to
-// parent proxy faster.
-const minDialTimeout = 3 * time.Second
-const minReadTimeout = 4 * time.Second
-const defaultDialTimeout = 5 * time.Second
-const defaultReadTimeout = 5 * time.Second
-const maxTimeout = 15 * time.Second
-
-var dialTimeout = defaultDialTimeout
-var readTimeout = defaultReadTimeout
-
-// use a fast to fetch web site
-const estimateSite = "www.baidu.com"
-
-var estimateReq = []byte("GET / HTTP/1.1\r\n" +
-	"Host: " + estimateSite + "\r\n" +
-	"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:11.0) Gecko/20100101 Firefox/11.0\r\n" +
-	"Accept: */*\r\n" +
-	"Accept-Language: en-us,en;q=0.5\r\n" +
-	"Accept-Encoding: gzip, deflate\r\n" +
-	"Connection: close\r\n\r\n")
-
-// estimateTimeout tries to fetch a url and adjust timeout value according to
-// how much time is spent on connect and fetch. This avoids incorrectly
-// considering non-blocked sites as blocked when network connection is bad.
-func estimateTimeout() {
-	// debug.Println("estimating timeout")
-	buf := connectBuf.Get()
-	defer connectBuf.Put(buf)
-	var est time.Duration
-
-	start := time.Now()
-	c, err := net.Dial("tcp", estimateSite+":80")
-	if err != nil {
-		errl.Printf("estimateTimeout: can't connect to %s: %v, network has problem?\n",
-			estimateSite, err)
-		goto onErr
-	}
-	defer c.Close()
-
-	est = time.Now().Sub(start) * 5
-	// debug.Println("estimated dialTimeout:", est)
-	if est > maxTimeout {
-		est = maxTimeout
-	}
-	if est > config.DialTimeout {
-		dialTimeout = est
-		debug.Println("new dial timeout:", dialTimeout)
-	} else if dialTimeout != config.DialTimeout {
-		dialTimeout = config.DialTimeout
-		debug.Println("new dial timeout:", dialTimeout)
-	}
-
-	start = time.Now()
-	// include time spent on sending request, reading all content to make it a
-	// little longer
-	if _, err = c.Write(estimateReq); err != nil {
-		errl.Println("estimateTimeout: error sending request:", err)
-		goto onErr
-	}
-	for err == nil {
-		_, err = c.Read(buf)
-	}
-	if err != io.EOF {
-		errl.Printf("estimateTimeout: error getting %s: %v, network has problem?\n",
-			estimateSite, err)
-		goto onErr
-	}
-	est = time.Now().Sub(start) * 10
-	// debug.Println("estimated read timeout:", est)
-	if est > maxTimeout {
-		est = maxTimeout
-	}
-	if est > time.Duration(config.ReadTimeout) {
-		readTimeout = est
-		debug.Println("new read timeout:", readTimeout)
-	} else if readTimeout != config.ReadTimeout {
-		readTimeout = config.ReadTimeout
-		debug.Println("new read timeout:", readTimeout)
-	}
-	return
-onErr:
-	dialTimeout += 2 * time.Second
-	readTimeout += 2 * time.Second
-}
-
-func runEstimateTimeout() {
-	readTimeout = config.ReadTimeout
-	dialTimeout = config.DialTimeout
-	for {
-		estimateTimeout()
-		time.Sleep(30 * time.Second)
-	}
-}
-
-// Guess network status based on doing HTTP request to estimateSite
-func networkBad() bool {
-	return (readTimeout != config.ReadTimeout) ||
-		(dialTimeout != config.DialTimeout)
-}
diff --git a/http.go b/http.go
index 4768dfb6..65d21af0 100644
--- a/http.go
+++ b/http.go
@@ -52,7 +52,7 @@ type Request struct {
 	raw     *bytes.Buffer // stores the raw content of request header
 	rawByte []byte        // underlying buffer for raw
 
-	// request line from client starts at 0, cow generates request line that
+	// request line from client starts at 0, meow generates request line that
 	// can be sent directly to web server
 	reqLnStart int // start of generated request line in raw
 	headStart  int // start of header in raw
@@ -62,7 +62,6 @@ type Request struct {
 	isConnect bool
 	partial   bool // whether contains only partial request data
 	state     rqState
-	tryCnt    byte
 }
 
 // Assume keep-alive request by default.
@@ -105,18 +104,6 @@ func (r *Request) hasBody() bool {
 	return r.Chunking || r.ContLen > 0
 }
 
-func (r *Request) isRetry() bool {
-	return r.tryCnt > 1
-}
-
-func (r *Request) tryOnce() {
-	r.tryCnt++
-}
-
-func (r *Request) tooManyRetry() bool {
-	return r.tryCnt > 3
-}
-
 func (r *Request) responseNotSent() bool {
 	return r.state <= rsSent
 }
@@ -307,6 +294,9 @@ func ParseRequestURIBytes(rawurl []byte) (*URL, error) {
 		}
 	}
 
+        // Fixed wechat image url bug, url like http://[::ffff:183.192.196.102]/mmsns/lVxxxxxx
+        host = strings.TrimSuffix(strings.TrimPrefix(host, "[::ffff:"), "]")
+        hostport = net.JoinHostPort(host, port)
 	return &URL{hostport, host, port, host2Domain(host), path}, nil
 }
 
@@ -369,7 +359,7 @@ var hopByHopHeader = map[string]bool{
 
 type HeaderParserFunc func(*Header, []byte) error
 
-// Used by both "Connection" and "Proxy-Connection" header. COW always adds
+// Used by both "Connection" and "Proxy-Connection" header. meow always adds
 // connection header at the end of a request/response (in parseRequest and
 // parseResponse), no matter whether the original one has this header or not.
 // This will change the order of headers, but should be OK as RFC2616 4.2 says
@@ -431,7 +421,7 @@ func (h *Header) parseTransferEncoding(s []byte) error {
 // a) request includes TE header
 // b) server is the original server
 //
-// Even though COW removes TE header, the original server can still respond
+// Even though meow removes TE header, the original server can still respond
 // with Trailer header.
 // As Trailer is general header, it's possible to appear in request. But is
 // there any client does this?
@@ -444,9 +434,9 @@ func (h *Header) parseTrailer(s []byte) error {
 	return nil
 }
 
-// For now, COW does not fully support 100-continue. It will return "417
+// For now, meow does not fully support 100-continue. It will return "417
 // expectation failed" if a request contains expect header. This is one of the
-// strategies supported by polipo, which is easiest to implement in cow.
+// strategies supported by polipo, which is easiest to implement in meow.
 // TODO If we see lots of expect 100-continue usage, provide full support.
 
 func (h *Header) parseExpect(s []byte) error {
@@ -635,7 +625,7 @@ func parseRequest(c *clientConn, r *Request) (err error) {
 		r.raw.WriteString(fullHeaderConnectionClose)
 	}
 	// The spec says proxy must add Via header. polipo disables this by
-	// default, and I don't want to let others know the user is using COW, so
+	// default, and I don't want to let others know the user is using meow, so
 	// don't add it.
 	r.raw.WriteString(CRLF)
 	r.bodyStart = r.raw.Len()
@@ -655,9 +645,6 @@ func (rp *Response) hasBody(method string) bool {
 func parseResponse(sv *serverConn, r *Request, rp *Response) (err error) {
 	var s []byte
 	reader := sv.bufRd
-	if sv.maybeFake() {
-		sv.setReadTimeout("parseResponse")
-	}
 	if s, err = reader.ReadSlice('\n'); err != nil {
 		// err maybe timeout caused by explicity setting deadline, EOF, or
 		// reset caused by GFW.
@@ -668,9 +655,6 @@ func parseResponse(sv *serverConn, r *Request, rp *Response) (err error) {
 		// is caused by GFW.
 		return err
 	}
-	if sv.maybeFake() {
-		sv.unsetReadTimeout("parseResponse")
-	}
 	// debug.Printf("Response line %s", s)
 
 	// response status line parsing
@@ -735,7 +719,7 @@ func parseResponse(sv *serverConn, r *Request, rp *Response) (err error) {
 			rp.raw.WriteString("Content-Length: 0\r\n")
 		}
 	}
-	// Whether COW should respond with keep-alive depends on client request,
+	// Whether meow should respond with keep-alive depends on client request,
 	// not server response.
 	if r.ConnectionKeepAlive {
 		rp.raw.WriteString(fullHeaderConnectionKeepAlive)
diff --git a/http_test.go b/http_test.go
index af185d9c..9ae6bd03 100644
--- a/http_test.go
+++ b/http_test.go
@@ -13,15 +13,14 @@ func TestParseRequestURI(t *testing.T) {
 		rawurl string
 		url    *URL
 	}{
-		// I'm really tired of typing google.com ...
 		{"http://www.g.com", &URL{"www.g.com:80", "www.g.com", "80", "g.com", ""}},
 		{"http://plus.g.com/", &URL{"plus.g.com:80", "plus.g.com", "80", "g.com", "/"}},
 		{"https://g.com:80", &URL{"g.com:80", "g.com", "80", "g.com", ""}},
 		{"http://mail.g.com:80/", &URL{"mail.g.com:80", "mail.g.com", "80", "g.com", "/"}},
 		{"http://g.com:80/ncr", &URL{"g.com:80", "g.com", "80", "g.com", "/ncr"}},
 		{"https://g.com/ncr/tree", &URL{"g.com:443", "g.com", "443", "g.com", "/ncr/tree"}},
-		{"www.g.com.hk:80/", &URL{"www.g.com.hk:80", "www.g.com.hk", "80", "g.com.hk", "/"}},
-		{"g.com.jp:80", &URL{"g.com.jp:80", "g.com.jp", "80", "g.com.jp", ""}},
+		{"www.g.com.hk:80/", &URL{"www.g.com.hk:80", "www.g.com.hk", "80", "com.hk", "/"}},
+		{"g.com.jp:80", &URL{"g.com.jp:80", "g.com.jp", "80", "com.jp", ""}},
 		{"g.com", &URL{"g.com:80", "g.com", "80", "g.com", ""}},
 		{"g.com:8000/ncr", &URL{"g.com:8000", "g.com", "8000", "g.com", "/ncr"}},
 		{"g.com/ncr/tree", &URL{"g.com:80", "g.com", "80", "g.com", "/ncr/tree"}},
diff --git a/install-cow.sh b/install.sh
similarity index 71%
rename from install-cow.sh
rename to install.sh
index 63254464..d929ad8c 100755
--- a/install-cow.sh
+++ b/install.sh
@@ -1,17 +1,17 @@
 #!/bin/bash
 
-version=0.9.3
+version=1.5
 
 arch=`uname -m`
 case $arch in
     "x86_64")
-        arch="64"
+        arch="amd64"
         ;;
     "i386" | "i586" | "i486" | "i686")
-        arch="32"
+        arch="386"
         ;;
     "armv5tel" | "armv6l" | "armv7l")
-        arch="-$arch"
+        arch="arm"
         ;;
     *)
         echo "$arch currently has no precompiled binary"
@@ -21,7 +21,7 @@ esac
 os=`uname -s`
 case $os in
     "Darwin")
-        os="mac"
+        os="darwin"
         ;;
     "Linux")
         os="linux"
@@ -40,31 +40,31 @@ exit_on_fail() {
 
 while true; do
     # Get install directory from environment variable.
-    if [[ -n $COW_INSTALLDIR && -d $COW_INSTALLDIR ]]; then
-        install_dir=$COW_INSTALLDIR
+    if [[ -n $MEOW_INSTALLDIR && -d $MEOW_INSTALLDIR ]]; then
+        install_dir=$MEOW_INSTALLDIR
         break
     fi
 
     # Get installation directory from user
-    echo -n "Install cow binary to which directory (absolute path, defaults to current dir): "
+    echo -n "Install MEOW binary to which directory (absolute path, defaults to current dir): "
     read install_dir </dev/tty
     if [ -z $install_dir ]; then
         echo "No installation directory given, assuming current directory"
         install_dir=`pwd`
         break
     fi
-    if [ ! -d $install_dir ]; then
+    if [ ! -d "$install_dir" ]; then
         echo "Directory $install_dir does not exists"
     else
         break
     fi
 done
 
-# Ask OS X user whehter to start COW upon login
+# Ask OS X user whehter to start MEOW upon login
 start_on_login="n"
-if [ $os == "mac" ]; then
+if [ $os == "darwin" ]; then
     while true; do
-        echo -n "Start COW upon login? (If yes, download a plist file to ~/Library/LaunchAgents) [Y/n] "
+        echo -n "Start MEOW upon login? (If yes, download a plist file to ~/Library/LaunchAgents) [Y/n] "
         read start_on_login </dev/tty
         case $start_on_login in
         "Y" | "y" | "")
@@ -79,28 +79,28 @@ if [ $os == "mac" ]; then
     done
 fi
 
-# Download COW binary
-bin=cow-$os$arch-$version
-tmpdir=`mktemp -d /tmp/cow.XXXXXX`
-tmpbin=$tmpdir/cow
-binary_url="http://dl.chenyufei.info/cow/$bin.gz"
-echo "Downloading cow binary $binary_url to $tmpbin.gz"
+# Download MEOW binary
+bin=MEOW-$os-$arch-$version
+tmpdir=`mktemp -d /tmp/MEOW.XXXXXX`
+tmpbin=$tmpdir/MEOW
+binary_url="https://github.com/renzhn/MEOW/raw/gh-pages/dist/$bin.gz"
+echo "Downloading MEOW binary $binary_url to $tmpbin.gz"
 curl -L "$binary_url" -o $tmpbin.gz || \
-    exit_on_fail "Downloading cow binary failed"
+    exit_on_fail "Downloading MEOW binary failed"
 gunzip $tmpbin.gz || exit_on_fail "gunzip $tmpbin.gz failed"
 chmod +x $tmpbin ||
     exit_on_fail "Can't chmod for $tmpbin"
 
 # Download sample config file if no configuration directory present
-doc_base="https://raw.github.com/cyfdecyf/cow/$version/doc"
-config_dir="$HOME/.cow"
+doc_base="https://raw.github.com/renzhn/MEOW/master/doc"
+config_dir="$HOME/.meow"
 is_update=true
 if [ ! -e $config_dir ]; then
     is_update=false
     sample_config_base="${doc_base}/sample-config"
     echo "Downloading sample config file to $config_dir"
     mkdir -p $config_dir || exit_on_fail "Can't create $config_dir directory"
-    for f in rc; do
+    for f in rc rc-full direct proxy reject; do
         echo "Downloading $sample_config_base/$f to $config_dir/$f"
         curl -L "$sample_config_base/$f" -o $config_dir/$f || \
             exit_on_fail "Downloading sample config file $f failed"
@@ -110,12 +110,12 @@ fi
 # Download startup plist file
 if [ $start_on_login == "y" ]; then
     la_dir="$HOME/Library/LaunchAgents"
-    plist="info.chenyufei.cow.plist"
+    plist="net.ohrz.meow.plist"
     plist_url="$doc_base/osx/$plist"
     mkdir -p $la_dir && exit_on_fail "Can't create directory $la_dir"
     echo "Downloading $plist_url to $la_dir/$plist"
     curl -L "$plist_url" | \
-        sed -e "s,COWBINARY,$install_dir/cow," > $la_dir/$plist || \
+        sed -e "s,MEOWBINARY,$install_dir/MEOW," > $la_dir/$plist || \
         exit_on_fail "Download startup plist file to $la_dir failed"
 fi
 
@@ -136,6 +136,6 @@ if $is_update; then
 else
     echo "Installation finished."
     echo "Please edit $config_dir/rc according to your own settings."
-    echo 'After that, execute "cow &" to start cow and run in background.'
+    echo 'After that, execute "MEOW &" to start MEOW and run in background.'
 fi
 
diff --git a/log.go b/log.go
index 8aadbcdd..83c8afb8 100644
--- a/log.go
+++ b/log.go
@@ -6,10 +6,11 @@ package main
 import (
 	"flag"
 	"fmt"
-	"github.com/cyfdecyf/color"
 	"io"
 	"log"
 	"os"
+
+	"github.com/cyfdecyf/color"
 )
 
 type infoLogging bool
@@ -28,10 +29,10 @@ var (
 	logFile io.Writer
 
 	// make sure logger can be called before initLog
-	errorLog    = log.New(os.Stdout, "", log.LstdFlags)
-	debugLog    = errorLog
-	requestLog  = errorLog
-	responseLog = errorLog
+	errorLog    = log.New(os.Stdout, "[ERROR] ", log.LstdFlags)
+	debugLog    = log.New(os.Stdout, "[DEBUG] ", log.LstdFlags)
+	requestLog  = log.New(os.Stdout, "[>>>>>] ", log.LstdFlags)
+	responseLog = log.New(os.Stdout, "[<<<<<] ", log.LstdFlags)
 
 	verbose  bool
 	colorize bool
@@ -41,8 +42,8 @@ func init() {
 	flag.BoolVar((*bool)(&info), "info", true, "info log")
 	flag.BoolVar((*bool)(&debug), "debug", false, "debug log, with this option, log goes to stdout with color")
 	flag.BoolVar((*bool)(&errl), "err", true, "error log")
-	flag.BoolVar((*bool)(&dbgRq), "request", false, "request log")
-	flag.BoolVar((*bool)(&dbgRep), "reply", false, "reply log")
+	flag.BoolVar((*bool)(&dbgRq), "request", true, "request log")
+	flag.BoolVar((*bool)(&dbgRep), "reply", true, "reply log")
 	flag.BoolVar(&verbose, "v", false, "more info in request/response logging")
 	flag.BoolVar(&colorize, "color", false, "colorize log output")
 }
diff --git a/main.go b/main.go
index d1684699..55998347 100644
--- a/main.go
+++ b/main.go
@@ -1,38 +1,12 @@
 package main
 
 import (
-	// "flag"
+	"fmt"
 	"os"
-	"os/signal"
 	"runtime"
-	// "runtime/pprof"
 	"sync"
-	"syscall"
 )
 
-// var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
-
-func sigHandler() {
-	// TODO On Windows, these signals will not be triggered on closing cmd
-	// window. How to detect this?
-	sigChan := make(chan os.Signal, 1)
-	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM,
-		syscall.SIGHUP)
-
-	for sig := range sigChan {
-		// May handle other signals in the future.
-		info.Printf("%v caught, exit\n", sig)
-		storeSiteStat(siteStatExit)
-		break
-	}
-	/*
-		if *cpuprofile != "" {
-			pprof.StopCPUProfile()
-		}
-	*/
-	os.Exit(0)
-}
-
 func main() {
 	// Parse flags after load config to allow override options in config
 	cmdLineConfig := parseCmdLineConfig()
@@ -41,39 +15,32 @@ func main() {
 		os.Exit(0)
 	}
 
+	fmt.Printf(`
+       /\
+   )  ( ')     MEOW Proxy %s
+  (  /  )      http://renzhn.github.io/MEOW/
+   \(__)|      
+	`, version)
+	fmt.Println()
+
 	parseConfig(cmdLineConfig.RcFile, cmdLineConfig)
 
 	initSelfListenAddr()
 	initLog()
 	initAuth()
-	initSiteStat()
-	initPAC() // initPAC uses siteStat, so must init after site stat
-
 	initStat()
 
 	initParentPool()
 
-	/*
-		if *cpuprofile != "" {
-			f, err := os.Create(*cpuprofile)
-			if err != nil {
-				Fatal(err)
-			}
-			pprof.StartCPUProfile(f)
-		}
-	*/
+	if config.JudgeByIP {
+		initCNIPData()
+	}
 
 	if config.Core > 0 {
 		runtime.GOMAXPROCS(config.Core)
 	}
 
-	go sigHandler()
 	go runSSH()
-	if config.EstimateTimeout {
-		go runEstimateTimeout()
-	} else {
-		info.Println("timeout estimation disabled")
-	}
 
 	var wg sync.WaitGroup
 	wg.Add(len(listenProxy))
diff --git a/pac.go b/pac.go
index a1d913a6..0fb11e59 100644
--- a/pac.go
+++ b/pac.go
@@ -4,54 +4,26 @@ import (
 	"bytes"
 	"fmt"
 	"net"
-	"strings"
-	"sync"
 	"text/template"
-	"time"
 )
 
 var pac struct {
-	template       *template.Template
-	topLevelDomain string
-	directList     string
-	// Assignments and reads to directList are in different goroutines. Go
-	// does not guarantee atomic assignment, so we should protect these racing
-	// access.
-	dLRWMutex sync.RWMutex
-}
-
-func getDirectList() string {
-	pac.dLRWMutex.RLock()
-	dl := pac.directList
-	pac.dLRWMutex.RUnlock()
-	return dl
-}
-
-func updateDirectList() {
-	dl := strings.Join(siteStat.GetDirectList(), "\",\n\"")
-	pac.dLRWMutex.Lock()
-	pac.directList = dl
-	pac.dLRWMutex.Unlock()
+	template *template.Template
 }
 
 func init() {
 	const pacRawTmpl = `var direct = 'DIRECT';
 var httpProxy = 'PROXY {{.ProxyAddr}}; DIRECT';
 
-var directList = [
-"",
+var domainList = [
 "{{.DirectDomains}}"
 ];
 
-var directAcc = {};
-for (var i = 0; i < directList.length; i += 1) {
-	directAcc[directList[i]] = true;
+var directAcc = [];
+for (var i = 0; i < domainList.length; i += 1) {
+	directAcc[domainList[i]] = true;
 }
 
-var topLevel = {
-{{.TopLevel}}
-};
-
 // hostIsIP determines whether a host address is an IP address and whether
 // it is private. Currenly only handles IPv4 addresses.
 function hostIsIP(host) {
@@ -102,25 +74,18 @@ function host2Domain(host) {
 	if (dot2ndLast === -1)
 		return host;
 
-	var part = host.substring(dot2ndLast+1, lastDot);
-	if (topLevel[part]) {
-		var dot3rdLast = host.lastIndexOf(".", dot2ndLast-1);
-		if (dot3rdLast === -1) {
-			return host;
-		}
-		return host.substring(dot3rdLast+1);
-	}
 	return host.substring(dot2ndLast+1);
 }
 
 function FindProxyForURL(url, host) {
 	if (url.substring(0,4) == "ftp:")
 		return direct;
-	var domain = host2Domain(host);
-	if (host.length == domain.length) {
-		return directAcc[host] ? direct : httpProxy;
+	if (host.substring(0,7) == "::ffff:")
+		return direct;
+	if (host.indexOf(".local", host.length - 6) !== -1) {
+		return direct;
 	}
-	return (directAcc[host] || directAcc[domain]) ? direct : httpProxy;
+	return (directAcc[host] || directAcc[host2Domain(host)]) ? direct : httpProxy;
 }
 `
 	var err error
@@ -129,15 +94,10 @@ function FindProxyForURL(url, host) {
 		Fatal("Internal error on generating pac file template:", err)
 	}
 
-	var buf bytes.Buffer
-	for k, _ := range topLevelDomain {
-		buf.WriteString(fmt.Sprintf("\t\"%s\": true,\n", k))
-	}
-	pac.topLevelDomain = buf.String()[:buf.Len()-2] // remove the final comma
 }
 
 // No need for content-length as we are closing connection
-var pacHeader = []byte("HTTP/1.1 200 OK\r\nServer: cow-proxy\r\n" +
+var pacHeader = []byte("HTTP/1.1 200 OK\r\nServer: meow-proxy\r\n" +
 	"Content-Type: application/x-ns-proxy-autoconfig\r\nConnection: close\r\n\r\n")
 
 // Different client will have different proxy URL, so generate it upon each request.
@@ -153,7 +113,7 @@ func genPAC(c *clientConn) []byte {
 	if proxyAddr == "" {
 		host, _, err := net.SplitHostPort(c.LocalAddr().String())
 		// This is the only check to split host port on tcp addr's string
-		// representation in COW. Keep it so we will notice if there's any
+		// representation in meow. Keep it so we will notice if there's any
 		// problem in the future.
 		if err != nil {
 			panic("split host port on local address error")
@@ -161,9 +121,14 @@ func genPAC(c *clientConn) []byte {
 		proxyAddr = net.JoinHostPort(host, hproxy.port)
 	}
 
-	dl := getDirectList()
+	directDomains := ""
+	for k, v := range domainList.Domain {
+		if v == domainTypeDirect {
+			directDomains += k + "\",\n\""
+		}
+	}
 
-	if dl == "" {
+	if directDomains == "" {
 		// Empty direct domain list
 		buf.Write(pacHeader)
 		pacproxy := fmt.Sprintf("function FindProxyForURL(url, host) { return 'PROXY %s; DIRECT'; };",
@@ -175,11 +140,9 @@ func genPAC(c *clientConn) []byte {
 	data := struct {
 		ProxyAddr     string
 		DirectDomains string
-		TopLevel      string
 	}{
 		proxyAddr,
-		dl,
-		pac.topLevelDomain,
+		directDomains,
 	}
 
 	buf.Write(pacHeader)
@@ -190,18 +153,6 @@ func genPAC(c *clientConn) []byte {
 	return buf.Bytes()
 }
 
-func initPAC() {
-	// we can't control goroutine scheduling, make sure when
-	// initPAC is done, direct list is updated
-	updateDirectList()
-	go func() {
-		for {
-			time.Sleep(time.Minute)
-			updateDirectList()
-		}
-	}()
-}
-
 func sendPAC(c *clientConn) error {
 	_, err := c.Write(genPAC(c))
 	if err != nil {
diff --git a/pac.js b/pac.js
index 6d49cc0c..a53ead47 100644
--- a/pac.js
+++ b/pac.js
@@ -2,9 +2,9 @@ var direct = 'DIRECT';
 var httpProxy = 'PROXY';
 
 var directList = [
+	"baidu.com",
+	"www.taobao.com"
 	"", // corresponds to simple host name and ip address
-	"taobao.com",
-	"www.baidu.com"
 ];
 
 var directAcc = {};
@@ -12,16 +12,6 @@ for (var i = 0; i < directList.length; i += 1) {
 	directAcc[directList[i]] = true;
 }
 
-var topLevel = {
-        "ac": true,
-        "co": true,
-        "com": true,
-        "edu": true,
-        "gov": true,
-        "net": true,
-        "org": true
-};
-
 // hostIsIP determines whether a host address is an IP address and whether
 // it is private. Currenly only handles IPv4 addresses.
 function hostIsIP(host) {
@@ -72,25 +62,16 @@ function host2Domain(host) {
 	if (dot2ndLast === -1)
 		return host;
 
-	var part = host.substring(dot2ndLast+1, lastDot);
-	if (topLevel[part]) {
-		var dot3rdLast = host.lastIndexOf(".", dot2ndLast-1);
-		if (dot3rdLast === -1) {
-			return host;
-		}
-		return host.substring(dot3rdLast+1);
-	}
 	return host.substring(dot2ndLast+1);
 }
 
 function FindProxyForURL(url, host) {
 	if (url.substring(0,4) == "ftp:")
 		return direct;
-	var domain = host2Domain(host);
-	if (host.length == domain.length) {
-		return directAcc[host] ? direct : httpProxy;
+	if (host.indexOf(".local", host.length - 6) !== -1) {
+		return direct;
 	}
-	return (directAcc[host] || directAcc[domain]) ? direct : httpProxy;
+	return (directAcc[host] || directAcc[host2Domain(host)]) ? direct : httpProxy;
 }
 
 // Tests
@@ -151,16 +132,20 @@ testData = [
 	{ host: '12.20.2.1', mode: httpProxy},
 
 	// host in direct domain/host should return direct
-	{ host: 'taobao.com', mode: direct},
-	{ host: 'www.taobao.com', mode: direct},
+	{ host: 'baidu.com', mode: direct},
 	{ host: 'www.baidu.com', mode: direct},
+	{ host: 'www.taobao.com', mode: direct},
 
 	// host not in direct domain should return proxy
-	{ host: 'baidu.com', mode: httpProxy},
-	{ host: 'foo.baidu.com', mode: httpProxy},
+	{ host: 'taobao.com', mode: httpProxy},
+	{ host: 'foo.taobao.com', mode: httpProxy},
 	{ host: 'google.com', mode: httpProxy},
 	{ host: 'www.google.com', mode: httpProxy},
-	{ host: 'www.google.com.hk', mode: httpProxy}
+	{ host: 'www.google.com.hk', mode: httpProxy},
+
+	// host in local domain should return direct
+	{ host: 'test.local', mode: direct},
+	{ host: '.local', mode: direct},
 ];
 
 for (i = 0; i < testData.length; i += 1) {
diff --git a/parent_proxy.go b/parent_proxy.go
index f78b0b23..d5c05a8f 100644
--- a/parent_proxy.go
+++ b/parent_proxy.go
@@ -1,11 +1,12 @@
 package main
 
 import (
+	"crypto/tls"
 	"encoding/base64"
 	"encoding/binary"
 	"errors"
 	"fmt"
-	ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
+	"hash/crc32"
 	"io"
 	"math/rand"
 	"net"
@@ -13,6 +14,8 @@ import (
 	"strconv"
 	"sync"
 	"time"
+
+	ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
 )
 
 // Interface that all types of parent proxies should support.
@@ -73,8 +76,8 @@ func printParentProxy(parent []ParentWithFail) {
 			debug.Println("\thttp parent: ", pc.server)
 		case *socksParent:
 			debug.Println("\tsocks parent: ", pc.server)
-		case *cowParent:
-			debug.Println("\tcow parent: ", pc.server)
+		case *meowParent:
+			debug.Println("\tmeow parent: ", pc.server)
 		}
 	}
 }
@@ -109,7 +112,7 @@ type hashParentPool struct {
 }
 
 func (pp *hashParentPool) connect(url *URL) (srvconn net.Conn, err error) {
-	start := int(stringHash(url.Host) % uint64(len(pp.parent)))
+	start := int(crc32.ChecksumIEEE([]byte(url.Host)) % uint32(len(pp.parent)))
 	debug.Printf("hash host %s try %d parent first", url.Host, start)
 	return connectInOrder(url, pp.parent, start)
 }
@@ -118,7 +121,7 @@ func (parent *ParentWithFail) connect(url *URL) (srvconn net.Conn, err error) {
 	const maxFailCnt = 30
 	srvconn, err = parent.ParentProxy.connect(url)
 	if err != nil {
-		if parent.fail < maxFailCnt && !networkBad() {
+		if parent.fail < maxFailCnt {
 			parent.fail++
 		}
 		return
@@ -246,18 +249,18 @@ func (parent *ParentWithLatency) updateLatency(wg *sync.WaitGroup) {
 	}
 
 	// Resolve host name first, so latency does not include resolve time.
-	ip, err := net.LookupHost(host)
+	ip, err := net.LookupIP(host)
 	if err != nil {
 		parent.latency = latencyMax
 		return
 	}
-	ipPort := net.JoinHostPort(ip[0], port)
+	ipPort := net.JoinHostPort(ip[0].String(), port)
 
 	const N = 3
 	var total time.Duration
 	for i := 0; i < N; i++ {
 		now := time.Now()
-		cn, err := net.DialTimeout("tcp", ipPort, dialTimeout)
+		cn, err := net.Dial("tcp", ipPort)
 		if err != nil {
 			debug.Println("latency update dial:", err)
 			total += time.Minute // 1 minute as penalty
@@ -288,7 +291,7 @@ func (pp *latencyParentPool) updateLatency() {
 
 	// Sort according to latency.
 	sort.Stable(&cp)
-	debug.Println("lantency lowest proxy", cp.parent[0].getServer())
+	debug.Println("latency lowest proxy", cp.parent[0].getServer())
 
 	// Update parent slice.
 	latencyMutex.Lock()
@@ -308,6 +311,61 @@ func updateParentProxyLatency() {
 	}
 }
 
+type httpsParent struct {
+	server     string
+	userPasswd string // for upgrade config
+	authHeader []byte
+}
+
+type httpsConn struct {
+	net.Conn
+	parent *httpsParent
+}
+
+func (s httpsConn) String() string {
+	return "https parent proxy " + s.parent.server
+}
+
+func newHttpsParent(server string) *httpsParent {
+	return &httpsParent{server: server}
+}
+
+func (hp *httpsParent) getServer() string {
+	return hp.server
+}
+
+func (hp *httpsParent) genConfig() string {
+	if hp.userPasswd != "" {
+		return fmt.Sprintf("proxy = https://%s@%s", hp.userPasswd, hp.server)
+	} else {
+		return fmt.Sprintf("proxy = https://%s", hp.server)
+	}
+}
+
+func (hp *httpsParent) initAuth(userPasswd string) {
+	if userPasswd == "" {
+		return
+	}
+	hp.userPasswd = userPasswd
+	b64 := base64.StdEncoding.EncodeToString([]byte(userPasswd))
+	hp.authHeader = []byte(headerProxyAuthorization + ": Basic " + b64 + CRLF)
+}
+
+func (hp *httpsParent) connect(url *URL) (net.Conn, error) {
+	c, err := tls.Dial("tcp", hp.server, &tls.Config{
+		InsecureSkipVerify: true,
+	})
+	if err != nil {
+		errl.Printf("can't connect to https parent %s for %s: %v\n",
+			hp.server, url.HostPort, err)
+		return nil, err
+	}
+
+	debug.Printf("connected to: %s via https parent: %s\n",
+		url.HostPort, hp.server)
+	return httpsConn{c, hp}, nil
+}
+
 // http parent proxy
 type httpParent struct {
 	server     string
@@ -419,54 +477,54 @@ func (sp *shadowsocksParent) connect(url *URL) (net.Conn, error) {
 	return shadowsocksConn{c, sp}, nil
 }
 
-// cow parent proxy
-type cowParent struct {
+// meow parent proxy
+type meowParent struct {
 	server string
 	method string
 	passwd string
 	cipher *ss.Cipher
 }
 
-type cowConn struct {
+type meowConn struct {
 	net.Conn
-	parent *cowParent
+	parent *meowParent
 }
 
-func (s cowConn) String() string {
-	return "cow proxy " + s.parent.server
+func (s meowConn) String() string {
+	return "meow proxy " + s.parent.server
 }
 
-func newCowParent(srv, method, passwd string) *cowParent {
+func newMeowParent(srv, method, passwd string) *meowParent {
 	cipher, err := ss.NewCipher(method, passwd)
 	if err != nil {
-		Fatal("create cow cipher:", err)
+		Fatal("create meow cipher:", err)
 	}
-	return &cowParent{srv, method, passwd, cipher}
+	return &meowParent{srv, method, passwd, cipher}
 }
 
-func (cp *cowParent) getServer() string {
+func (cp *meowParent) getServer() string {
 	return cp.server
 }
 
-func (cp *cowParent) genConfig() string {
+func (cp *meowParent) genConfig() string {
 	method := cp.method
 	if method == "" {
 		method = "table"
 	}
-	return fmt.Sprintf("proxy = cow://%s:%s@%s", method, cp.passwd, cp.server)
+	return fmt.Sprintf("proxy = meow://%s:%s@%s", method, cp.passwd, cp.server)
 }
 
-func (cp *cowParent) connect(url *URL) (net.Conn, error) {
+func (cp *meowParent) connect(url *URL) (net.Conn, error) {
 	c, err := net.Dial("tcp", cp.server)
 	if err != nil {
-		errl.Printf("can't connect to cow parent %s for %s: %v\n",
+		errl.Printf("can't connect to meow parent %s for %s: %v\n",
 			cp.server, url.HostPort, err)
 		return nil, err
 	}
-	debug.Printf("connected to: %s via cow parent: %s\n",
+	debug.Printf("connected to: %s via meow parent: %s\n",
 		url.HostPort, cp.server)
 	ssconn := ss.NewConn(c, cp.cipher.Copy())
-	return cowConn{ssconn, cp}, nil
+	return meowConn{ssconn, cp}, nil
 }
 
 // For socks documentation, refer to rfc 1928 http://www.ietf.org/rfc/rfc1928.txt
diff --git a/proxy.go b/proxy.go
index 29c7a175..24c4a26a 100644
--- a/proxy.go
+++ b/proxy.go
@@ -2,16 +2,20 @@ package main
 
 import (
 	"bytes"
+	"crypto/tls"
 	"errors"
 	"fmt"
-	"github.com/cyfdecyf/bufio"
-	"github.com/cyfdecyf/leakybuf"
-	ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
 	"io"
 	"net"
 	"strings"
 	"sync"
 	"time"
+	"os"
+	"syscall"
+
+	"github.com/cyfdecyf/bufio"
+	"github.com/cyfdecyf/leakybuf"
+	ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
 )
 
 // As I'm using ReadSlice to read line, it's possible to get
@@ -33,35 +37,17 @@ const httpBufSize = 8192
 var httpBuf = leakybuf.NewLeakyBuf(512, httpBufSize)
 
 // If no keep-alive header in response, use this as the keep-alive value.
-const defaultServerConnTimeout = 15 * time.Second
+const defaultServerConnTimeout = 5 * time.Second
 
 // Close client connection if no new requests received in some time.
 // (On OS X, the default soft limit of open file descriptor is 256, which is
 // very conservative and easy to cause problem if we are not careful to limit
 // open fds.)
-const clientConnTimeout = 15 * time.Second
-const fullKeepAliveHeader = "Keep-Alive: timeout=15\r\n"
-
-// If client closed connection for HTTP CONNECT method in less then 1 second,
-// consider it as an ssl error. This is only effective for Chrome which will
-// drop connection immediately upon SSL error.
-const sslLeastDuration = time.Second
+const clientConnTimeout = 5 * time.Second
+const fullKeepAliveHeader = "Keep-Alive: timeout=5\r\n"
 
 // Some code are learnt from the http package
 
-// encapulate actual error for an retry error
-type RetryError struct {
-	error
-}
-
-func isErrRetry(err error) bool {
-	if err == nil {
-		return false
-	}
-	_, ok := err.(RetryError)
-	return ok
-}
-
 var zeroTime time.Time
 
 type directConn struct {
@@ -87,8 +73,7 @@ type serverConn struct {
 	hostPort    string
 	state       serverConnState
 	willCloseOn time.Time
-	siteInfo    *VisitCnt
-	visited     bool
+	direct      bool
 }
 
 type clientConn struct {
@@ -120,21 +105,22 @@ type httpProxy struct {
 	addr      string // listen address, contains port
 	port      string // for use when generating PAC
 	addrInPAC string // proxy server address to use in PAC
+	proto     string
 }
 
-func newHttpProxy(addr, addrInPAC string) *httpProxy {
+func newHttpProxy(addr, addrInPAC string, proto string) *httpProxy {
 	_, port, err := net.SplitHostPort(addr)
 	if err != nil {
 		panic("proxy addr" + err.Error())
 	}
-	return &httpProxy{addr, port, addrInPAC}
+	return &httpProxy{addr, port, addrInPAC, proto}
 }
 
 func (proxy *httpProxy) genConfig() string {
 	if proxy.addrInPAC != "" {
-		return fmt.Sprintf("listen = http://%s %s", proxy.addr, proxy.addrInPAC)
+		return fmt.Sprintf("listen = %s://%s %s", proxy.proto, proxy.addr, proxy.addrInPAC)
 	} else {
-		return fmt.Sprintf("listen = http://%s", proxy.addr)
+		return fmt.Sprintf("listen = %s://%s", proxy.proto, proxy.addr)
 	}
 }
 
@@ -143,29 +129,48 @@ func (proxy *httpProxy) Addr() string {
 }
 
 func (hp *httpProxy) Serve(wg *sync.WaitGroup) {
+	var err error
+	var ln net.Listener
 	defer func() {
 		wg.Done()
 	}()
-	ln, err := net.Listen("tcp", hp.addr)
+
+	if hp.proto == "https" {
+		cert, err := tls.LoadX509KeyPair(config.Cert, config.Key)
+		if err != nil {
+			fmt.Println("cert error:", err.Error())
+			return
+		}
+		config := tls.Config{
+			Certificates:             []tls.Certificate{cert},
+			InsecureSkipVerify:       false,
+			MinVersion:               tls.VersionTLS11,
+			PreferServerCipherSuites: true,
+		}
+		ln, err = tls.Listen("tcp", hp.addr, &config)
+	} else {
+		ln, err = net.Listen("tcp", hp.addr)
+	}
+
 	if err != nil {
-		fmt.Println("listen http failed:", err)
+		fmt.Println("listen", hp.proto, "failed:", err)
 		return
 	}
 	host, _, _ := net.SplitHostPort(hp.addr)
 	var pacURL string
 	if host == "" || host == "0.0.0.0" {
-		pacURL = fmt.Sprintf("http://<hostip>:%s/pac", hp.port)
+		pacURL = fmt.Sprintf("%s://<hostip>:%s/pac", hp.proto, hp.port)
 	} else if hp.addrInPAC == "" {
-		pacURL = fmt.Sprintf("http://%s/pac", hp.addr)
+		pacURL = fmt.Sprintf("%s://%s/pac", hp.proto, hp.addr)
 	} else {
-		pacURL = fmt.Sprintf("http://%s/pac", hp.addrInPAC)
+		pacURL = fmt.Sprintf("%s://%s/pac", hp.proto, hp.addrInPAC)
 	}
-	info.Printf("COW %s listen http %s, PAC url %s\n", version, hp.addr, pacURL)
+	info.Printf("listen %s %s, PAC url %s\n", hp.proto, hp.addr, pacURL)
 
 	for {
 		conn, err := ln.Accept()
 		if err != nil {
-			errl.Printf("http proxy(%s) accept %v\n", ln.Addr(), err)
+			errl.Printf("%s proxy(%s) accept %v\n", hp.proto, ln.Addr(), err)
 			if isErrTooManyOpenFd(err) {
 				connPool.CloseAll()
 			}
@@ -177,48 +182,48 @@ func (hp *httpProxy) Serve(wg *sync.WaitGroup) {
 	}
 }
 
-type cowProxy struct {
+type meowProxy struct {
 	addr   string
 	method string
 	passwd string
 	cipher *ss.Cipher
 }
 
-func newCowProxy(method, passwd, addr string) *cowProxy {
+func newMeowProxy(method, passwd, addr string) *meowProxy {
 	cipher, err := ss.NewCipher(method, passwd)
 	if err != nil {
-		Fatal("can't initialize cow proxy server", err)
+		Fatal("can't initialize meow proxy server", err)
 	}
-	return &cowProxy{addr, method, passwd, cipher}
+	return &meowProxy{addr, method, passwd, cipher}
 }
 
-func (cp *cowProxy) genConfig() string {
+func (cp *meowProxy) genConfig() string {
 	method := cp.method
 	if method == "" {
 		method = "table"
 	}
-	return fmt.Sprintf("listen = cow://%s:%s@%s", method, cp.passwd, cp.addr)
+	return fmt.Sprintf("listen = meow://%s:%s@%s", method, cp.passwd, cp.addr)
 }
 
-func (cp *cowProxy) Addr() string {
+func (cp *meowProxy) Addr() string {
 	return cp.addr
 }
 
-func (cp *cowProxy) Serve(wg *sync.WaitGroup) {
+func (cp *meowProxy) Serve(wg *sync.WaitGroup) {
 	defer func() {
 		wg.Done()
 	}()
 	ln, err := net.Listen("tcp", cp.addr)
 	if err != nil {
-		fmt.Println("listen cow failed:", err)
+		fmt.Println("listen meow failed:", err)
 		return
 	}
-	info.Printf("COW %s cow proxy address %s\n", version, cp.addr)
+	info.Printf("meow proxy address %s\n", cp.addr)
 
 	for {
 		conn, err := ln.Accept()
 		if err != nil {
-			errl.Printf("cow proxy(%s) accept %v\n", ln.Addr(), err)
+			errl.Printf("meow proxy(%s) accept %v\n", ln.Addr(), err)
 			if isErrTooManyOpenFd(err) {
 				connPool.CloseAll()
 			}
@@ -265,7 +270,7 @@ func (c *clientConn) Close() {
 }
 
 func (c *clientConn) setReadTimeout(msg string) {
-	// Always keep connections alive for cow conn from client for more reuse.
+	// Always keep connections alive for meow conn from client for more reuse.
 	// For other client connections, set read timeout so we can close the
 	// connection after a period of idle to reduce number of open connections.
 	if _, ok := c.Conn.(*ss.Conn); !ok {
@@ -280,6 +285,19 @@ func (c *clientConn) unsetReadTimeout(msg string) {
 	}
 }
 
+func setConnReadTimeout(cn net.Conn, d time.Duration, msg string) {
+	if err := cn.SetReadDeadline(time.Now().Add(d)); err != nil {
+		errl.Println("set readtimeout:", msg, err)
+	}
+}
+
+func unsetConnReadTimeout(cn net.Conn, msg string) {
+	if err := cn.SetReadDeadline(zeroTime); err != nil {
+		// It's possible that conn has been closed, so use debug log.
+		debug.Println("unset readtimeout:", msg, err)
+	}
+}
+
 // Listen address as key, not including port part.
 var selfListenAddr map[string]bool
 
@@ -296,6 +314,7 @@ func initSelfListenAddr() {
 				selfListenAddr[ad] = true
 			}
 			selfListenAddr["localhost"] = true
+			selfListenAddr["127.0.0.1"] = true
 			continue
 		}
 
@@ -318,8 +337,8 @@ func isSelfRequest(r *Request) bool {
 	}
 	// Maxthon sometimes sends requests without host in request line,
 	// in that case, get host information from Host header.
-	// But if client PAC setting is using cow server's DNS name, we can't
-	// decide if the request is for cow itself (need reverse lookup).
+	// But if client PAC setting is using meow server's DNS name, we can't
+	// decide if the request is for meow itself (need reverse lookup).
 	// So if request path seems like getting PAC, simply return true.
 	if r.URL.Path == "/pac" || strings.HasPrefix(r.URL.Path, "/pac?") {
 		return true
@@ -347,62 +366,28 @@ func (c *clientConn) serveSelfURL(r *Request) (err error) {
 	}
 end:
 	sendErrorPage(c, "404 not found", "Page not found",
-		genErrMsg(r, nil, "Serving request to COW proxy."))
-	errl.Printf("cli(%s) page not found, serving request to cow %s\n%s",
+		genErrMsg(r, nil, "Serving request to meow proxy."))
+	errl.Printf("cli(%s) page not found, serving request to meow %s\n%s",
 		c.RemoteAddr(), r, r.Verbose())
 	return errPageSent
 }
 
-func (c *clientConn) shouldRetry(r *Request, sv *serverConn, re error) bool {
-	if !isErrRetry(re) {
-		return false
-	}
-	err, _ := re.(RetryError)
-	if !r.responseNotSent() {
-		if debug {
-			debug.Printf("cli(%s) has sent some response, can't retry %v\n", c.RemoteAddr(), r)
-		}
-		return false
-	}
-	if r.partial {
-		if debug {
-			debug.Printf("cli(%s) partial request, can't retry %v\n", c.RemoteAddr(), r)
-		}
-		sendErrorPage(c, "502 partial request", err.Error(),
-			genErrMsg(r, sv, "Request is too large to hold in buffer, can't retry. "+
-				"Refresh to retry may work."))
-		return false
-	} else if r.raw == nil {
-		msg := "Please report issue to the developer: Non partial request with buffer released"
-		errl.Println(msg, r)
-		panic(msg)
-	}
-	if r.tooManyRetry() {
-		if sv.maybeFake() {
-			// Sometimes GFW reset will got EOF error leading to retry too many times.
-			// In that case, consider the url as temp blocked and try parent proxy.
-			siteStat.TempBlocked(r.URL)
-			r.tryCnt = 0
-			return true
-		}
-		debug.Printf("cli(%s) can't retry %v tryCnt=%d\n", c.RemoteAddr(), r, r.tryCnt)
-		sendErrorPage(c, "502 retry failed", "Can't finish HTTP request",
-			genErrMsg(r, sv, "Has tried several times."))
-		return false
-	}
-	return true
-}
-
-func dbgPrintRq(c *clientConn, r *Request) {
+func dbgPrintRq(c *clientConn, r *Request, direct bool) {
 	if r.Trailer {
 		errl.Printf("cli(%s) request  %s has Trailer header\n%s",
 			c.RemoteAddr(), r, r.Verbose())
 	}
 	if dbgRq {
+		var connType string
+		if direct {
+			connType = "DIRECT"
+		} else {
+			connType = "PROXY"
+		}
 		if verbose {
-			dbgRq.Printf("cli(%s) request  %s\n%s", c.RemoteAddr(), r, r.Verbose())
+			dbgRq.Printf("%s %s %s\n%s\n", connType, c.RemoteAddr(), r, r.Verbose())
 		} else {
-			dbgRq.Printf("cli(%s) request  %s\n", c.RemoteAddr(), r)
+			dbgRq.Printf("%s %s %s\n", connType, c.RemoteAddr(), r)
 		}
 	}
 }
@@ -420,8 +405,8 @@ func (c *clientConn) serve() {
 	var err error
 
 	var authed bool
-	// For cow proxy server, authentication is done by matching password.
-	if _, ok := c.proxy.(*cowProxy); ok {
+	// For meow proxy server, authentication is done by matching password.
+	if _, ok := c.proxy.(*meowProxy); ok {
 		authed = true
 	}
 
@@ -450,9 +435,8 @@ func (c *clientConn) serve() {
 				"Your browser didn't send a complete request in time.")
 			return
 		}
-		dbgPrintRq(c, &r)
 
-		// PAC may leak frequently visited sites information. But if cow
+		// PAC may leak frequently visited sites information. But if meow
 		// requires authentication for PAC, some clients may not be able
 		// handle it. (e.g. Proxy SwitchySharp extension on Chrome.)
 		if isSelfRequest(&r) {
@@ -473,15 +457,9 @@ func (c *clientConn) serve() {
 			authed = true
 		}
 
-		if r.isConnect && !config.TunnelAllowedPort[r.URL.Port] {
-			sendErrorPage(c, statusForbidden, "Forbidden tunnel port",
-				genErrMsg(&r, nil, "Please contact proxy admin."))
-			return
-		}
-
 		if r.ExpectContinue {
 			sendErrorPage(c, statusExpectFailed, "Expect header not supported",
-				"Please contact COW's developer if you see this.")
+				"Please contact meow's developer if you see this.")
 			// Client may have sent request body at this point. Simply close
 			// connection so we don't need to handle this case.
 			// NOTE: sendErrorPage tells client the connection will keep alive, but
@@ -489,11 +467,6 @@ func (c *clientConn) serve() {
 			return
 		}
 
-	retry:
-		r.tryOnce()
-		if bool(debug) && r.isRetry() {
-			debug.Printf("cli(%s) retry request tryCnt=%d %v\n", c.RemoteAddr(), r.tryCnt, &r)
-		}
 		if sv, err = c.getServerConn(&r); err != nil {
 			if debug {
 				debug.Printf("cli(%s) failed to get server conn %v\n", c.RemoteAddr(), &r)
@@ -515,9 +488,6 @@ func (c *clientConn) serve() {
 		if r.isConnect {
 			// server connection will be closed in doConnect
 			err = sv.doConnect(&r, c)
-			if c.shouldRetry(&r, sv, err) {
-				goto retry
-			}
 			// debug.Printf("doConnect %s to %s done\n", c.RemoteAddr(), r.URL.HostPort)
 			return
 		}
@@ -526,9 +496,7 @@ func (c *clientConn) serve() {
 			// For client I/O error, we can actually put server connection to
 			// pool. But let's make thing simple for now.
 			sv.Close()
-			if c.shouldRetry(&r, sv, err) {
-				goto retry
-			} else if err == errPageSent && (!r.hasBody() || r.hasSent()) {
+			if err == errPageSent && (!r.hasBody() || r.hasSent()) {
 				// Can only continue if request has no body, or request body
 				// has been read.
 				continue
@@ -536,8 +504,8 @@ func (c *clientConn) serve() {
 			return
 		}
 		// Put server connection to pool, so other clients can use it.
-		_, isCowConn := sv.Conn.(cowConn)
-		if rp.ConnectionKeepAlive || isCowConn {
+		_, isMeowConn := sv.Conn.(meowConn)
+		if rp.ConnectionKeepAlive || isMeowConn {
 			if debug {
 				debug.Printf("cli(%s) connPool put %s", c.RemoteAddr(), sv.hostPort)
 			}
@@ -569,21 +537,16 @@ func genErrMsg(r *Request, sv *serverConn, what string) string {
 		r, what, sv.Conn)
 }
 
-func (c *clientConn) handleBlockedRequest(r *Request, err error) error {
-	siteStat.TempBlocked(r.URL)
-	return RetryError{err}
-}
-
 func (c *clientConn) handleServerReadError(r *Request, sv *serverConn, err error, msg string) error {
 	if debug {
 		debug.Printf("cli(%s) server read error %s %T %v %v\n",
 			c.RemoteAddr(), msg, err, err, r)
 	}
 	if err == io.EOF {
-		return RetryError{err}
+		return err
 	}
-	if sv.maybeFake() && maybeBlocked(err) {
-		return c.handleBlockedRequest(r, err)
+	if isErrTimeout(err) || isErrConnReset(err) || isHttpErrCode(err) {
+		return err
 	}
 	if r.responseNotSent() {
 		sendErrorPage(c, "502 read error", err.Error(), genErrMsg(r, sv, msg))
@@ -594,12 +557,7 @@ func (c *clientConn) handleServerReadError(r *Request, sv *serverConn, err error
 }
 
 func (c *clientConn) handleServerWriteError(r *Request, sv *serverConn, err error, msg string) error {
-	// This function is only called in doRequest, no response is sent to client.
-	// So if visiting blocked site, can always retry request.
-	if sv.maybeFake() && isErrConnReset(err) {
-		siteStat.TempBlocked(r.URL)
-	}
-	return RetryError{err}
+	return err
 }
 
 func dbgPrintRep(c *clientConn, r *Request, rp *Response) {
@@ -609,11 +567,9 @@ func dbgPrintRep(c *clientConn, r *Request, rp *Response) {
 	}
 	if dbgRep {
 		if verbose {
-			dbgRep.Printf("cli(%s) response %s %s\n%s",
-				c.RemoteAddr(), r, rp, rp.Verbose())
+			dbgRep.Printf("%s %s\n%s", r, rp, rp.Verbose())
 		} else {
-			dbgRep.Printf("cli(%s) response %s %s\n",
-				c.RemoteAddr(), r, rp)
+			dbgRep.Printf("%s %s\n", r, rp)
 		}
 	}
 }
@@ -694,12 +650,18 @@ func (c *clientConn) readResponse(sv *serverConn, r *Request, rp *Response) (err
 }
 
 func (c *clientConn) getServerConn(r *Request) (*serverConn, error) {
-	siteInfo := siteStat.GetVisitCnt(r.URL)
+	domainType := domainList.judge(r.URL)
 	// For CONNECT method, always create new connection.
+	direct := (domainType == domainTypeDirect)
+	if domainType == domainTypeReject {
+		dbgRq.Printf("%s REJECT\n", r.URL)
+		return nil, errors.New("Reject")
+	}
+
 	if r.isConnect {
-		return c.createServerConn(r, siteInfo)
+		return c.createServerConn(r, direct)
 	}
-	sv := connPool.Get(r.URL.HostPort, siteInfo.AsDirect())
+	sv := connPool.Get(r.URL.HostPort, direct)
 	if sv != nil {
 		// For websites like feedly, the site itself is not blocked, but the
 		// content it loads may result reset. So we should reset server
@@ -713,30 +675,17 @@ func (c *clientConn) getServerConn(r *Request) (*serverConn, error) {
 	if debug {
 		debug.Printf("cli(%s) connPool no conn %s", c.RemoteAddr(), r.URL.HostPort)
 	}
-	return c.createServerConn(r, siteInfo)
+	return c.createServerConn(r, direct)
 }
 
-func connectDirect2(url *URL, siteInfo *VisitCnt, recursive bool) (net.Conn, error) {
+func connectDirect2(url *URL, recursive bool) (net.Conn, error) {
 	var c net.Conn
 	var err error
-	if siteInfo.AlwaysDirect() {
-		c, err = net.Dial("tcp", url.HostPort)
-	} else {
-		to := dialTimeout
-		if siteInfo.OnceBlocked() && to >= defaultDialTimeout {
-			// If once blocked, decrease timeout to switch to parent proxy faster.
-			to = minDialTimeout
-		} else if siteInfo.AsDirect() {
-			// If usually can be accessed directly, increase timeout to avoid
-			// problems when network condition is bad.
-			to = maxTimeout
-		}
-		c, err = net.DialTimeout("tcp", url.HostPort, to)
-	}
+	c, err = net.Dial("tcp", url.HostPort)
 	if err != nil {
 		debug.Printf("error direct connect to: %s %v\n", url.HostPort, err)
 		if isErrTooManyOpenFd(err) && !recursive {
-			return connectDirect2(url, siteInfo, true)
+			return connectDirect2(url, true)
 		}
 		return nil, err
 	}
@@ -744,8 +693,8 @@ func connectDirect2(url *URL, siteInfo *VisitCnt, recursive bool) (net.Conn, err
 	return directConn{c}, nil
 }
 
-func connectDirect(url *URL, siteInfo *VisitCnt) (net.Conn, error) {
-	return connectDirect2(url, siteInfo, false)
+func connectDirect(url *URL) (net.Conn, error) {
+	return connectDirect2(url, false)
 }
 
 func isErrTimeout(err error) bool {
@@ -765,87 +714,54 @@ func isHttpErrCode(err error) bool {
 	return false
 }
 
-func maybeBlocked(err error) bool {
-	if parentProxy.empty() {
-		return false
+func isErrTooManyOpenFd(err error) bool {
+	if ne, ok := err.(*net.OpError); ok {
+		if se, seok := ne.Err.(*os.SyscallError); seok && (se.Err == syscall.EMFILE || se.Err == syscall.ENFILE) {
+			errl.Println("too many open fd")
+			return true
+		}
 	}
-	return isErrTimeout(err) || isErrConnReset(err) || isHttpErrCode(err)
+	return false
 }
 
+// MEOW !!!
 // Connect to requested server according to whether it's visit count.
 // If direct connection fails, try parent proxies.
-func (c *clientConn) connect(r *Request, siteInfo *VisitCnt) (srvconn net.Conn, err error) {
+func (c *clientConn) connect(r *Request, direct bool) (srvconn net.Conn, err error) {
 	var errMsg string
-	if config.AlwaysProxy {
-		if srvconn, err = parentProxy.connect(r.URL); err == nil {
+
+	if direct {
+		dbgPrintRq(c, r, true)
+		if srvconn, err = connectDirect(r.URL); err == nil {
 			return
 		}
-		errMsg = genErrMsg(r, nil, "Parent proxy connection failed, always use parent proxy.")
+		errMsg = genErrMsg(r, nil, "Direct connection failed.")
 		goto fail
 	}
-	if siteInfo.AsBlocked() && !parentProxy.empty() {
-		// In case of connection error to socks server, fallback to direct connection
-		if srvconn, err = parentProxy.connect(r.URL); err == nil {
-			return
-		}
-		if siteInfo.AlwaysBlocked() {
-			errMsg = genErrMsg(r, nil, "Parent proxy connection failed, always blocked site.")
-			goto fail
-		}
-		if siteInfo.AsTempBlocked() {
-			errMsg = genErrMsg(r, nil, "Parent proxy connection failed, temporarily blocked site.")
-			goto fail
-		}
-		if srvconn, err = connectDirect(r.URL, siteInfo); err == nil {
-			return
-		}
-		errMsg = genErrMsg(r, nil, "Parent proxy and direct connection failed, maybe blocked site.")
-	} else {
-		// In case of error on direction connection, try parent server
-		if srvconn, err = connectDirect(r.URL, siteInfo); err == nil {
-			return
-		}
-		if parentProxy.empty() {
-			errMsg = genErrMsg(r, nil, "Direct connection failed, no parent proxy.")
-			goto fail
-		}
-		if siteInfo.AlwaysDirect() {
-			errMsg = genErrMsg(r, nil, "Direct connection failed, always direct site.")
-			goto fail
-		}
-		// net.Dial does two things: DNS lookup and TCP connection.
-		// GFW may cause failure here: make it time out or reset connection.
-		// debug.Printf("type of err %T %v\n", err, err)
-
-		// RST during TCP handshake is valid and would return as connection
-		// refused error. My observation is that GFW does not use RST to stop
-		// TCP handshake.
-		// To simplify things and avoid error in my observation, always try
-		// parent proxy in case of Dial error.
-		var socksErr error
-		if srvconn, socksErr = parentProxy.connect(r.URL); socksErr == nil {
-			c.handleBlockedRequest(r, err)
-			if debug {
-				debug.Printf("cli(%s) direct connection failed, use parent proxy for %v\n",
-					c.RemoteAddr(), r)
-			}
-			return srvconn, nil
-		}
-		errMsg = genErrMsg(r, nil,
-			"Direct and parent proxy connection failed, maybe blocked site.")
+
+	if parentProxy.empty() {
+		errMsg = genErrMsg(r, nil, "No parent proxy.")
+		goto fail
 	}
 
+	// “我向来是不惮以最坏的恶意来揣测中国人的”
+	dbgPrintRq(c, r, false)
+	if srvconn, err = parentProxy.connect(r.URL); err == nil {
+		return
+	}
+	errMsg = genErrMsg(r, nil, "Parent proxy connection failed.")
+
 fail:
 	sendErrorPage(c, "504 Connection failed", err.Error(), errMsg)
 	return nil, errPageSent
 }
 
-func (c *clientConn) createServerConn(r *Request, siteInfo *VisitCnt) (*serverConn, error) {
-	srvconn, err := c.connect(r, siteInfo)
+func (c *clientConn) createServerConn(r *Request, direct bool) (*serverConn, error) {
+	srvconn, err := c.connect(r, direct)
 	if err != nil {
 		return nil, err
 	}
-	sv := newServerConn(srvconn, r.URL.HostPort, siteInfo)
+	sv := newServerConn(srvconn, r.URL.HostPort, direct)
 	if debug {
 		debug.Printf("cli(%s) connected to %s %d concurrent connections\n",
 			c.RemoteAddr(), sv.hostPort, incSrvConnCnt(sv.hostPort))
@@ -856,11 +772,11 @@ func (c *clientConn) createServerConn(r *Request, siteInfo *VisitCnt) (*serverCo
 // Should call initBuf before reading http response from server. This allows
 // us not init buf for connect method which does not need to parse http
 // respnose.
-func newServerConn(c net.Conn, hostPort string, siteInfo *VisitCnt) *serverConn {
+func newServerConn(c net.Conn, hostPort string, direct bool) *serverConn {
 	sv := &serverConn{
 		Conn:     c,
 		hostPort: hostPort,
-		siteInfo: siteInfo,
+		direct:   direct,
 	}
 	return sv
 }
@@ -870,18 +786,6 @@ func (sv *serverConn) isDirect() bool {
 	return ok
 }
 
-func (sv *serverConn) updateVisit() {
-	if sv.visited {
-		return
-	}
-	sv.visited = true
-	if sv.isDirect() {
-		sv.siteInfo.DirectVisit()
-	} else {
-		sv.siteInfo.BlockedVisit()
-	}
-}
-
 func (sv *serverConn) initBuf() {
 	if sv.bufRd == nil {
 		sv.buf = httpBuf.Get()
@@ -907,47 +811,9 @@ func (sv *serverConn) Close() error {
 	return sv.Conn.Close()
 }
 
-func (sv *serverConn) maybeFake() bool {
-	return sv.state == svConnected && sv.isDirect() && !sv.siteInfo.AlwaysDirect()
-}
-
-func setConnReadTimeout(cn net.Conn, d time.Duration, msg string) {
-	if err := cn.SetReadDeadline(time.Now().Add(d)); err != nil {
-		errl.Println("set readtimeout:", msg, err)
-	}
-}
-
-func unsetConnReadTimeout(cn net.Conn, msg string) {
-	if err := cn.SetReadDeadline(zeroTime); err != nil {
-		// It's possible that conn has been closed, so use debug log.
-		debug.Println("unset readtimeout:", msg, err)
-	}
-}
-
-func (sv *serverConn) setReadTimeout(msg string) {
-	to := readTimeout
-	if sv.siteInfo.OnceBlocked() && to > defaultReadTimeout {
-		to = minReadTimeout
-	} else if sv.siteInfo.AsDirect() {
-		to = maxTimeout
-	}
-	setConnReadTimeout(sv.Conn, to, msg)
-}
-
-func (sv *serverConn) unsetReadTimeout(msg string) {
-	unsetConnReadTimeout(sv.Conn, msg)
-}
-
-func (sv *serverConn) maybeSSLErr(cliStart time.Time) bool {
-	// If client closes connection very soon, maybe there's SSL error, maybe
-	// not (e.g. user stopped request).
-	// COW can't tell which is the case, so this detection is not reliable.
-	return sv.state > svConnected && time.Now().Sub(cliStart) < sslLeastDuration
-}
-
 func (sv *serverConn) mayBeClosed() bool {
-	if _, ok := sv.Conn.(cowConn); ok {
-		debug.Println("cow parent would keep alive")
+	if _, ok := sv.Conn.(meowConn); ok {
+		debug.Println("meow parent would keep alive")
 		return false
 	}
 	return time.Now().After(sv.willCloseOn)
@@ -976,24 +842,10 @@ func copyServer2Client(sv *serverConn, c *clientConn, r *Request) (err error) {
 	*/
 
 	total := 0
-	const directThreshold = 8192
-	readTimeoutSet := false
 	for {
 		// debug.Println("srv->cli")
-		if sv.maybeFake() {
-			sv.setReadTimeout("srv->cli")
-			readTimeoutSet = true
-		} else if readTimeoutSet {
-			sv.unsetReadTimeout("srv->cli")
-			readTimeoutSet = false
-		}
 		var n int
 		if n, err = sv.Read(buf); err != nil {
-			if sv.maybeFake() && maybeBlocked(err) {
-				siteStat.TempBlocked(r.URL)
-				debug.Printf("srv->cli blocked site %s detected, err: %v retry\n", r.URL.HostPort, err)
-				return RetryError{err}
-			}
 			// Expected error besides EOF: "use of closed network connection",
 			// this is to make blocking read return.
 			// debug.Printf("copyServer2Client read data: %v\n", err)
@@ -1008,9 +860,6 @@ func copyServer2Client(sv *serverConn, c *clientConn, r *Request) (err error) {
 		// set state to rsRecvBody to indicate the request has partial response sent to client
 		r.state = rsRecvBody
 		sv.state = svSendRecvResponse
-		if total > directThreshold {
-			sv.updateVisit()
-		}
 	}
 }
 
@@ -1031,7 +880,7 @@ func (sw *serverWriter) Write(p []byte) (int, error) {
 		// buffer released
 	} else if sw.rq.raw.Len() >= 2*httpBufSize {
 		// Avoid using too much memory to hold request body. If a request is
-		// not buffered completely, COW can't retry and can release memory
+		// not buffered completely, meow can't retry and can release memory
 		// immediately.
 		debug.Println(sw.rq, "request body too large, not buffering any more")
 		sw.rq.releaseBuf()
@@ -1045,31 +894,8 @@ func (sw *serverWriter) Write(p []byte) (int, error) {
 }
 
 func copyClient2Server(c *clientConn, sv *serverConn, r *Request, srvStopped notification, done chan struct{}) (err error) {
-	// sv.maybeFake may change during execution in this function.
-	// So need a variable to record the whether timeout is set.
-	deadlineIsSet := false
-	defer func() {
-		if deadlineIsSet {
-			// May need to retry, unset timeout here to avoid read client
-			// timeout on retry. Note c.Conn maybe closed when calling this.
-			unsetConnReadTimeout(c.Conn, "cli->srv after err")
-		}
-		close(done)
-	}()
-
 	var n int
 
-	if r.isRetry() {
-		if debug {
-			debug.Printf("cli(%s)->srv(%s) retry request %d bytes of buffered body\n",
-				c.RemoteAddr(), r.URL.HostPort, len(r.rawBody()))
-		}
-		if _, err = sv.Write(r.rawBody()); err != nil {
-			debug.Println("cli->srv send to server error")
-			return
-		}
-	}
-
 	w := newServerWriter(r, sv)
 	if c.bufRd != nil {
 		n = c.bufRd.Buffered()
@@ -1087,51 +913,28 @@ func copyClient2Server(c *clientConn, sv *serverConn, r *Request, srvStopped not
 		c.releaseBuf()
 	}
 
-	var start time.Time
-	if config.DetectSSLErr {
-		start = time.Now()
-	}
 	buf := connectBuf.Get()
 	defer func() {
 		connectBuf.Put(buf)
 	}()
 	for {
-		// debug.Println("cli->srv")
-		if sv.maybeFake() {
-			setConnReadTimeout(c.Conn, time.Second, "cli->srv")
-			deadlineIsSet = true
-		} else if deadlineIsSet {
-			// maybeFake may trun to false after timeout, but timeout should be unset
-			unsetConnReadTimeout(c.Conn, "cli->srv before read")
-			deadlineIsSet = false
-		}
+		// debug.Println("908: cli->srv")
 		if n, err = c.Read(buf); err != nil {
-			if config.DetectSSLErr && sv.maybeFake() && (isErrConnReset(err) || err == io.EOF) &&
-				sv.maybeSSLErr(start) {
-				debug.Println("client connection closed very soon, taken as SSL error:", r)
-				siteStat.TempBlocked(r.URL)
-			} else if isErrTimeout(err) && !srvStopped.hasNotified() {
-				// debug.Printf("cli(%s)->srv(%s) timeout\n", c.RemoteAddr(), r.URL.HostPort)
+			if isErrTimeout(err) && !srvStopped.hasNotified() {
+				debug.Printf("911: cli(%s)->srv(%s) timeout\n", c.RemoteAddr(), r.URL.HostPort)
 				continue
 			}
-			// debug.Printf("cli->srv read err: %v\n", err)
+			debug.Printf("914: cli->srv read err: %v\n", err)
 			return
 		}
 
 		// copyServer2Client will detect write to closed server. Just store client content for retry.
 		if _, err = w.Write(buf[:n]); err != nil {
 			// XXX is it enough to only do block detection in copyServer2Client?
-			/*
-				if sv.maybeFake() && isErrConnReset(err) {
-					siteStat.TempBlocked(r.URL)
-					errl.Printf("copyClient2Server blocked site %d detected, retry\n", r.URL.HostPort)
-					return RetryError{err}
-				}
-			*/
-			// debug.Printf("cli->srv write err: %v\n", err)
+			debug.Printf("921: cli->srv write err: %v\n", err)
 			return
 		}
-		// debug.Printf("cli(%s)->srv(%s) sent %d bytes data\n", c.RemoteAddr(), r.URL.HostPort, n)
+		// debug.Printf("924: cli(%s)->srv(%s) sent %d bytes data\n", c.RemoteAddr(), r.URL.HostPort, n)
 	}
 }
 
@@ -1142,8 +945,9 @@ func (sv *serverConn) doConnect(r *Request, c *clientConn) (err error) {
 	r.state = rsCreated
 
 	_, isHttpConn := sv.Conn.(httpConn)
-	_, isCowConn := sv.Conn.(cowConn)
-	if isHttpConn || isCowConn {
+	_, isHttpsConn := sv.Conn.(httpsConn)
+	_, isMeowConn := sv.Conn.(meowConn)
+	if isHttpConn || isHttpsConn || isMeowConn {
 		if debug {
 			debug.Printf("cli(%s) send CONNECT request to parent\n", c.RemoteAddr())
 		}
@@ -1152,7 +956,7 @@ func (sv *serverConn) doConnect(r *Request, c *clientConn) (err error) {
 				c.RemoteAddr(), err)
 			return err
 		}
-	} else if !r.isRetry() {
+	} else {
 		// debug.Printf("send connection confirmation to %s->%s\n", c.RemoteAddr(), r.URL.HostPort)
 		if _, err = c.Write(connEstablished); err != nil {
 			debug.Printf("cli(%s) error send 200 Connecion established: %v\n",
@@ -1165,7 +969,7 @@ func (sv *serverConn) doConnect(r *Request, c *clientConn) (err error) {
 	done := make(chan struct{})
 	srvStopped := newNotification()
 	go func() {
-		// debug.Printf("doConnect: cli(%s)->srv(%s)\n", c.RemoteAddr(), r.URL.HostPort)
+		debug.Printf("989: doConnect: cli(%s)->srv(%s)\n", c.RemoteAddr(), r.URL.HostPort)
 		cli2srvErr = copyClient2Server(c, sv, r, srvStopped, done)
 		// Close sv to force read from server in copyServer2Client return.
 		// Note: there's no other code closing the server connection for CONNECT.
@@ -1174,15 +978,14 @@ func (sv *serverConn) doConnect(r *Request, c *clientConn) (err error) {
 
 	// debug.Printf("doConnect: srv(%s)->cli(%s)\n", r.URL.HostPort, c.RemoteAddr())
 	err = copyServer2Client(sv, c, r)
-	if isErrRetry(err) {
+	if isErrTimeout(err) || isErrConnReset(err) || isHttpErrCode(err) {
 		srvStopped.notify()
 		<-done
-		// debug.Printf("doConnect: cli(%s)->srv(%s) stopped\n", c.RemoteAddr(), r.URL.HostPort)
 	} else {
 		// close client connection to force read from client in copyClient2Server return
 		c.Conn.Close()
 	}
-	if isErrRetry(cli2srvErr) {
+	if cli2srvErr != nil {
 		return cli2srvErr
 	}
 	return
@@ -1199,6 +1002,12 @@ func (sv *serverConn) sendHTTPProxyRequestHeader(r *Request, c *clientConn) (err
 			return c.handleServerWriteError(r, sv, err,
 				"send proxy authorization header to http parent")
 		}
+	} else if hc, ok := sv.Conn.(httpsConn); ok && hc.parent.authHeader != nil {
+		// Add authorization header for parent http proxy
+		if _, err = sv.Write(hc.parent.authHeader); err != nil {
+			return c.handleServerWriteError(r, sv, err,
+				"send proxy authorization header to https parent")
+		}
 	}
 	// When retry, body is in raw buffer.
 	if _, err = sv.Write(r.rawHeaderBody()); err != nil {
@@ -1216,7 +1025,7 @@ func (sv *serverConn) sendHTTPProxyRequestHeader(r *Request, c *clientConn) (err
 func (sv *serverConn) sendRequestHeader(r *Request, c *clientConn) (err error) {
 	// Send request to the server
 	switch sv.Conn.(type) {
-	case httpConn, cowConn:
+	case httpConn, httpsConn, meowConn:
 		return sv.sendHTTPProxyRequestHeader(r, c)
 	}
 	/*
@@ -1233,7 +1042,7 @@ func (sv *serverConn) sendRequestHeader(r *Request, c *clientConn) (err error) {
 func (sv *serverConn) sendRequestBody(r *Request, c *clientConn) (err error) {
 	// Send request body. If this is retry, r.raw contains request body and is
 	// sent while sending raw request.
-	if !r.hasBody() || r.isRetry() {
+	if !r.hasBody() {
 		return
 	}
 
@@ -1261,10 +1070,7 @@ func (sv *serverConn) doRequest(c *clientConn, r *Request, rp *Response) (err er
 		return
 	}
 	r.state = rsSent
-	if err = c.readResponse(sv, r, rp); err == nil {
-		sv.updateVisit()
-	}
-	return err
+	return c.readResponse(sv, r, rp)
 }
 
 // Send response body if header specifies content length
@@ -1406,7 +1212,7 @@ func sendBodySplitIntoChunk(w io.Writer, r *bufio.Reader) (err error) {
 // Send message body.
 func sendBody(w io.Writer, bufRd *bufio.Reader, contLen int, chunk bool) (err error) {
 	// chunked encoding has precedence over content length
-	// COW does not sanitize response header, but can correctly handle it
+	// meow does not sanitize response header, but can correctly handle it
 	if chunk {
 		err = sendBodyChunked(w, bufRd, httpBufSize)
 	} else if contLen >= 0 {
diff --git a/proxy_test.go b/proxy_test.go
index 9b7130e0..61e260d0 100644
--- a/proxy_test.go
+++ b/proxy_test.go
@@ -17,7 +17,7 @@ func TestSendBodyChunked(t *testing.T) {
 		/*
 			{"0\n\r\n", "0\r\n\r\n"}, // test for buggy web servers
 			{"1a; ignore-stuff-here\nabcdefghijklmnopqrstuvwxyz\r\n10\n1234567890abcdef\n0\n\n",
-				// COW will only sanitize CRLF at chunk ending
+				// meow will only sanitize CRLF at chunk ending
 				"1a; ignore-stuff-here\nabcdefghijklmnopqrstuvwxyz\r\n10\n1234567890abcdef\r\n0\r\n\r\n"},
 		*/
 	}
@@ -53,7 +53,7 @@ func TestSendBodyChunked(t *testing.T) {
 }
 
 func TestInitSelfListenAddr(t *testing.T) {
-	listenProxy = []Proxy{newHttpProxy("0.0.0.0:7777", "")}
+	listenProxy = []Proxy{newHttpProxy("0.0.0.0:4411", "", "http")}
 	initSelfListenAddr()
 
 	testData := []struct {
@@ -62,7 +62,7 @@ func TestInitSelfListenAddr(t *testing.T) {
 	}{
 		{Request{Header: Header{Host: "google.com:443"}, URL: &URL{}}, false},
 		{Request{Header: Header{Host: "localhost"}, URL: &URL{}}, true},
-		{Request{Header: Header{Host: "127.0.0.1:7777"}, URL: &URL{}}, true},
+		{Request{Header: Header{Host: "127.0.0.1:4411"}, URL: &URL{}}, true},
 		{Request{Header: Header{Host: ""}, URL: &URL{HostPort: "google.com"}}, false},
 		{Request{Header: Header{Host: "localhost"}, URL: &URL{HostPort: "google.com"}}, false},
 	}
@@ -78,8 +78,8 @@ func TestInitSelfListenAddr(t *testing.T) {
 
 	// Another set of listen addr.
 	listenProxy = []Proxy{
-		newHttpProxy("192.168.1.1:7777", ""),
-		newHttpProxy("127.0.0.1:8888", ""),
+		newHttpProxy("192.168.1.1:4411", "", "http"),
+		newHttpProxy("127.0.0.1:8888", "", "http"),
 	}
 	initSelfListenAddr()
 
diff --git a/proxy_unix.go b/proxy_unix.go
index 3c1d4fa1..1cc164f5 100644
--- a/proxy_unix.go
+++ b/proxy_unix.go
@@ -3,15 +3,18 @@
 package main
 
 import (
+	"os"
 	"net"
 	"syscall"
 )
 
 func isErrConnReset(err error) bool {
-	if ne, ok := err.(*net.OpError); ok {
-		return ne.Err == syscall.ECONNRESET
-	}
-	return false
+        if ne, ok := err.(*net.OpError); ok {
+                if se, seok := ne.Err.(*os.SyscallError); seok {
+                        return se.Err == syscall.ECONNRESET
+                }
+        }
+        return false
 }
 
 func isDNSError(err error) bool {
@@ -36,11 +39,3 @@ func isErrOpRead(err error) bool {
 	}
 	return ne.Op == "read"
 }
-
-func isErrTooManyOpenFd(err error) bool {
-	if ne, ok := err.(*net.OpError); ok && (ne.Err == syscall.EMFILE || ne.Err == syscall.ENFILE) {
-		errl.Println("too many open fd")
-		return true
-	}
-	return false
-}
diff --git a/proxy_windows.go b/proxy_windows.go
index c3e7bc27..8aad7ecb 100644
--- a/proxy_windows.go
+++ b/proxy_windows.go
@@ -1,35 +1,22 @@
 package main
 
 import (
-	"fmt"
 	"net"
 	"strings"
+	"os"
 	"syscall"
 )
 
-var _ = fmt.Println
-
 func isErrConnReset(err error) bool {
-	// fmt.Printf("calling isErrConnReset for err type: %v Error() %s\n",
-	// reflect.TypeOf(err), err.Error())
 	if ne, ok := err.(*net.OpError); ok {
-		// fmt.Println("isErrConnReset net.OpError.Err type:", reflect.TypeOf(ne))
-		if errno, enok := ne.Err.(syscall.Errno); enok {
-			// I got these number by print. Only tested on XP.
-			// fmt.Printf("isErrConnReset errno: %d\n", errno)
-			return errno == 64 || errno == 10054
+		if se, seok := ne.Err.(*os.SyscallError); seok {
+			return se.Err == syscall.WSAECONNRESET || se.Err == syscall.ECONNRESET
 		}
 	}
 	return false
 }
 
 func isDNSError(err error) bool {
-	/*
-		fmt.Printf("calling isDNSError for err type: %v %s\n",
-			reflect.TypeOf(err), err.Error())
-	*/
-	// DNS error are not of type DNSError on Windows, so I used this ugly
-	// hack.
 	errMsg := err.Error()
 	return strings.Contains(errMsg, "No such host") ||
 		strings.Contains(errMsg, "GetAddrInfoW") ||
@@ -51,8 +38,3 @@ func isErrOpRead(err error) bool {
 	}
 	return ne.Op == "WSARecv"
 }
-
-func isErrTooManyOpenFd(err error) bool {
-	// TODO implement this.
-	return false
-}
diff --git a/script/MEOW.ico b/script/MEOW.ico
new file mode 100644
index 00000000..18b6a08f
Binary files /dev/null and b/script/MEOW.ico differ
diff --git a/script/MEOW.png b/script/MEOW.png
new file mode 100644
index 00000000..0d34c20d
Binary files /dev/null and b/script/MEOW.png differ
diff --git a/script/README.md b/script/README.md
index 16809d91..23406e91 100644
--- a/script/README.md
+++ b/script/README.md
@@ -1,12 +1,5 @@
-# About cow-taskbar.exe
+# About meow-taskbar.exe
 
 Copied `goagent.exe`, modified the string table and icon using reshack.
 
 Thanks for the taskbar project created by @phuslu.
-
-# About cow-hide.exe
-
-Allow you to run COW as a background process, without any notifications. Provided by @xupefei's [cow-hide](https://github.com/xupefei/cow-hide) project.
-
-Icon from [IconArchive](http://www.iconarchive.com/show/animal-icons-by-martin-berube/cow-icon.html), thanks to the author Martin Berube.
-
diff --git a/script/build.sh b/script/build.sh
index 799df97c..b39f9dfa 100755
--- a/script/build.sh
+++ b/script/build.sh
@@ -1,58 +1,69 @@
 #!/bin/bash
 
+set -e
+
 cd "$( dirname "${BASH_SOURCE[0]}" )/.."
 
-version=`grep '^version=' ./install-cow.sh | sed -s 's/version=//'`
-echo "creating cow binary version $version"
+version=`grep '^version=' ./install.sh | sed -s 's/version=//'`
+go_version=`go version`
+echo "creating MEOW binary version $version"
 
-mkdir -p bin
-build() {
-    local name
+rm -rf bin
+mkdir -p bin/windows
+
+gox -output="bin/{{.Dir}}-{{.OS}}-{{.Arch}}-$version" -os="windows"
+gox -output="bin/{{.Dir}}-{{.OS}}-{{.Arch}}-$version" -osarch="darwin/386 darwin/amd64 linux/386 linux/amd64 linux/arm"
+
+pack() {
     local goos
     local goarch
-    local goarm
-    local cgo
-    local armv
-
-    goos="GOOS=$1"
-    goarch="GOARCH=$2"
-    arch=$3
-    if [[ $2 == "arm" ]]; then
-        armv=`echo $arch | grep -o [0-9]`
-        goarm="GOARM=$armv"
-    fi
+    local name
 
-    if [[ $1 == "darwin" ]]; then
-        # Enable CGO for OS X so change network location will not cause problem.
-        cgo="CGO_ENABLED=1"
-    else
-        cgo="CGO_ENABLED=0"
-    fi
+    goos=$1
+    goarch=$2
+    name=MEOW-$goos-$goarch-$version
 
-    name=cow-$arch-$version
-    echo "building $name"
-    echo $cgo $goos $goarch $goarm go build
-    eval $cgo $goos $goarch $goarm go build || exit 1
+    echo "packing $goos $goarch"
     if [[ $1 == "windows" ]]; then
-        mv cow.exe script
+        mv bin/$name.exe script/proxy.exe
         pushd script
         sed -e 's/$/\r/' ../doc/sample-config/rc > rc.txt
-        zip $name.zip cow.exe cow-taskbar.exe cow-hide.exe rc.txt
-        rm -f cow.exe rc.txt
+        sed -e 's/$/\r/' ../doc/sample-config/rc-full > rc-full.txt
+        sed -e 's/$/\r/' ../doc/sample-config/direct > direct.txt
+        sed -e 's/$/\r/' ../doc/sample-config/proxy > proxy.txt
+        sed -e 's/$/\r/' ../doc/sample-config/reject > reject.txt
+        mv meow-taskbar.exe MEOW.exe
+        zip $name.zip proxy.exe MEOW.exe rc.txt rc-full.txt direct.txt proxy.txt reject.txt
+        rm -f proxy.exe rc.txt rc-full.txt direct.txt proxy.txt reject.txt
         mv $name.zip ../bin/
+        mv MEOW.exe meow-taskbar.exe
         popd
+        if [[ $2 == "386" ]]; then
+            mv bin/$name.zip bin/windows/MEOW-x86-$version.zip
+        fi
+        if [[ $2 == "amd64" ]]; then
+            mv bin/$name.zip bin/windows/MEOW-x64-$version.zip
+        fi
     else
-        mv cow bin/$name
         gzip -f bin/$name
     fi
 }
 
-build darwin amd64 mac64
-build darwin 386 mac32
-build linux amd64 linux64
-build linux 386 linux32
-build linux arm linux-armv5tel
-build linux arm linux-armv6l
-build linux arm linux-armv7l
-build windows amd64 win64
-build windows 386 win32
+pack darwin amd64
+pack darwin 386
+pack linux amd64
+pack linux 386
+pack linux arm
+pack windows amd64
+pack windows 386
+
+git config --global user.name "renzhn"
+git config --global user.email "renzhen999@gmail.com"
+
+git checkout gh-pages
+rm -rf dist
+mv bin dist
+git add dist
+git commit -am"version $version $go_version"
+git push -f
+git checkout master
diff --git a/script/cow-hide.exe b/script/cow-hide.exe
deleted file mode 100644
index 5454186a..00000000
Binary files a/script/cow-hide.exe and /dev/null differ
diff --git a/script/cow-taskbar.exe b/script/cow-taskbar.exe
deleted file mode 100755
index 1a0b21e6..00000000
Binary files a/script/cow-taskbar.exe and /dev/null differ
diff --git a/script/debugrc b/script/debugrc
index d85178a2..79e87a64 100644
--- a/script/debugrc
+++ b/script/debugrc
@@ -1 +1 @@
-listen = cow://aes-128-cfb:foobar@127.0.0.1:8899
+listen = meow://aes-128-cfb:foobar@127.0.0.1:8899
diff --git a/script/httprc b/script/httprc
index ed68a5aa..cc662710 100644
--- a/script/httprc
+++ b/script/httprc
@@ -1,3 +1,2 @@
 listen = http://127.0.0.1:7788
-proxy = cow://aes-128-cfb:foobar@127.0.0.1:8899
-alwaysProxy = true
+proxy = meow://aes-128-cfb:foobar@127.0.0.1:8899
diff --git a/doc/init.d/cow b/script/meow
similarity index 65%
rename from doc/init.d/cow
rename to script/meow
index 0847a8b5..5695e5aa 100755
--- a/doc/init.d/cow
+++ b/script/meow
@@ -1,25 +1,25 @@
 #!/bin/bash
 ### BEGIN INIT INFO
-# Provides:          cow
+# Provides:          MEOW
 # Required-Start:    $network
 # Required-Stop:     $network
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
-# Short-Description: COW: Climb Over the Wall http proxy
+# Short-Description: MEOW Proxy
 # Description:       Automatically detect blocked site and use parent proxy.
 ### END INIT INFO
 
-# Put this script under /etc/init.d/, then run "update-rc.d cow defaults".
+# Put this script under /etc/init.d/, then run "update-rc.d meow defaults".
 
-# Note: this script requires sudo in order to run COW as the specified
+# Note: this script requires sudo in order to run MEOW as the specified
 # user. Please change the following variables in order to use this script.
-# COW will search for rc/direct/block/stat file under user's $HOME/.cow/ directory.
-BIN=/usr/local/bin/cow
-USER=usr
-GROUP=grp
+# MEOW will search for rc/direct/block/stat file under user's $HOME/.meow/ directory.
+BIN=/usr/local/bin/MEOW
+USER=sym
+GROUP=sym
 PID_DIR=/var/run
-PID_FILE=$PID_DIR/cow.pid
-LOG_FILE=/var/log/cow
+PID_FILE=$PID_DIR/meow.pid
+LOG_FILE=/var/log/meow
 
 RET_VAL=0
 
@@ -41,13 +41,13 @@ do_status() {
   check_running
   case $? in
     0)
-      echo "cow running with PID $PID"
+      echo "meow running with PID $PID"
       ;;
     1)
-      echo "cow not running, remove PID file $PID_FILE"
+      echo "meow not running, remove PID file $PID_FILE"
       ;;
     2)
-      echo "Could not find PID file $PID_FILE, cow does not appear to be running"
+      echo "Could not find PID file $PID_FILE, meow does not appear to be running"
       ;;
   esac
   return 0
@@ -61,10 +61,10 @@ do_start() {
     chmod 0770 $PID_DIR
   fi
   if check_running; then
-    echo "cow already running with PID $PID"
+    echo "meow already running with PID $PID"
     return 0
   fi
-  echo "starting cow"
+  echo "starting meow"
   # sudo will set the group to the primary group of $USER
   sudo -u $USER -H -- $BIN >$LOG_FILE 2>&1 &
   PID=$!
@@ -74,13 +74,13 @@ do_start() {
     echo "start failed"
     return 1
   fi
-  echo "cow running with PID $PID"
+  echo "meow running with PID $PID"
   return 0
 }
 
 do_stop() {
   if check_running; then
-    echo "stopping cow with PID $PID"
+    echo "stopping meow with PID $PID"
     kill $PID
     rm -f $PID_FILE
   else
@@ -98,7 +98,7 @@ case "$1" in
     do_$1
     ;;
   *)
-    echo "Usage: cow {start|stop|restart|status}"
+    echo "Usage: meow {start|stop|restart|status}"
     RET_VAL=1
     ;;
 esac
diff --git a/script/meow-taskbar.exe b/script/meow-taskbar.exe
new file mode 100644
index 00000000..5cac6962
Binary files /dev/null and b/script/meow-taskbar.exe differ
diff --git a/script/set-version.sh b/script/set-version.sh
index b8bbd1cf..cc0d2553 100755
--- a/script/set-version.sh
+++ b/script/set-version.sh
@@ -11,6 +11,6 @@ version=$1
 #echo $version
 
 sed -i -e "s,\(\tversion \+= \)\".*\"$,\1\"$version\"," config.go
-sed -i -e "s/version=.*$/version=$version/" install-cow.sh
+sed -i -e "s/version=.*$/version=$version/" install.sh
 sed -i -e "s/当前版本:[^ ]\+ \(.*\)\$/当前版本:$version \1/" README.md
 
diff --git a/script/test.sh b/script/test.sh
index a38065aa..3c798cc1 100755
--- a/script/test.sh
+++ b/script/test.sh
@@ -8,24 +8,24 @@ if ! go build; then
 fi
 
 PROXY_ADDR=127.0.0.1:7788
-COW_ADDR=127.0.0.1:8899
+MEOW_ADDR=127.0.0.1:8899
 
 if [[ -z "$TRAVIS" ]]; then
-    RCDIR=~/.cow/
+    RCDIR=~/.meow/
 else # on travis
     RCDIR=./script/
 fi
 
-./cow -rc $RCDIR/debugrc -listen=cow://aes-128-cfb:foobar@$COW_ADDR &
+./MEOW -request=false -reply=false -rc $RCDIR/debugrc -listen=meow://aes-128-cfb:foobar@$MEOW_ADDR &
 parent_pid=$!
-./cow -rc ./script/httprc -listen=http://$PROXY_ADDR &
-cow_pid=$!
+./MEOW -request=false -reply=false -rc ./script/httprc -listen=http://$PROXY_ADDR &
+meow_pid=$!
 
-stop_cow() {
+stop_meow() {
     kill -SIGTERM $parent_pid
-    kill -SIGTERM $cow_pid
+    kill -SIGTERM $meow_pid
 }
-trap 'stop_cow' TERM INT
+trap 'stop_meow' TERM INT
 
 sleep 1
 
@@ -41,34 +41,31 @@ test_get() {
         code="200"
     fi
 
-    # get 5 times
-    for i in {1..2}; do
-        # -s silent to disable progress meter, but enable --show-error
-        # -i to include http header
-        # -L to follow redirect so we should always get HTTP 200
-        if [[ -n $noproxy ]]; then
-            cont=`curl -s --show-error -i -L $url 2>&1`
-        else
-            cont=`curl -s --show-error -i -L -x $PROXY_ADDR $url 2>&1`
-        fi
-        ok=`echo $cont | grep -E -o "HTTP/1\.1 +$code"`
-        html=`echo $cont | grep -E -o -i "$target"`
-        if [[ -z $ok || -z $html ]] ; then
-            echo "=============================="
-            echo "GET $url FAILED!!!"
-            echo "$ok"
-            echo "$html"
-            echo $cont
-            echo "=============================="
-            kill -SIGTERM $cow_pid
-            exit 1
-        fi
-        sleep 0.3
-    done
+    # -s silent to disable progress meter, but enable --show-error
+    # -i to include http header
+    # -L to follow redirect so we should always get HTTP 200
+    if [[ -n $noproxy ]]; then
+        cont=`curl -s --show-error -i -L $url 2>&1`
+    else
+        cont=`curl -s --show-error -i -L -x $PROXY_ADDR $url 2>&1`
+    fi
+    ok=`echo $cont | grep -E -o "HTTP/1\.1 +$code"`
+    html=`echo $cont | grep -E -o -i "$target"`
+    if [[ -z $ok || -z $html ]] ; then
+        echo "=============================="
+        echo "GET $url FAILED!!!"
+        echo "$ok"
+        echo "$html"
+        echo $cont
+        echo "=============================="
+        kill -SIGTERM $meow_pid
+        exit 1
+    fi
+    sleep 0.3
     echo "passed"
 }
 
-test_get $PROXY_ADDR/pac "apple.com" "noproxy" # test for pac
+test_get $PROXY_ADDR/pac "proxy-autoconfig" "noproxy" # test for pac
 test_get google.com "<html" # 301 redirect
 test_get www.google.com "<html" # 302 redirect , chunked encoding
 test_get www.reddit.com "<html" # chunked encoding
@@ -87,5 +84,5 @@ if [[ -z $TRAVIS ]]; then
     test_get https://www.alipay.com "<html>"
 fi
 
-stop_cow
+stop_meow
 exit 0
diff --git a/script/upload.sh b/script/upload.sh
index 69a44d15..16707e51 100755
--- a/script/upload.sh
+++ b/script/upload.sh
@@ -7,18 +7,18 @@ if [[ $# != 2 ]]; then
     exit 1
 fi
 
-version=`grep '^version=' ./install-cow.sh | sed -s 's/version=//'`
+version=`grep '^version=' ./install-meow.sh | sed -s 's/version=//'`
 username=$1
 passwd=$2
 
 upload() {
     summary=$1
     file=$2
-    googlecode_upload.py -l Featured -u "$username" -w "$passwd" -s "$summary" -p cow-proxy "$file"
+    googlecode_upload.py -l Featured -u "$username" -w "$passwd" -s "$summary" -p meow-proxy "$file"
 }
 
-upload "$version for Linux 32bit" bin/cow-linux32-$version.gz
-upload "$version for Linux 64bit" bin/cow-linux64-$version.gz
-upload "$version for Windows 64bit" bin/cow-win64-$version.zip
-upload "$version for Windows 32bit" bin/cow-win32-$version.zip
-upload "$version for OS X 64bit" bin/cow-mac64-$version.gz
+upload "$version for Linux 32bit" bin/meow-linux32-$version.gz
+upload "$version for Linux 64bit" bin/meow-linux64-$version.gz
+upload "$version for Windows 64bit" bin/meow-win64-$version.zip
+upload "$version for Windows 32bit" bin/meow-win32-$version.zip
+upload "$version for OS X 64bit" bin/meow-mac64-$version.gz
diff --git a/site_blocked.go b/site_blocked.go
deleted file mode 100644
index 9f6adb00..00000000
--- a/site_blocked.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package main
-
-var blockedDomainList = []string{
-	"bit.ly",
-	"j.mp",
-	"bitly.com",
-	"fbcdn.net",
-	"facebook.com",
-	"plus.google.com",
-	"plusone.google.com",
-	"t.co",
-	"twimg.com",
-	"twitpic.com",
-	"twitter.com",
-	"youtu.be",
-	"youtube.com",
-	"ytimg.com",
-}
diff --git a/site_direct.go b/site_direct.go
deleted file mode 100644
index eed66344..00000000
--- a/site_direct.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package main
-
-var directDomainList = []string{
-	// 视频
-	"xunlei.com", // 迅雷
-	"kankan.com",
-	"kanimg.com",
-
-	"tdimg.com", // 土豆
-	"tudou.com",
-	"tudouui.com",
-
-	"soku.com", // 优酷
-	"youku.com",
-	"ykimg.com",
-
-	"ku6.cn", // 酷六
-	"ku6.com",
-	"ku6cdn.com",
-	"ku6img.com",
-
-	// 电商
-	"z.cn",
-	"amazon.cn",
-
-	"360buy.com",
-	"360buyimg.com",
-	"jd.com",
-
-	"51buy.com",
-	"icson.com",
-
-	"dangdang.com",
-	"ddimg.cn",
-
-	"yihaodian.com",
-	"yihaodianimg.com",
-
-	"paipai.com",
-	"paipaiimg.com",
-
-	"tmall.com",
-	"taobao.com",
-	"taobaocdn.com",
-	"tbcdn.cn",
-	"etao.com",
-
-	"aicdn.com",
-	"alicdn.com",
-	"alimama.cn",
-	"alimama.com",
-	"alipay.com",
-	"alipayobjects.com",
-
-	// 银行
-	"bankcomm.com",
-	"bankofchina.com",
-	"95559.com.cn",
-	"abchina.com",
-	"95599.cn",
-	"boc.cn",
-	"ccb.com",
-	"cmbchina.com",
-	"icbc.com.cn",
-	"spdb.com.cn",
-
-	// 社交
-	"douban.com",
-	"t.cn",
-	"weibo.com",
-	"zhihu.com",
-	"kaixin001.com",
-	"qq.com",
-
-	"renren.com",
-	"rrimg.com",
-	"xiaonei.com",
-	"xnimg.cn",
-	"xnpic.com",
-
-	"dianping.com", // 点评
-	"dpfile.com",
-
-	"huaban.com", // 又拍云的几个
-	"yupoo.com",
-	"upyun.com",
-	"upaiyun.com",
-
-	// 新闻门户
-	"ifanr.cn",
-	"ifanr.com",
-	"163.com",
-	"hexun.com",
-	"sina.com.cn",
-	"sinaapp.com",
-	"sinaimg.cn",
-	"sinajs.cn",
-	"sohu.com",
-	"solidot.org",
-
-	// 搜索
-	"bing.com",
-	"bing.com.cn",
-	"baidu.com",
-	"bdstatic.com",
-	"bdimg.com",
-	"youdao.com",
-	"sogou.com",
-
-	// Apple
-	"apple.com",
-	"apple.com.cn",
-	"icloud.com",
-
-	// 其他
-	"macromedia.com",
-	"mmcdn.cn",
-	"12306.cn",
-}
diff --git a/sitestat.go b/sitestat.go
deleted file mode 100644
index 5c4d5cc0..00000000
--- a/sitestat.go
+++ /dev/null
@@ -1,492 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"errors"
-	"fmt"
-	"github.com/cyfdecyf/bufio"
-	"io/ioutil"
-	"math/rand"
-	"os"
-	"strings"
-	"sync"
-	"time"
-)
-
-func init() {
-	rand.Seed(time.Now().Unix())
-}
-
-// VisitCnt and SiteStat are used to track how many times a site is visited.
-// With this information: COW knows which sites are frequently visited, and
-// judging whether a site is blocked or not is more reliable.
-
-const (
-	directDelta  = 5
-	blockedDelta = 5
-	maxCnt       = 100 // no protect to update visit cnt, smaller value is unlikely to overflow
-	userCnt      = -1  // this represents user specified host or domain
-)
-
-type siteVisitMethod int
-
-// minus operation on visit count may get negative value, so use signed int
-type vcntint int8
-
-type Date time.Time
-
-const dateLayout = "2006-01-02"
-
-func (d Date) MarshalJSON() ([]byte, error) {
-	return []byte("\"" + time.Time(d).Format(dateLayout) + "\""), nil
-}
-
-func (d *Date) UnmarshalJSON(input []byte) error {
-	if len(input) != len(dateLayout)+2 {
-		return errors.New(fmt.Sprintf("unmarshaling date: invalid input %s", string(input)))
-	}
-	input = input[1 : len(dateLayout)+1]
-	t, err := time.Parse(dateLayout, string(input))
-	*d = Date(t)
-	return err
-}
-
-// COW don't need very accurate visit count, so update to visit count value is
-// not protected.
-type VisitCnt struct {
-	Direct    vcntint   `json:"direct"`
-	Blocked   vcntint   `json:"block"`
-	Recent    Date      `json:"recent"`
-	rUpdated  bool      // whether Recent is updated, we only need date precision
-	blockedOn time.Time // when is the site last blocked
-}
-
-func newVisitCnt(direct, blocked vcntint) *VisitCnt {
-	return &VisitCnt{direct, blocked, Date(time.Now()), true, zeroTime}
-}
-
-func newVisitCntWithTime(direct, blocked vcntint, t time.Time) *VisitCnt {
-	return &VisitCnt{direct, blocked, Date(t), true, zeroTime}
-}
-
-func (vc *VisitCnt) userSpecified() bool {
-	return vc.Blocked == userCnt || vc.Direct == userCnt
-}
-
-const siteStaleThreshold = 10 * 24 * time.Hour
-
-func (vc *VisitCnt) isStale() bool {
-	return time.Now().Sub(time.Time(vc.Recent)) > siteStaleThreshold
-}
-
-// shouldNotSave returns true if the a VisitCnt is not visited for a long time
-// (several days) or is specified by user.
-func (vc *VisitCnt) shouldNotSave() bool {
-	return vc.userSpecified() || vc.isStale() || (vc.Blocked == 0 && vc.Direct == 0)
-}
-
-const tmpBlockedTimeout = 2 * time.Minute
-
-func (vc *VisitCnt) AsTempBlocked() bool {
-	return time.Now().Sub(vc.blockedOn) < tmpBlockedTimeout
-}
-
-func (vc *VisitCnt) AsDirect() bool {
-	return (vc.Blocked == 0) || (vc.Direct-vc.Blocked >= directDelta) || vc.AlwaysDirect()
-}
-
-func (vc *VisitCnt) AsBlocked() bool {
-	if vc.Blocked == userCnt || vc.AsTempBlocked() {
-		return true
-	}
-	// add some randomness to fix mistake
-	delta := vc.Blocked - vc.Direct
-	return delta >= blockedDelta && rand.Intn(int(delta)) != 0
-}
-
-func (vc *VisitCnt) AlwaysDirect() bool {
-	return vc.Direct == userCnt
-}
-
-func (vc *VisitCnt) AlwaysBlocked() bool {
-	return vc.Blocked == userCnt
-}
-
-func (vc *VisitCnt) OnceBlocked() bool {
-	return vc.Blocked > 0 || vc.AlwaysBlocked() || vc.AsTempBlocked()
-}
-
-func (vc *VisitCnt) tempBlocked() {
-	vc.blockedOn = time.Now()
-}
-
-// time.Time is composed of 3 fields, so need lock to protect update. As
-// update of last visit is not frequent (at most once for each domain), use a
-// global lock to avoid associating a lock to each VisitCnt.
-var visitLock sync.Mutex
-
-// visit updates visit cnt
-func (vc *VisitCnt) visit(inc *vcntint) {
-	if *inc < maxCnt {
-		*inc++
-	}
-	// Because of concurrent update, possible for *inc to overflow and become
-	// negative, but very unlikely.
-	if *inc > maxCnt || *inc < 0 {
-		*inc = maxCnt
-	}
-
-	if !vc.rUpdated {
-		vc.rUpdated = true
-		visitLock.Lock()
-		vc.Recent = Date(time.Now())
-		visitLock.Unlock()
-	}
-}
-
-func (vc *VisitCnt) DirectVisit() {
-	if networkBad() || vc.userSpecified() {
-		return
-	}
-	// one successful direct visit probably means the site is not actually
-	// blocked
-	vc.visit(&vc.Direct)
-	vc.Blocked = 0
-}
-
-func (vc *VisitCnt) BlockedVisit() {
-	if networkBad() || vc.userSpecified() {
-		return
-	}
-	// When a site changes from direct to blocked by GFW, COW should learn
-	// this quickly and remove it from the PAC ASAP. So change direct to 0
-	// once there's a single blocked visit, this ensures the site is removed
-	// upon the next PAC update.
-	vc.visit(&vc.Blocked)
-	vc.Direct = 0
-}
-
-type SiteStat struct {
-	Update Date                 `json:"update"`
-	Vcnt   map[string]*VisitCnt `json:"site_info"` // Vcnt uses host as key
-	vcLock sync.RWMutex
-
-	// Whether a domain has blocked host. Used to avoid considering a domain as
-	// direct though it has blocked hosts.
-	hasBlockedHost map[string]bool
-	hbhLock        sync.RWMutex
-}
-
-func newSiteStat() *SiteStat {
-	return &SiteStat{
-		Vcnt:           map[string]*VisitCnt{},
-		hasBlockedHost: map[string]bool{},
-	}
-}
-
-func (ss *SiteStat) get(s string) *VisitCnt {
-	ss.vcLock.RLock()
-	Vcnt, ok := ss.Vcnt[s]
-	ss.vcLock.RUnlock()
-	if ok {
-		return Vcnt
-	}
-	return nil
-}
-
-func (ss *SiteStat) create(s string) (vcnt *VisitCnt) {
-	vcnt = newVisitCnt(0, 0)
-	ss.vcLock.Lock()
-	ss.Vcnt[s] = vcnt
-	ss.vcLock.Unlock()
-	return
-}
-
-// Caller should guarantee that always direct url does not attempt
-// blocked visit.
-func (ss *SiteStat) TempBlocked(url *URL) {
-	debug.Printf("%s temp blocked\n", url.Host)
-
-	vcnt := ss.get(url.Host)
-	if vcnt == nil {
-		panic("TempBlocked should always get existing visitCnt")
-	}
-	vcnt.tempBlocked()
-
-	// Mistakenly consider a partial blocked domain as direct will make that
-	// domain into PAC and never have a chance to correct the error.
-	// Once using blocked visit, a host is considered to maybe blocked even if
-	// it's block visit count decrease to 0. As hasBlockedHost is not saved,
-	// upon next start up of COW, the information will reflect the current
-	// status of that host.
-	ss.hbhLock.RLock()
-	t := ss.hasBlockedHost[url.Domain]
-	ss.hbhLock.RUnlock()
-	if !t {
-		ss.hbhLock.Lock()
-		ss.hasBlockedHost[url.Domain] = true
-		ss.hbhLock.Unlock()
-	}
-}
-
-var alwaysDirectVisitCnt = newVisitCnt(userCnt, 0)
-
-func (ss *SiteStat) GetVisitCnt(url *URL) (vcnt *VisitCnt) {
-	if parentProxy.empty() { // no way to retry, so always visit directly
-		return alwaysDirectVisitCnt
-	}
-	if url.Domain == "" { // simple host or private ip
-		return alwaysDirectVisitCnt
-	}
-	if vcnt = ss.get(url.Host); vcnt != nil {
-		return
-	}
-	if len(url.Domain) != len(url.Host) {
-		if dmcnt := ss.get(url.Domain); dmcnt != nil && dmcnt.userSpecified() {
-			// if the domain is not specified by user, should create a new host
-			// visitCnt
-			return dmcnt
-		}
-	}
-	return ss.create(url.Host)
-}
-
-func (ss *SiteStat) store(statPath string) (err error) {
-	if err = mkConfigDir(); err != nil {
-		return
-	}
-
-	now := time.Now()
-	var savedSS *SiteStat
-	if ss.Update == Date(zeroTime) {
-		ss.Update = Date(time.Now())
-	}
-	if now.Sub(time.Time(ss.Update)) > siteStaleThreshold {
-		// Not updated for a long time, don't drop any record
-		savedSS = ss
-		// Changing update time too fast will also drop useful record
-		savedSS.Update = Date(time.Time(ss.Update).Add(siteStaleThreshold / 2))
-		if time.Time(savedSS.Update).After(now) {
-			savedSS.Update = Date(now)
-		}
-	} else {
-		savedSS = newSiteStat()
-		savedSS.Update = Date(now)
-		ss.vcLock.RLock()
-		for site, vcnt := range ss.Vcnt {
-			if vcnt.shouldNotSave() {
-				continue
-			}
-			savedSS.Vcnt[site] = vcnt
-		}
-		ss.vcLock.RUnlock()
-	}
-
-	b, err := json.MarshalIndent(savedSS, "", "\t")
-	if err != nil {
-		errl.Println("Error marshalling site stat:", err)
-		panic("internal error: error marshalling site")
-	}
-
-	// Store stat into temp file first and then rename.
-	// Ensures atomic update to stat file to avoid file damage.
-
-	// Create tmp file inside config firectory to avoid cross FS rename.
-	f, err := ioutil.TempFile(configPath.dir, "stat")
-	if err != nil {
-		errl.Println("create tmp file to store stat", err)
-		return
-	}
-	if _, err = f.Write(b); err != nil {
-		errl.Println("Error writing stat file:", err)
-		f.Close()
-		return
-	}
-	f.Close()
-
-	// Windows don't allow rename to existing file.
-	os.Remove(statPath + ".bak")
-	os.Rename(statPath, statPath+".bak")
-	if err = os.Rename(f.Name(), statPath); err != nil {
-		errl.Println("can't rename newly created stat file", err)
-		return
-	}
-	return
-}
-
-func (ss *SiteStat) loadList(lst []string, direct, blocked vcntint) {
-	for _, d := range lst {
-		ss.Vcnt[d] = newVisitCntWithTime(direct, blocked, zeroTime)
-	}
-}
-
-func (ss *SiteStat) loadBuiltinList() {
-	ss.loadList(blockedDomainList, 0, userCnt)
-	ss.loadList(directDomainList, userCnt, 0)
-}
-
-func (ss *SiteStat) loadUserList() {
-	if directList, err := loadSiteList(configPath.alwaysDirect); err == nil {
-		ss.loadList(directList, userCnt, 0)
-	}
-	if blockedList, err := loadSiteList(configPath.alwaysBlocked); err == nil {
-		ss.loadList(blockedList, 0, userCnt)
-	}
-}
-
-// Filter sites covered by user specified domains, also filter out stale
-// sites.
-func (ss *SiteStat) filterSites() {
-	// It's not safe to remove element while iterating over a map.
-	var removeSites []string
-
-	// find what to remove first
-	ss.vcLock.RLock()
-	for site, vcnt := range ss.Vcnt {
-		if vcnt.userSpecified() {
-			continue
-		}
-		if vcnt.isStale() {
-			removeSites = append(removeSites, site)
-			continue
-		}
-		var dmcnt *VisitCnt
-		domain := host2Domain(site)
-		if domain != site {
-			dmcnt = ss.get(domain)
-		}
-		if dmcnt != nil && dmcnt.userSpecified() {
-			removeSites = append(removeSites, site)
-		}
-	}
-	ss.vcLock.RUnlock()
-
-	// do remove
-	ss.vcLock.Lock()
-	for _, site := range removeSites {
-		delete(ss.Vcnt, site)
-	}
-	ss.vcLock.Unlock()
-}
-
-func (ss *SiteStat) load(file string) (err error) {
-	defer func() {
-		// load builtin list first, so user list can override builtin
-		ss.loadBuiltinList()
-		ss.loadUserList()
-		ss.filterSites()
-		for host, vcnt := range ss.Vcnt {
-			if vcnt.OnceBlocked() {
-				ss.hasBlockedHost[host2Domain(host)] = true
-			}
-		}
-	}()
-	var exists bool
-	if exists, err = isFileExists(file); err != nil {
-		fmt.Println("Error loading stat:", err)
-		return
-	}
-	if !exists {
-		return
-	}
-	var f *os.File
-	if f, err = os.Open(file); err != nil {
-		fmt.Printf("Error opening site stat %s: %v\n", file, err)
-		return
-	}
-	b, err := ioutil.ReadAll(f)
-	if err != nil {
-		fmt.Println("Error reading site stat:", err)
-		return
-	}
-	if err = json.Unmarshal(b, ss); err != nil {
-		fmt.Println("Error decoding site stat:", err)
-		return
-	}
-	return
-}
-
-func (ss *SiteStat) GetDirectList() []string {
-	lst := make([]string, 0)
-	// anyway to do more fine grained locking?
-	ss.vcLock.RLock()
-	for site, vc := range ss.Vcnt {
-		if ss.hasBlockedHost[host2Domain(site)] {
-			continue
-		}
-		if vc.AsDirect() {
-			lst = append(lst, site)
-		}
-	}
-	ss.vcLock.RUnlock()
-	return lst
-}
-
-var siteStat = newSiteStat()
-
-func initSiteStat() {
-	if err := siteStat.load(configPath.stat); err != nil {
-		os.Exit(1)
-	}
-	// Dump site stat while running, so we don't always need to close cow to
-	// get updated stat.
-	go func() {
-		for {
-			time.Sleep(5 * time.Minute)
-			storeSiteStat(siteStatCont)
-		}
-	}()
-}
-
-const (
-	siteStatExit = iota
-	siteStatCont
-)
-
-// Lock ensures only one goroutine calling store.
-// siteStatFini ensures no more calls after going to exit.
-var storeLock sync.Mutex
-var siteStatFini bool
-
-func storeSiteStat(cont byte) {
-	storeLock.Lock()
-	defer storeLock.Unlock()
-
-	if siteStatFini {
-		return
-	}
-	siteStat.store(configPath.stat)
-	if cont == siteStatExit {
-		siteStatFini = true
-	}
-}
-
-func loadSiteList(fpath string) (lst []string, err error) {
-	var exists bool
-	if exists, err = isFileExists(fpath); err != nil {
-		errl.Printf("Error loading domaint list: %v\n", err)
-	}
-	if !exists {
-		return
-	}
-	f, err := os.Open(fpath)
-	if err != nil {
-		errl.Println("Error opening domain list:", err)
-		return
-	}
-	defer f.Close()
-
-	scanner := bufio.NewScanner(f)
-	lst = make([]string, 0)
-	for scanner.Scan() {
-		site := strings.TrimSpace(scanner.Text())
-		if site == "" {
-			continue
-		}
-		lst = append(lst, site)
-	}
-	if scanner.Err() != nil {
-		errl.Printf("Error reading domain list %s: %v\n", fpath, scanner.Err())
-	}
-	return lst, scanner.Err()
-}
diff --git a/sitestat_test.go b/sitestat_test.go
deleted file mode 100644
index e744c681..00000000
--- a/sitestat_test.go
+++ /dev/null
@@ -1,263 +0,0 @@
-package main
-
-import (
-	"os"
-	"testing"
-	"time"
-)
-
-var _ = os.Remove
-
-func TestNetworkBad(t *testing.T) {
-	if networkBad() {
-		t.Error("Network by default should be good")
-	}
-}
-
-func TestDateMarshal(t *testing.T) {
-	d := Date(time.Date(2013, 2, 4, 0, 0, 0, 0, time.UTC))
-	j, err := d.MarshalJSON()
-	if err != nil {
-		t.Error("Error marshalling json:", err)
-	}
-	if string(j) != "\"2013-02-04\"" {
-		t.Error("Date marshal result wrong, got:", string(j))
-	}
-
-	err = d.UnmarshalJSON([]byte("\"2013-01-01\""))
-	if err != nil {
-		t.Error("Error unmarshaling Date:", err)
-	}
-	tm := time.Time(d)
-	if tm.Year() != 2013 || tm.Month() != 1 || tm.Day() != 1 {
-		t.Error("Unmarshaled date wrong, got:", tm)
-	}
-}
-
-func TestSiteStatLoadStore(t *testing.T) {
-	ss := newSiteStat()
-	ss.load("testdata/nosuchfile") // load buildin and user specified list
-	if len(ss.GetDirectList()) == 0 {
-		t.Error("builtin site should appear in direct site list even with no stat file")
-	}
-
-	url1, _ := ParseRequestURI("www.foobar.com")
-	url2, _ := ParseRequestURI("img.foobar.com")
-	vcnt1 := ss.GetVisitCnt(url1)
-	vcnt1.DirectVisit()
-	vcnt1.DirectVisit()
-	vcnt1.DirectVisit()
-	vcnt2 := ss.GetVisitCnt(url2)
-	vcnt2.DirectVisit()
-
-	blockurl1, _ := ParseRequestURI("blocked.com")
-	blockurl2, _ := ParseRequestURI("blockeurl2.com")
-	si1 := ss.GetVisitCnt(blockurl1)
-	si1.BlockedVisit()
-	si2 := ss.GetVisitCnt(blockurl2)
-	si2.BlockedVisit()
-
-	// make google.com with a large direct count, but plus.google.com is in blocked list
-	// so it shouldn't be considered as direct site
-	gurl, _ := ParseRequestURI("google.com")
-	gvcnt := ss.GetVisitCnt(gurl)
-	gvcnt.Direct = 100
-
-	const stfile = "testdata/stat"
-	if err := ss.store(stfile); err != nil {
-		t.Fatal("store error:", err)
-	}
-
-	ld := newSiteStat()
-	if err := ld.load(stfile); err != nil {
-		t.Fatal("load stat error:", err)
-	}
-	vc := ld.get(url1.Host)
-	if vc == nil {
-		t.Fatalf("load error, %s not loaded\n", url1.Host)
-	}
-	if vc.Direct != 3 {
-		t.Errorf("load error, %s should have visit cnt 3, got: %d\n", url1.Host, vc.Direct)
-	}
-
-	vc = ld.get(blockurl1.Host)
-	if vc == nil {
-		t.Errorf("load error, %s not loaded\n", blockurl1.Host)
-	}
-
-	// test bulitin site
-	ap, _ := ParseRequestURI("apple.com")
-	si := ld.GetVisitCnt(ap)
-	if !si.AlwaysDirect() {
-		t.Error("builtin site apple.com should always use direct access")
-	}
-	tw, _ := ParseRequestURI("twitter.com")
-	si = ld.GetVisitCnt(tw)
-	if !si.AsBlocked() || !si.AlwaysBlocked() {
-		t.Error("builtin site twitter.com should use blocked access")
-	}
-	plus, _ := ParseRequestURI("plus.google.com")
-	si = ld.GetVisitCnt(plus)
-	if !si.AsBlocked() || !si.AlwaysBlocked() {
-		t.Error("builtin site plus.google.com should use blocked access")
-	}
-
-	directList := ld.GetDirectList()
-	if len(directList) == 0 {
-		t.Error("builtin site should appear in direct site list")
-	}
-	if !ld.hasBlockedHost["google.com"] {
-		t.Error("google.com should have blocked host")
-	}
-	for _, d := range directList {
-		if d == "google.com" {
-			t.Errorf("direct list contains 2nd level domain which has sub host that's blocked")
-		}
-	}
-	os.Remove(stfile)
-}
-
-func TestSiteStatVisitCnt(t *testing.T) {
-	ss := newSiteStat()
-
-	g1, _ := ParseRequestURI("www.gtemp.com")
-	g2, _ := ParseRequestURI("calendar.gtemp.com")
-	g3, _ := ParseRequestURI("docs.gtemp.com")
-
-	sg1 := ss.GetVisitCnt(g1)
-	for i := 0; i < 30; i++ {
-		sg1.DirectVisit()
-	}
-	sg2 := ss.GetVisitCnt(g2)
-	sg2.DirectVisit()
-	sg3 := ss.GetVisitCnt(g3)
-	sg3.DirectVisit()
-
-	if ss.hasBlockedHost[g1.Domain] {
-		t.Errorf("direct domain %s should not have host at first\n", g1.Domain)
-	}
-
-	vc := ss.get(g1.Host)
-	if vc == nil {
-		t.Fatalf("no VisitCnt for %s\n", g1.Host)
-	}
-	if vc.Direct != 30 {
-		t.Errorf("direct cnt for %s not correct, should be 30, got: %d\n", g1.Host, vc.Direct)
-	}
-	if vc.Blocked != 0 {
-		t.Errorf("block cnt for %s not correct, should be 0 before blocked visit, got: %d\n", g1.Host, vc.Blocked)
-	}
-	if vc.rUpdated != true {
-		t.Errorf("VisitCnt lvUpdated should be true after visit")
-	}
-
-	vc.BlockedVisit()
-	if vc.Blocked != 1 {
-		t.Errorf("blocked cnt for %s after 1 blocked visit should be 1, got: %d\n", g1.Host, vc.Blocked)
-	}
-	if vc.Direct != 0 {
-		t.Errorf("direct cnt for %s after 1 blocked visit should be 0, got: %d\n", g1.Host, vc.Direct)
-	}
-	if vc.AsDirect() {
-		t.Errorf("after blocked visit, a site should not be considered as direct\n")
-	}
-
-	// test blocked visit
-	g4, _ := ParseRequestURI("plus.gtemp.com")
-	si := ss.GetVisitCnt(g4)
-	ss.TempBlocked(g4)
-	// should be blocked for 2 minutes
-	if !si.AsTempBlocked() {
-		t.Error("should be blocked for 2 minutes after blocked visit")
-	}
-	si.BlockedVisit() // After temp blocked, update blocked visit count
-	if si.Blocked != 1 {
-		t.Errorf("blocked cnt for %s not correct, should be 1, got: %d\n", g4.Host, vc.Blocked)
-	}
-	vc = ss.get(g4.Host)
-	if vc == nil {
-		t.Fatal("no VisitCnt for ", g4.Host)
-	}
-	if vc.Direct != 0 {
-		t.Errorf("direct cnt for %s not correct, should be 0, got: %d\n", g4.Host, vc.Direct)
-	}
-	if !ss.hasBlockedHost[g4.Domain] {
-		t.Errorf("direct domain %s should have blocked host after blocked visit\n", g4.Domain)
-	}
-}
-
-func TestSiteStatGetVisitCnt(t *testing.T) {
-	ss := newSiteStat()
-
-	g, _ := ParseRequestURI("gtemp.com")
-	si := ss.GetVisitCnt(g)
-	if !si.AsDirect() {
-		t.Error("never visited site should be considered as direct")
-	}
-	if si.AsBlocked() || si.AsTempBlocked() {
-		t.Error("never visited site should not be considered as blocked/temp blocked")
-	}
-	si.DirectVisit()
-	gw, _ := ParseRequestURI("www.gtemp.com")
-	sig := ss.GetVisitCnt(gw)
-	// gtemp.com is not user specified, www.gtemp.com should get separate visitCnt
-	if sig == si {
-		t.Error("host should get separate visitCnt for not user specified domain")
-	}
-
-	b, _ := ParseRequestURI("www.btemp.com")
-	ss.Vcnt[b.Host] = newVisitCnt(userCnt, 0)
-	vc := ss.get(b.Host)
-	if !vc.userSpecified() {
-		t.Error("should be user specified")
-	}
-	if !vc.shouldNotSave() {
-		t.Error("user specified should be dropped")
-	}
-	si = ss.GetVisitCnt(b)
-	if !si.AlwaysDirect() {
-		t.Errorf("%s should alwaysDirect\n", b.Host)
-	}
-	if si.AlwaysBlocked() {
-		t.Errorf("%s should not alwaysBlocked\n", b.Host)
-	}
-	if si.OnceBlocked() {
-		t.Errorf("%s should not onceBlocked\n", b.Host)
-	}
-	if !si.AsDirect() {
-		t.Errorf("%s should use direct visit\n", b.Host)
-	}
-
-	tw, _ := ParseRequestURI("www.tblocked.com")
-	ss.Vcnt[tw.Domain] = newVisitCnt(0, userCnt)
-	si = ss.GetVisitCnt(tw)
-	if !si.AsBlocked() {
-		t.Errorf("%s should use blocked visit\n", tw.Host)
-	}
-	if si.AlwaysDirect() {
-		t.Errorf("%s should not alwaysDirect\n", tw.Host)
-	}
-	if !si.AlwaysBlocked() {
-		t.Errorf("%s should not alwaysBlocked\n", tw.Host)
-	}
-	if !si.OnceBlocked() {
-		t.Errorf("%s should onceBlocked\n", tw.Host)
-	}
-
-	g1, _ := ParseRequestURI("www.shoulddirect.com")
-	for i := 0; i < directDelta; i++ {
-		si.DirectVisit()
-	}
-	si = ss.GetVisitCnt(g1)
-	if !si.AsDirect() {
-		t.Errorf("%s direct %d times, should use direct visit\n", g1.Host, directDelta+1)
-	}
-	if si.OnceBlocked() {
-		t.Errorf("%s has not blocked visit, should not has once blocked\n", g1.Host)
-	}
-	si = ss.GetVisitCnt(g1)
-	si.BlockedVisit()
-	if !si.OnceBlocked() {
-		t.Errorf("%s has one blocked visit, should has once blocked\n", g1.Host)
-	}
-}
diff --git a/util.go b/util.go
index 1b900a32..077dbe9c 100644
--- a/util.go
+++ b/util.go
@@ -3,9 +3,9 @@ package main
 import (
 	"bytes"
 	"crypto/md5"
+	"encoding/binary"
 	"errors"
 	"fmt"
-	"github.com/cyfdecyf/bufio"
 	"io"
 	"net"
 	"os"
@@ -13,6 +13,8 @@ import (
 	"runtime"
 	"strconv"
 	"strings"
+
+	"github.com/cyfdecyf/bufio"
 )
 
 const isWindows = runtime.GOOS == "windows"
@@ -20,7 +22,7 @@ const isWindows = runtime.GOOS == "windows"
 type notification chan byte
 
 func newNotification() notification {
-	// Notification channle has size 1, so sending a single one will not block
+	// Notification channel has size 1, so sending a single one will not block
 	return make(chan byte, 1)
 }
 
@@ -205,32 +207,26 @@ func ParseIntFromBytes(b []byte, base int) (n int64, err error) {
 	return
 }
 
-func isFileExists(path string) (bool, error) {
+func isFileExists(path string) error {
 	stat, err := os.Stat(path)
-	if err == nil {
-		if stat.Mode()&os.ModeType == 0 {
-			return true, nil
-		}
-		return false, errors.New(path + " exists but is not regular file")
+	if err != nil {
+		return err
 	}
-	if os.IsNotExist(err) {
-		return false, nil
+	if !stat.Mode().IsRegular() {
+		return fmt.Errorf("%s is not regular file", path)
 	}
-	return false, err
+	return nil
 }
 
-func isDirExists(path string) (bool, error) {
+func isDirExists(path string) error {
 	stat, err := os.Stat(path)
-	if err == nil {
-		if stat.IsDir() {
-			return true, nil
-		}
-		return false, errors.New(path + " exists but is not directory")
+	if err != nil {
+		return err
 	}
-	if os.IsNotExist(err) {
-		return false, nil
+	if !stat.IsDir() {
+		return fmt.Errorf("%s is not directory", path)
 	}
-	return false, err
+	return nil
 }
 
 func getUserHomeDir() string {
@@ -286,67 +282,6 @@ func copyN(dst io.Writer, src *bufio.Reader, n, rdSize int) (err error) {
 	return err
 }
 
-// copyNWithBuf copys N bytes from src to dst, using the specified buf as buffer. pre and
-// end are written to w before and after the n bytes. copyN will try to
-// minimize number of writes.
-// No longer used now.
-func copyNWithBuf(dst io.Writer, src io.Reader, n int, buf, pre, end []byte) (err error) {
-	// XXX well, this is complicated in order to save writes
-	var nn int
-	bufLen := len(buf)
-	var b []byte
-	for n != 0 {
-		if pre != nil {
-			if len(pre) >= bufLen {
-				// pre is larger than bufLen, can't save write operation here
-				if _, err = dst.Write(pre); err != nil {
-					return
-				}
-				pre = nil
-				continue
-			}
-			// append pre to buf to save one write
-			copy(buf, pre)
-			if len(pre)+n < bufLen {
-				// only need to read n bytes
-				b = buf[len(pre) : len(pre)+n]
-			} else {
-				b = buf[len(pre):]
-			}
-		} else {
-			if n < bufLen {
-				b = buf[:n]
-			} else {
-				b = buf
-			}
-		}
-		if nn, err = src.Read(b); err != nil {
-			return
-		}
-		n -= nn
-		if pre != nil {
-			// nn is how much we need to write next
-			nn += len(pre)
-			pre = nil
-		}
-		// see if we can append end in buffer to save one write
-		if n == 0 && end != nil && nn+len(end) <= bufLen {
-			copy(buf[nn:], end)
-			nn += len(end)
-			end = nil
-		}
-		if _, err = dst.Write(buf[:nn]); err != nil {
-			return
-		}
-	}
-	if end != nil {
-		if _, err = dst.Write(end); err != nil {
-			return
-		}
-	}
-	return
-}
-
 func md5sum(ss ...string) string {
 	h := md5.New()
 	for _, s := range ss {
@@ -401,16 +336,6 @@ func NewNbitIPv4Mask(n int) net.IPMask {
 	return net.IPMask(mask)
 }
 
-var topLevelDomain = map[string]bool{
-	"ac":  true,
-	"co":  true,
-	"com": true,
-	"edu": true,
-	"gov": true,
-	"net": true,
-	"org": true,
-}
-
 func trimLastDot(s string) string {
 	if len(s) > 0 && s[len(s)-1] == '.' {
 		return s[:len(s)-1]
@@ -439,29 +364,9 @@ func host2Domain(host string) (domain string) {
 		return host
 	}
 
-	part := host[dot2ndLast+1 : lastDot]
-	// If the 2nd last part of a domain name equals to a top level
-	// domain, search for the 3rd part in the host name.
-	// So domains like bbc.co.uk will not be recorded as co.uk
-	if topLevelDomain[part] {
-		dot3rdLast := strings.LastIndex(host[:dot2ndLast], ".")
-		if dot3rdLast == -1 {
-			return host
-		}
-		return host[dot3rdLast+1:]
-	}
 	return host[dot2ndLast+1:]
 }
 
-// djb2 string hash function, from http://www.cse.yorku.ca/~oz/hash.html
-func stringHash(s string) (hash uint64) {
-	hash = 5381
-	for i := 0; i < len(s); i++ {
-		hash = ((hash << 5) + 1) + uint64(s[i])
-	}
-	return
-}
-
 // IgnoreUTF8BOM consumes UTF-8 encoded BOM character if present in the file.
 func IgnoreUTF8BOM(f *os.File) error {
 	bom := make([]byte, 3)
@@ -498,3 +403,31 @@ func hostAddr() (addr []string) {
 	}
 	return addr
 }
+
+// ip to long int
+func ip2long(ipstr string) (uint32, error) {
+	ip := net.ParseIP(ipstr)
+	if ip == nil {
+		return 0, errors.New("Invalid IP")
+	}
+	ip = ip.To4()
+	if ip == nil {
+		return 0, errors.New("Not IPv4")
+	}
+	return binary.BigEndian.Uint32(ip), nil
+}
+
+// search between [start, end]
+func searchRange(start, end int, f func(int) bool) int {
+	i, j := start, end+1
+	for i < j {
+		h := i + (j-i)/2 // avoid overflow when computing h
+		// i ≤ h < j
+		if !f(h) {
+			i = h + 1 // preserves f(i-1) == false
+		} else {
+			j = h // preserves f(j) == true
+		}
+	}
+	return i
+}
diff --git a/util_test.go b/util_test.go
index 3946f4d3..a9834bb2 100644
--- a/util_test.go
+++ b/util_test.go
@@ -3,9 +3,10 @@ package main
 import (
 	"bytes"
 	"errors"
-	"github.com/cyfdecyf/bufio"
 	"strings"
 	"testing"
+
+	"github.com/cyfdecyf/bufio"
 )
 
 func TestASCIIToUpper(t *testing.T) {
@@ -201,81 +202,18 @@ func TestCopyN(t *testing.T) {
 	}
 }
 
-func TestCopyNWithBuf(t *testing.T) {
-	testStr := "hello world"
-	src := bytes.NewBufferString(testStr)
-	dst := new(bytes.Buffer)
-	buf := make([]byte, 5)
-
-	copyNWithBuf(dst, src, len(testStr), buf, nil, nil)
-	if dst.String() != "hello world" {
-		t.Error("copy without pre and end failed, got:", dst.String())
-	}
-
-	src.Reset()
-	dst.Reset()
-	src.WriteString(testStr)
-	copyNWithBuf(dst, src, len(testStr), buf, []byte("by cyf "), nil)
-	if dst.String() != "by cyf hello world" {
-		t.Error("copy with pre no end failed, got:", dst.String())
-	}
-
-	src.Reset()
-	dst.Reset()
-	src.WriteString(testStr)
-	copyNWithBuf(dst, src, len(testStr), buf, []byte("by cyf "), []byte(" welcome"))
-	if dst.String() != "by cyf hello world welcome" {
-		t.Error("copy with both pre and end failed, got:", dst.String())
-	}
-
-	src.Reset()
-	dst.Reset()
-	src.WriteString(testStr)
-	copyNWithBuf(dst, src, len(testStr), buf, []byte("pre longer then buffer "), []byte(" welcome"))
-	if dst.String() != "pre longer then buffer hello world welcome" {
-		t.Error("copy with long pre failed, got:", dst.String())
-	}
-
-	src.Reset()
-	dst.Reset()
-	testStr = "34"
-	src.WriteString(testStr)
-	copyNWithBuf(dst, src, len(testStr), buf, []byte("12"), []byte(" welcome"))
-	if dst.String() != "1234 welcome" {
-		t.Error("copy len(pre)+size<bufLen failed, got:", dst.String())
-	}
-
-	src.Reset()
-	dst.Reset()
-	testStr = "2"
-	src.WriteString(testStr)
-	copyNWithBuf(dst, src, len(testStr), buf, []byte("1"), []byte("34"))
-	if dst.String() != "1234" {
-		t.Error("copy len(pre)+size+len(end)<bufLen failed, got:", dst.String())
-	}
-}
-
 func TestIsFileExists(t *testing.T) {
-	exists, err := isFileExists("testdata")
+	err := isFileExists("testdata")
 	if err == nil {
 		t.Error("should return error is path is directory")
 	}
-	if exists {
-		t.Error("directory should return false")
-	}
 
-	exists, err = isFileExists("testdata/none")
-	if exists {
-		t.Error("BOOM! You've found a non-existing file!")
-	}
-	if err != nil {
-		t.Error("Not existing file should just return false, on error")
+	err = isFileExists("testdata/none")
+	if err == nil {
+		t.Error("Not existing file should return error")
 	}
 
-	exists, err = isFileExists("testdata/file")
-	if !exists {
-		t.Error("testdata/file exists, but returns false")
-	}
+	err = isFileExists("testdata/file")
 	if err != nil {
 		t.Error("Why error for existing file?")
 	}
@@ -314,9 +252,9 @@ func TestHost2Domain(t *testing.T) {
 		{"www.google.com", "google.com"},
 		{"google.com", "google.com"},
 		{"com.cn", "com.cn"},
-		{"sina.com.cn", "sina.com.cn"},
-		{"www.bbc.co.uk", "bbc.co.uk"},
-		{"apple.com.cn", "apple.com.cn"},
+		{"sina.com.cn", "com.cn"},
+		{"www.bbc.co.uk", "co.uk"},
+		{"apple.com.cn", "com.cn"},
 		{"simplehost", ""},
 		{"192.168.1.1", ""},
 		{"10.2.1.1", ""},